raggrep 0.1.5 → 0.1.6
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 +23 -9
- package/dist/cli/main.js +2479 -1627
- package/dist/cli/main.js.map +18 -12
- package/dist/index.js +2588 -1733
- package/dist/index.js.map +18 -12
- package/dist/infrastructure/config/configLoader.d.ts +22 -3
- package/dist/infrastructure/config/index.d.ts +1 -1
- package/dist/introspection/conventions/configFiles.d.ts +10 -0
- package/dist/introspection/conventions/conventions.test.d.ts +4 -0
- package/dist/introspection/conventions/entryPoints.d.ts +10 -0
- package/dist/introspection/conventions/frameworks/convex.d.ts +11 -0
- package/dist/introspection/conventions/frameworks/index.d.ts +22 -0
- package/dist/introspection/conventions/frameworks/nextjs.d.ts +10 -0
- package/dist/introspection/conventions/index.d.ts +39 -0
- package/dist/introspection/conventions/types.d.ts +62 -0
- package/dist/tests/integration.test.d.ts +9 -0
- package/package.json +1 -1
package/dist/cli/main.js.map
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/infrastructure/embeddings/transformersEmbedding.ts", "../../src/infrastructure/embeddings/index.ts", "../../src/domain/entities/config.ts", "../../src/domain/entities/index.ts", "../../src/infrastructure/config/configLoader.ts", "../../src/infrastructure/config/index.ts", "../../src/domain/services/bm25.ts", "../../src/
|
|
3
|
+
"sources": ["../../src/infrastructure/embeddings/transformersEmbedding.ts", "../../src/infrastructure/embeddings/index.ts", "../../src/domain/entities/config.ts", "../../src/domain/entities/index.ts", "../../src/infrastructure/config/configLoader.ts", "../../src/infrastructure/config/index.ts", "../../src/domain/services/bm25.ts", "../../src/introspection/projectDetector.ts", "../../src/introspection/conventions/entryPoints.ts", "../../src/introspection/conventions/configFiles.ts", "../../src/introspection/conventions/frameworks/nextjs.ts", "../../src/introspection/conventions/frameworks/convex.ts", "../../src/introspection/conventions/frameworks/index.ts", "../../src/introspection/conventions/index.ts", "../../src/introspection/fileIntrospector.ts", "../../src/introspection/index.ts", "../../src/modules/core/symbols.ts", "../../src/modules/core/index.ts", "../../src/domain/services/similarity.ts", "../../src/modules/language/typescript/parseCode.ts", "../../src/infrastructure/storage/fileIndexStorage.ts", "../../src/domain/services/keywords.ts", "../../src/infrastructure/storage/symbolicIndex.ts", "../../src/infrastructure/storage/index.ts", "../../src/modules/language/typescript/index.ts", "../../src/modules/registry.ts", "../../src/app/indexer/watcher.ts", "../../src/app/indexer/index.ts", "../../src/app/search/index.ts", "../../src/app/cli/main.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Transformers.js Embedding Adapter\n * \n * Implements the EmbeddingProvider port using Transformers.js for local embeddings.\n * Models are automatically downloaded and cached on first use.\n */\n\nimport { pipeline, env, type FeatureExtractionPipeline } from '@xenova/transformers';\nimport * as path from 'path';\nimport * as os from 'os';\nimport type { EmbeddingProvider, EmbeddingConfig, EmbeddingModelName } from '../../domain/ports';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/** Cache directory for models */\nconst CACHE_DIR = path.join(os.homedir(), '.cache', 'raggrep', 'models');\n\n// Set the cache directory for transformers.js\nenv.cacheDir = CACHE_DIR;\nenv.allowLocalModels = true;\n\n/** Available embedding models and their Hugging Face IDs */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n 'all-MiniLM-L6-v2': 'Xenova/all-MiniLM-L6-v2',\n 'all-MiniLM-L12-v2': 'Xenova/all-MiniLM-L12-v2',\n 'bge-small-en-v1.5': 'Xenova/bge-small-en-v1.5',\n 'paraphrase-MiniLM-L3-v2': 'Xenova/paraphrase-MiniLM-L3-v2',\n};\n\n/** Embedding dimension for all MiniLM models */\nconst EMBEDDING_DIMENSION = 384;\n\n/** Maximum texts per batch */\nconst BATCH_SIZE = 32;\n\n// ============================================================================\n// Transformers.js Embedding Provider\n// ============================================================================\n\n/**\n * Embedding provider using Transformers.js (local inference).\n */\nexport class TransformersEmbeddingProvider implements EmbeddingProvider {\n private pipeline: FeatureExtractionPipeline | null = null;\n private config: EmbeddingConfig;\n private isInitializing = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config?: Partial<EmbeddingConfig>) {\n this.config = {\n model: config?.model ?? 'all-MiniLM-L6-v2',\n showProgress: config?.showProgress ?? true,\n };\n }\n\n async initialize(config?: EmbeddingConfig): Promise<void> {\n if (config) {\n // If model changed, reset pipeline\n if (config.model !== this.config.model) {\n this.pipeline = null;\n }\n this.config = { ...this.config, ...config };\n }\n \n await this.ensurePipeline();\n }\n\n private async ensurePipeline(): Promise<void> {\n if (this.pipeline) {\n return;\n }\n \n // Prevent multiple simultaneous initializations\n if (this.isInitializing && this.initPromise) {\n return this.initPromise;\n }\n \n this.isInitializing = true;\n \n this.initPromise = (async () => {\n const modelId = EMBEDDING_MODELS[this.config.model];\n \n if (this.config.showProgress) {\n console.log(`\\n Loading embedding model: ${this.config.model}`);\n console.log(` Cache: ${CACHE_DIR}`);\n }\n \n try {\n this.pipeline = await pipeline('feature-extraction', modelId, {\n progress_callback: this.config.showProgress \n ? (progress: { status: string; file?: string; progress?: number }) => {\n if (progress.status === 'progress' && progress.file) {\n const pct = progress.progress ? Math.round(progress.progress) : 0;\n process.stdout.write(`\\r Downloading ${progress.file}: ${pct}% `);\n } else if (progress.status === 'done' && progress.file) {\n process.stdout.write(`\\r Downloaded ${progress.file} \\n`);\n }\n }\n : undefined,\n });\n \n if (this.config.showProgress) {\n console.log(` Model ready.\\n`);\n }\n } catch (error) {\n this.pipeline = null;\n throw new Error(`Failed to load embedding model: ${error}`);\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n })();\n \n return this.initPromise;\n }\n\n async getEmbedding(text: string): Promise<number[]> {\n await this.ensurePipeline();\n \n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n \n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true,\n });\n \n return Array.from(output.data as Float32Array);\n }\n\n async getEmbeddings(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n \n await this.ensurePipeline();\n \n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n \n const results: number[][] = [];\n \n // Process in batches\n for (let i = 0; i < texts.length; i += BATCH_SIZE) {\n const batch = texts.slice(i, i + BATCH_SIZE);\n \n const outputs = await Promise.all(\n batch.map(async (text) => {\n const output = await this.pipeline!(text, {\n pooling: 'mean',\n normalize: true,\n });\n return Array.from(output.data as Float32Array);\n })\n );\n \n results.push(...outputs);\n }\n \n return results;\n }\n\n getDimension(): number {\n return EMBEDDING_DIMENSION;\n }\n\n getModelName(): string {\n return this.config.model;\n }\n\n async dispose(): Promise<void> {\n this.pipeline = null;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCacheDir(): string {\n return CACHE_DIR;\n}\n\n/**\n * Check if a model is already cached\n */\nexport async function isModelCached(model: EmbeddingModelName): Promise<boolean> {\n const modelId = EMBEDDING_MODELS[model];\n const modelPath = path.join(CACHE_DIR, modelId.replace('/', '--'));\n \n try {\n const fs = await import('fs/promises');\n await fs.access(modelPath);\n return true;\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// Global Embedding API (convenience functions)\n// ============================================================================\n\n/** Global provider instance for convenience functions */\nlet globalProvider: TransformersEmbeddingProvider | null = null;\nlet globalConfig: EmbeddingConfig = {\n model: 'all-MiniLM-L6-v2',\n showProgress: true,\n};\n\n/**\n * Configure the global embedding provider.\n */\nexport function configureEmbeddings(config: Partial<EmbeddingConfig>): void {\n const newConfig = { ...globalConfig, ...config };\n \n // If model changed, reset provider\n if (newConfig.model !== globalConfig.model) {\n globalProvider = null;\n }\n \n globalConfig = newConfig as EmbeddingConfig;\n}\n\n/**\n * Get current embedding configuration.\n */\nexport function getEmbeddingConfig(): EmbeddingConfig {\n return { ...globalConfig };\n}\n\n/**\n * Ensure the global provider is initialized.\n */\nasync function ensureGlobalProvider(): Promise<TransformersEmbeddingProvider> {\n if (!globalProvider) {\n globalProvider = new TransformersEmbeddingProvider(globalConfig);\n await globalProvider.initialize();\n }\n return globalProvider;\n}\n\n/**\n * Get embedding for a single text using the global provider.\n */\nexport async function getEmbedding(text: string): Promise<number[]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbedding(text);\n}\n\n/**\n * Get embeddings for multiple texts using the global provider.\n */\nexport async function getEmbeddings(texts: string[]): Promise<number[][]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbeddings(texts);\n}\n\n",
|
|
6
6
|
"/**\n * Embedding Infrastructure\n *\n * Provides embedding generation using Transformers.js.\n */\n\nexport {\n // Class-based API\n TransformersEmbeddingProvider,\n // Constants\n EMBEDDING_MODELS,\n // Utilities\n getCacheDir,\n isModelCached,\n // Global API (convenience functions)\n configureEmbeddings,\n getEmbeddingConfig,\n getEmbedding,\n getEmbeddings,\n} from \"./transformersEmbedding\";\n\n",
|
|
7
|
-
"/**\n * Config Entity\n *\n * Configuration for RAGgrep indexing and search operations.\n */\n\n/**\n * Configuration for a specific index module.\n */\nexport interface ModuleConfig {\n /** Unique module identifier */\n id: string;\n\n /** Whether the module is enabled */\n enabled: boolean;\n\n /** Module-specific options */\n options?: Record<string, unknown>;\n}\n\n/**\n * Main RAGgrep configuration.\n */\nexport interface Config {\n /** RAGgrep version */\n version: string;\n\n /** Directory name for index storage (default: '.raggrep') */\n indexDir: string;\n\n /** File extensions to index (e.g., ['.ts', '.tsx', '.js']) */\n extensions: string[];\n\n /** Paths to ignore during indexing */\n ignorePaths: string[];\n\n /** Enabled modules and their configurations */\n modules: ModuleConfig[];\n}\n\n/**\n * Default paths to ignore during indexing.\n */\nexport const DEFAULT_IGNORE_PATHS = [\n // Package managers & dependencies\n \"node_modules\",\n \".pnpm-store\",\n \".yarn\",\n \"vendor\",\n\n // Version control\n \".git\",\n\n // Build outputs\n \"dist\",\n \"build\",\n \"out\",\n \".output\",\n \"target\",\n\n // Framework-specific build outputs\n \".next\",\n \".nuxt\",\n \".svelte-kit\",\n \".vercel\",\n \".netlify\",\n\n // Caches\n \".cache\",\n \".turbo\",\n \".parcel-cache\",\n \".eslintcache\",\n\n // Test & coverage\n \"coverage\",\n \".nyc_output\",\n\n // Python\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".pytest_cache\",\n \"*.egg-info\",\n\n // IDE & editor\n \".idea\",\n\n // RAGgrep index\n \".raggrep\",\n];\n\n/**\n * Default file extensions to index.\n */\nexport const DEFAULT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n \".md\",\n];\n\n/**\n * Create a default configuration.\n */\nexport function createDefaultConfig(): Config {\n return {\n version: \"0.1.0\",\n indexDir: \".raggrep\",\n extensions: DEFAULT_EXTENSIONS,\n ignorePaths: DEFAULT_IGNORE_PATHS,\n modules: [\n {\n id: \"core\",\n enabled: true,\n options: {},\n },\n {\n id: \"language/typescript\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n ],\n };\n}\n",
|
|
7
|
+
"/**\n * Config Entity\n *\n * Configuration for RAGgrep indexing and search operations.\n */\n\n/**\n * Configuration for a specific index module.\n */\nexport interface ModuleConfig {\n /** Unique module identifier */\n id: string;\n\n /** Whether the module is enabled */\n enabled: boolean;\n\n /** Module-specific options */\n options?: Record<string, unknown>;\n}\n\n/**\n * Main RAGgrep configuration.\n */\nexport interface Config {\n /** RAGgrep version */\n version: string;\n\n /** Directory name for index storage (default: '.raggrep') */\n indexDir: string;\n\n /** File extensions to index (e.g., ['.ts', '.tsx', '.js']) */\n extensions: string[];\n\n /** Paths to ignore during indexing */\n ignorePaths: string[];\n\n /** Enabled modules and their configurations */\n modules: ModuleConfig[];\n}\n\n/**\n * Default paths to ignore during indexing.\n */\nexport const DEFAULT_IGNORE_PATHS = [\n // Package managers & dependencies\n \"node_modules\",\n \".pnpm-store\",\n \".yarn\",\n \"vendor\",\n\n // Version control\n \".git\",\n\n // Build outputs\n \"dist\",\n \"build\",\n \"out\",\n \".output\",\n \"target\",\n\n // Framework-specific build outputs\n \".next\",\n \".nuxt\",\n \".svelte-kit\",\n \".vercel\",\n \".netlify\",\n\n // Caches\n \".cache\",\n \".turbo\",\n \".parcel-cache\",\n \".eslintcache\",\n\n // Test & coverage\n \"coverage\",\n \".nyc_output\",\n\n // Python\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".pytest_cache\",\n \"*.egg-info\",\n\n // IDE & editor\n \".idea\",\n\n // RAGgrep index\n \".raggrep\",\n];\n\n/**\n * Default file extensions to index.\n */\nexport const DEFAULT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n \".md\",\n \".txt\",\n];\n\n/**\n * Create a default configuration.\n */\nexport function createDefaultConfig(): Config {\n return {\n version: \"0.1.0\",\n indexDir: \".raggrep\",\n extensions: DEFAULT_EXTENSIONS,\n ignorePaths: DEFAULT_IGNORE_PATHS,\n modules: [\n {\n id: \"core\",\n enabled: true,\n options: {},\n },\n {\n id: \"language/typescript\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n ],\n };\n}\n",
|
|
8
8
|
"/**\n * Domain Entities\n *\n * Core business objects with no external dependencies.\n * These represent the fundamental concepts in the RAGgrep domain.\n */\n\n// Chunk - The fundamental unit of indexing\nexport type { Chunk, ChunkType } from \"./chunk\";\nexport { createChunkId } from \"./chunk\";\n\n// FileIndex - Tier 2 full index data\nexport type {\n FileIndex,\n FileManifestEntry,\n ModuleManifest,\n GlobalManifest,\n} from \"./fileIndex\";\n\n// FileSummary - Symbolic index (lightweight summaries)\nexport type {\n FileSummary,\n SymbolicIndexMeta,\n Tier1Manifest,\n} from \"./fileSummary\";\n\n// SearchResult - Query results\nexport type {\n SearchResult,\n SearchOptions,\n SearchContributions,\n CoreContribution,\n LanguageContribution,\n IntrospectionContribution,\n} from \"./searchResult\";\nexport { DEFAULT_SEARCH_OPTIONS } from \"./searchResult\";\n\n// Config - Application configuration\nexport type { Config, ModuleConfig } from \"./config\";\nexport {\n DEFAULT_IGNORE_PATHS,\n DEFAULT_EXTENSIONS,\n createDefaultConfig,\n} from \"./config\";\n",
|
|
9
|
-
"/**\n * Configuration Loader\n *\n * Infrastructure adapter for loading and saving RAGgrep configuration.\n * Handles file I/O operations for configuration management.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type { Config, ModuleConfig } from \"../../domain/entities\";\nimport { createDefaultConfig } from \"../../domain/entities\";\nimport type { EmbeddingConfig, EmbeddingModelName } from \"../../domain/ports\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default configuration instance */\nexport const DEFAULT_CONFIG: Config = createDefaultConfig();\n\n/** Available embedding models (for validation) */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n};\n\n// ============================================================================\n// Path Utilities (pure functions)\n// ============================================================================\n\n/**\n * Get the
|
|
10
|
-
"/**\n * Configuration Infrastructure\n *\n * Handles loading and saving RAGgrep configuration from the filesystem.\n */\n\nexport {\n // Constants\n DEFAULT_CONFIG,\n EMBEDDING_MODELS,\n // Path utilities\n getRaggrepDir,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getConfigPath,\n // I/O operations\n loadConfig,\n saveConfig,\n // Config utilities\n getModuleConfig,\n getEmbeddingConfigFromModule,\n} from \"./configLoader\";\n\n",
|
|
9
|
+
"/**\n * Configuration Loader\n *\n * Infrastructure adapter for loading and saving RAGgrep configuration.\n * Handles file I/O operations for configuration management.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as os from \"os\";\nimport * as crypto from \"crypto\";\nimport type { Config, ModuleConfig } from \"../../domain/entities\";\nimport { createDefaultConfig } from \"../../domain/entities\";\nimport type { EmbeddingConfig, EmbeddingModelName } from \"../../domain/ports\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default configuration instance */\nexport const DEFAULT_CONFIG: Config = createDefaultConfig();\n\n/** Base directory for raggrep temp indexes */\nconst RAGGREP_TEMP_BASE = path.join(os.tmpdir(), \"raggrep-indexes\");\n\n/** Available embedding models (for validation) */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n};\n\n// ============================================================================\n// Path Utilities (pure functions)\n// ============================================================================\n\n/**\n * Generate a short hash of a string for use in directory names.\n * Uses first 12 characters of SHA256 hash.\n */\nfunction hashPath(inputPath: string): string {\n return crypto.createHash(\"sha256\").update(inputPath).digest(\"hex\").slice(0, 12);\n}\n\n/**\n * Get the index storage directory path.\n * \n * Index data is stored in a system temp directory to avoid cluttering\n * the user's project with index files. The temp path is derived from\n * a hash of the project's absolute path to ensure uniqueness.\n * \n * Structure: {tmpdir}/raggrep-indexes/{hash}/\n * \n * @param rootDir - Absolute path to the project root\n * @returns Absolute path to the index storage directory\n */\nexport function getRaggrepDir(\n rootDir: string,\n _config: Config = DEFAULT_CONFIG\n): string {\n // Ensure we have an absolute path\n const absoluteRoot = path.resolve(rootDir);\n \n // Generate a unique hash for this project\n const projectHash = hashPath(absoluteRoot);\n \n // Return the temp directory path\n return path.join(RAGGREP_TEMP_BASE, projectHash);\n}\n\n/**\n * Get the index storage path and also return useful metadata.\n * Helpful for debugging and user feedback.\n */\nexport function getIndexLocation(rootDir: string): {\n indexDir: string;\n projectRoot: string;\n projectHash: string;\n} {\n const absoluteRoot = path.resolve(rootDir);\n const projectHash = hashPath(absoluteRoot);\n \n return {\n indexDir: path.join(RAGGREP_TEMP_BASE, projectHash),\n projectRoot: absoluteRoot,\n projectHash,\n };\n}\n\n/**\n * Get the index data directory for a specific module\n */\nexport function getModuleIndexPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId);\n}\n\n/**\n * Get the manifest path for a specific module\n */\nexport function getModuleManifestPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId, \"manifest.json\");\n}\n\n/**\n * Get the global manifest path\n */\nexport function getGlobalManifestPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"manifest.json\");\n}\n\n/**\n * Get the config file path.\n * Note: Config is still stored in the temp index directory, not the project.\n */\nexport function getConfigPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"config.json\");\n}\n\n// ============================================================================\n// Config I/O (infrastructure)\n// ============================================================================\n\n/**\n * Load config from file or return default\n */\nexport async function loadConfig(rootDir: string): Promise<Config> {\n const configPath = getConfigPath(rootDir, DEFAULT_CONFIG);\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const savedConfig = JSON.parse(content) as Partial<Config>;\n return { ...DEFAULT_CONFIG, ...savedConfig };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\n/**\n * Save config to file\n */\nexport async function saveConfig(\n rootDir: string,\n config: Config\n): Promise<void> {\n const configPath = getConfigPath(rootDir, config);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2));\n}\n\n// ============================================================================\n// Config Utilities (pure functions)\n// ============================================================================\n\n/**\n * Get module config by ID\n */\nexport function getModuleConfig(\n config: Config,\n moduleId: string\n): ModuleConfig | undefined {\n return config.modules.find((m) => m.id === moduleId);\n}\n\n/**\n * Extract embedding config from module options\n */\nexport function getEmbeddingConfigFromModule(\n moduleConfig: ModuleConfig\n): EmbeddingConfig {\n const options = moduleConfig.options || {};\n const modelName = (options.embeddingModel as string) || \"all-MiniLM-L6-v2\";\n\n // Validate model name\n if (!(modelName in EMBEDDING_MODELS)) {\n console.warn(\n `Unknown embedding model: ${modelName}, falling back to all-MiniLM-L6-v2`\n );\n return { model: \"all-MiniLM-L6-v2\" };\n }\n\n return {\n model: modelName as EmbeddingModelName,\n showProgress: options.showProgress !== false,\n };\n}\n\n",
|
|
10
|
+
"/**\n * Configuration Infrastructure\n *\n * Handles loading and saving RAGgrep configuration from the filesystem.\n */\n\nexport {\n // Constants\n DEFAULT_CONFIG,\n EMBEDDING_MODELS,\n // Path utilities\n getRaggrepDir,\n getIndexLocation,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getConfigPath,\n // I/O operations\n loadConfig,\n saveConfig,\n // Config utilities\n getModuleConfig,\n getEmbeddingConfigFromModule,\n} from \"./configLoader\";\n\n",
|
|
11
11
|
"/**\n * BM25 (Best Matching 25) Implementation\n * \n * A ranking function for keyword-based search. This is a pure domain service\n * with no external dependencies - just algorithms operating on data.\n * \n * BM25 estimates relevance of documents to a search query using term frequency\n * and inverse document frequency with length normalization.\n */\n\n/**\n * BM25 parameters\n * - k1: Term frequency saturation (typical: 1.2-2.0)\n * - b: Length normalization (typical: 0.75)\n */\nconst BM25_K1 = 1.5;\nconst BM25_B = 0.75;\n\n/**\n * Tokenize text into normalized terms.\n * \n * @param text - Text to tokenize\n * @returns Array of lowercase tokens\n */\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(token => token.length > 1);\n}\n\n/**\n * Calculate term frequency (TF) for a term in a document.\n */\nfunction termFrequency(term: string, tokens: string[]): number {\n return tokens.filter(t => t === term).length;\n}\n\n/**\n * Document data for BM25 scoring.\n */\nexport interface BM25Document {\n id: string;\n content: string;\n /** Pre-computed tokens (optional, computed from content if not provided) */\n tokens?: string[];\n}\n\n/**\n * BM25 search result.\n */\nexport interface BM25Result {\n id: string;\n score: number;\n}\n\n/**\n * BM25 search index.\n * \n * This is a pure in-memory data structure with no I/O operations.\n * Build the index by adding documents, then search against it.\n */\nexport class BM25Index {\n private documents: Map<string, { content: string; tokens: string[] }> = new Map();\n private avgDocLength: number = 0;\n private documentFrequencies: Map<string, number> = new Map();\n private totalDocs: number = 0;\n\n /**\n * Add documents to the index.\n * \n * @param documents - Array of documents to index\n */\n addDocuments(documents: BM25Document[]): void {\n let totalLength = this.avgDocLength * this.totalDocs;\n\n for (const doc of documents) {\n const tokens = doc.tokens ?? tokenize(doc.content);\n this.documents.set(doc.id, { content: doc.content, tokens });\n totalLength += tokens.length;\n this.totalDocs++;\n\n // Update document frequencies\n const uniqueTerms = new Set(tokens);\n for (const term of uniqueTerms) {\n const count = this.documentFrequencies.get(term) || 0;\n this.documentFrequencies.set(term, count + 1);\n }\n }\n\n this.avgDocLength = this.totalDocs > 0 ? totalLength / this.totalDocs : 0;\n }\n\n /**\n * Calculate IDF (Inverse Document Frequency) for a term.\n */\n private idf(term: string): number {\n const docFreq = this.documentFrequencies.get(term) || 0;\n if (docFreq === 0) return 0;\n \n // Standard IDF formula with smoothing\n return Math.log(1 + (this.totalDocs - docFreq + 0.5) / (docFreq + 0.5));\n }\n\n /**\n * Calculate BM25 score for a document given query terms.\n */\n private score(tokens: string[], queryTerms: string[]): number {\n const docLength = tokens.length;\n let score = 0;\n\n for (const term of queryTerms) {\n const tf = termFrequency(term, tokens);\n if (tf === 0) continue;\n\n const idfScore = this.idf(term);\n \n // BM25 formula\n const numerator = tf * (BM25_K1 + 1);\n const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (docLength / this.avgDocLength));\n \n score += idfScore * (numerator / denominator);\n }\n\n return score;\n }\n\n /**\n * Search the index with a query.\n * \n * @param query - Search query\n * @param topK - Maximum number of results to return\n * @returns Sorted array of results (highest score first)\n */\n search(query: string, topK: number = 10): BM25Result[] {\n const queryTerms = tokenize(query);\n if (queryTerms.length === 0) return [];\n\n const results: BM25Result[] = [];\n\n for (const [id, { tokens }] of this.documents) {\n const score = this.score(tokens, queryTerms);\n if (score > 0) {\n results.push({ id, score });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n /**\n * Get the number of indexed documents.\n */\n get size(): number {\n return this.totalDocs;\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.documents.clear();\n this.documentFrequencies.clear();\n this.avgDocLength = 0;\n this.totalDocs = 0;\n }\n\n /**\n * Add a single document by ID and pre-computed tokens.\n *\n * @param id - Document identifier\n * @param tokens - Pre-computed tokens\n */\n addDocument(id: string, tokens: string[]): void {\n this.addDocuments([{ id, content: \"\", tokens }]);\n }\n\n /**\n * Serialize the index to a JSON-compatible object.\n */\n serialize(): BM25SerializedData {\n const documents: Record<string, string[]> = {};\n for (const [id, { tokens }] of this.documents) {\n documents[id] = tokens;\n }\n\n return {\n documents,\n avgDocLength: this.avgDocLength,\n documentFrequencies: Object.fromEntries(this.documentFrequencies),\n totalDocs: this.totalDocs,\n };\n }\n\n /**\n * Deserialize a BM25 index from saved data.\n */\n static deserialize(data: BM25SerializedData): BM25Index {\n const index = new BM25Index();\n index.avgDocLength = data.avgDocLength;\n index.totalDocs = data.totalDocs;\n index.documentFrequencies = new Map(Object.entries(data.documentFrequencies));\n\n for (const [id, tokens] of Object.entries(data.documents)) {\n index.documents.set(id, { content: \"\", tokens });\n }\n\n return index;\n }\n}\n\n/**\n * Serialized BM25 index data.\n */\nexport interface BM25SerializedData {\n documents: Record<string, string[]>;\n avgDocLength: number;\n documentFrequencies: Record<string, number>;\n totalDocs: number;\n}\n\n/**\n * Normalize a raw score to 0-1 range using sigmoid function.\n * \n * @param score - Raw score\n * @param midpoint - Score at which output is 0.5\n * @returns Normalized score between 0 and 1\n */\nexport function normalizeScore(score: number, midpoint: number = 5): number {\n return 1 / (1 + Math.exp(-score / midpoint + 1));\n}\n\n",
|
|
12
|
+
"/**\n * Project Structure Detection\n *\n * Auto-detects monorepo structure and project types from:\n * - Folder layout (apps/, packages/, etc.)\n * - package.json files (for TypeScript/JavaScript projects)\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type { Project, ProjectType, ProjectStructure, Scope } from \"./types\";\n\n/** Maximum depth to scan for package.json files */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Directories to skip when scanning for package.json */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".raggrep\",\n]);\n\n/**\n * Patterns for detecting project directories.\n */\nconst PROJECT_PATTERNS: Array<{\n pattern: RegExp;\n type: ProjectType;\n defaultScope: Scope;\n}> = [\n // apps/ - typically frontend or backend apps\n { pattern: /^apps\\/([^/]+)/, type: \"app\", defaultScope: \"unknown\" },\n // packages/ - shared libraries\n { pattern: /^packages\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n // libs/ - shared libraries\n { pattern: /^libs\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n // services/ - backend services\n { pattern: /^services\\/([^/]+)/, type: \"service\", defaultScope: \"backend\" },\n // scripts/ - tooling\n { pattern: /^scripts\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n // tools/ - tooling\n { pattern: /^tools\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n];\n\n/**\n * Keywords for detecting scope from project name or path.\n */\nconst SCOPE_KEYWORDS: Record<Scope, string[]> = {\n frontend: [\n \"web\",\n \"webapp\",\n \"frontend\",\n \"client\",\n \"ui\",\n \"app\",\n \"mobile\",\n \"react\",\n \"vue\",\n \"angular\",\n \"next\",\n \"nuxt\",\n ],\n backend: [\n \"api\",\n \"server\",\n \"backend\",\n \"service\",\n \"worker\",\n \"lambda\",\n \"functions\",\n ],\n shared: [\"shared\", \"common\", \"utils\", \"lib\", \"core\", \"types\", \"models\"],\n tooling: [\n \"scripts\",\n \"tools\",\n \"cli\",\n \"devtools\",\n \"build\",\n \"config\",\n \"infra\",\n ],\n unknown: [],\n};\n\n/**\n * Detect scope from project name.\n */\nexport function detectScopeFromName(name: string): Scope {\n const nameLower = name.toLowerCase();\n\n for (const [scope, keywords] of Object.entries(SCOPE_KEYWORDS)) {\n if (scope === \"unknown\") continue;\n for (const keyword of keywords) {\n if (nameLower.includes(keyword)) {\n return scope as Scope;\n }\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Parsed information from a package.json file.\n */\ninterface PackageJsonInfo {\n name: string;\n relativePath: string;\n type: ProjectType;\n hasWorkspaces: boolean;\n}\n\n/**\n * Scan for package.json files and extract project info.\n */\nasync function scanForPackageJsons(\n rootDir: string,\n currentDir: string = \"\",\n depth: number = 0\n): Promise<PackageJsonInfo[]> {\n if (depth > MAX_SCAN_DEPTH) return [];\n\n const results: PackageJsonInfo[] = [];\n const fullDir = currentDir ? path.join(rootDir, currentDir) : rootDir;\n\n try {\n const entries = await fs.readdir(fullDir, { withFileTypes: true });\n\n // Check for package.json in current directory\n const hasPackageJson = entries.some(\n (e) => e.isFile() && e.name === \"package.json\"\n );\n\n if (hasPackageJson && currentDir) {\n // Don't add root package.json as a project\n const info = await parsePackageJson(rootDir, currentDir);\n if (info) {\n results.push(info);\n }\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const subPath = currentDir ? `${currentDir}/${entry.name}` : entry.name;\n const subResults = await scanForPackageJsons(rootDir, subPath, depth + 1);\n results.push(...subResults);\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Parse a package.json file and extract project metadata.\n */\nasync function parsePackageJson(\n rootDir: string,\n relativePath: string\n): Promise<PackageJsonInfo | null> {\n try {\n const packageJsonPath = path.join(rootDir, relativePath, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // Use package name or folder name\n const name = pkg.name || path.basename(relativePath);\n\n // Detect type from dependencies\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n let type: ProjectType = \"unknown\";\n\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"] || deps[\"svelte\"]) {\n type = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"] || deps[\"hono\"]) {\n type = \"service\";\n } else if (pkg.main || pkg.exports) {\n type = \"library\";\n }\n\n // Check if this is a monorepo root (has workspaces)\n const hasWorkspaces = Boolean(pkg.workspaces);\n\n return { name, relativePath, type, hasWorkspaces };\n } catch {\n return null;\n }\n}\n\n/**\n * Detect project structure in a workspace.\n *\n * Uses two strategies:\n * 1. Folder pattern detection (apps/, packages/, etc.)\n * 2. package.json scanning for more accurate project boundaries\n */\nexport async function detectProjectStructure(\n rootDir: string\n): Promise<ProjectStructure> {\n const projectMap = new Map<string, Project>();\n let isMonorepo = false;\n\n try {\n const entries = await fs.readdir(rootDir, { withFileTypes: true });\n const dirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n // Strategy 1: Check for standard monorepo patterns\n const monorepoPatterns = [\"apps\", \"packages\", \"libs\", \"services\"];\n const hasMonorepoStructure = monorepoPatterns.some((p) =>\n dirNames.includes(p)\n );\n\n if (hasMonorepoStructure) {\n isMonorepo = true;\n\n // Scan each monorepo directory for subprojects\n for (const pattern of monorepoPatterns) {\n if (!dirNames.includes(pattern)) continue;\n\n const patternDir = path.join(rootDir, pattern);\n try {\n const subDirs = await fs.readdir(patternDir, { withFileTypes: true });\n\n for (const subDir of subDirs) {\n if (!subDir.isDirectory()) continue;\n\n const projectRoot = `${pattern}/${subDir.name}`;\n const type = getProjectType(pattern);\n\n // Add to map (can be overridden by package.json info)\n projectMap.set(projectRoot, {\n name: subDir.name,\n root: projectRoot,\n type,\n });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n }\n\n // Strategy 2: Scan for package.json files\n const packageJsons = await scanForPackageJsons(rootDir);\n\n for (const pkg of packageJsons) {\n // Monorepo indicator: nested package.json with workspaces\n if (pkg.hasWorkspaces) {\n isMonorepo = true;\n }\n\n // Multiple package.json files indicate monorepo\n if (packageJsons.length > 1) {\n isMonorepo = true;\n }\n\n // Override or add project from package.json\n // package.json info is more authoritative than folder pattern\n projectMap.set(pkg.relativePath, {\n name: pkg.name,\n root: pkg.relativePath,\n type: pkg.type,\n });\n }\n\n // Check root package.json for workspaces and type\n let rootType: ProjectType = \"unknown\";\n try {\n const rootPkgPath = path.join(rootDir, \"package.json\");\n const rootPkg = JSON.parse(await fs.readFile(rootPkgPath, \"utf-8\"));\n\n if (rootPkg.workspaces) {\n isMonorepo = true;\n }\n\n // Detect type from dependencies\n const deps = { ...rootPkg.dependencies, ...rootPkg.devDependencies };\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"]) {\n rootType = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"]) {\n rootType = \"service\";\n }\n } catch {\n // No package.json or not readable\n }\n\n // Convert map to sorted array (shorter paths first for better matching)\n const projects = Array.from(projectMap.values()).sort(\n (a, b) => a.root.length - b.root.length\n );\n\n return {\n projects,\n isMonorepo,\n rootType: isMonorepo ? undefined : rootType,\n };\n } catch {\n return {\n projects: [],\n isMonorepo: false,\n rootType: \"unknown\",\n };\n }\n}\n\n/**\n * Get project type from pattern directory name.\n */\nfunction getProjectType(patternDir: string): ProjectType {\n switch (patternDir) {\n case \"apps\":\n return \"app\";\n case \"packages\":\n case \"libs\":\n return \"library\";\n case \"services\":\n return \"service\";\n case \"scripts\":\n case \"tools\":\n return \"script\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Find which project a file belongs to.\n *\n * Matches against detected projects (from package.json and folder patterns).\n * For nested projects, returns the most specific (deepest) match.\n */\nexport function findProjectForFile(\n filepath: string,\n structure: ProjectStructure\n): Project {\n // Normalize path\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n\n // Find all matching projects\n const matches: Project[] = [];\n\n // Check against detected projects (from package.json scanning)\n for (const project of structure.projects) {\n if (\n normalizedPath === project.root ||\n normalizedPath.startsWith(project.root + \"/\")\n ) {\n matches.push(project);\n }\n }\n\n // If we have matches, return the most specific (longest root path)\n if (matches.length > 0) {\n return matches.reduce((best, current) =>\n current.root.length > best.root.length ? current : best\n );\n }\n\n // Fallback: Check against pattern matching for any path\n for (const { pattern, type } of PROJECT_PATTERNS) {\n const match = normalizedPath.match(pattern);\n if (match) {\n return {\n name: match[1],\n root: match[0],\n type,\n };\n }\n }\n\n // Default: root project\n return {\n name: \"root\",\n root: \"\",\n type: structure.rootType ?? \"unknown\",\n };\n}\n\n",
|
|
13
|
+
"/**\n * Entry Point Conventions\n *\n * Patterns for recognizing module entry points and barrel files.\n */\n\nimport * as path from \"path\";\nimport type { FileConvention } from \"./types\";\n\n/**\n * Get the parent folder name from a filepath.\n */\nfunction getParentFolder(filepath: string): string {\n const dir = path.dirname(filepath);\n return path.basename(dir);\n}\n\n/**\n * Entry point conventions for JavaScript/TypeScript projects.\n */\nexport const entryPointConventions: FileConvention[] = [\n {\n id: \"index-file\",\n name: \"Index/Barrel File\",\n description:\n \"Module entry point that typically re-exports from other files\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^index\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"barrel\", \"exports\", \"module\"],\n // Add parent folder as a strong keyword since \"auth/index.ts\" should match \"auth\"\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n // Don't add generic folder names\n if ([\"src\", \"lib\", \"dist\", \"build\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"main-file\",\n name: \"Main Entry Point\",\n description: \"Application main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^main\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"main\", \"entrypoint\", \"bootstrap\", \"startup\"],\n },\n\n {\n id: \"app-component\",\n name: \"Root App Component\",\n description: \"Root application component (React, Vue, etc.)\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^App\\.(tsx|jsx|vue|svelte)$/.test(filename);\n },\n keywords: [\"root\", \"app\", \"application\", \"component\", \"main\"],\n },\n\n {\n id: \"deno-mod\",\n name: \"Deno Module Entry\",\n description: \"Deno module entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"mod.ts\";\n },\n keywords: [\"entry\", \"module\", \"deno\", \"exports\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"python-init\",\n name: \"Python Package Init\",\n description: \"Python package initialization file\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"__init__.py\";\n },\n keywords: [\"entry\", \"package\", \"init\", \"python\", \"module\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"rust-lib\",\n name: \"Rust Library Entry\",\n description: \"Rust library crate entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"lib.rs\" || filename === \"main.rs\";\n },\n keywords: [\"entry\", \"crate\", \"rust\", \"module\"],\n },\n];\n",
|
|
14
|
+
"/**\n * Configuration File Conventions\n *\n * Patterns for recognizing common configuration files.\n */\n\nimport type { FileConvention } from \"./types\";\n\n/**\n * Configuration file conventions.\n */\nexport const configFileConventions: FileConvention[] = [\n // ============================================================================\n // Package Management\n // ============================================================================\n {\n id: \"package-json\",\n name: \"Package.json\",\n description: \"Node.js package manifest\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"package.json\",\n keywords: [\"package\", \"dependencies\", \"npm\", \"scripts\", \"manifest\", \"node\"],\n },\n {\n id: \"pnpm-workspace\",\n name: \"PNPM Workspace\",\n description: \"PNPM monorepo workspace configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"pnpm-workspace.yaml\" || filename === \"pnpm-workspace.yml\",\n keywords: [\"workspace\", \"monorepo\", \"pnpm\", \"packages\"],\n },\n {\n id: \"yarn-lock\",\n name: \"Yarn Lock\",\n description: \"Yarn dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"yarn.lock\",\n keywords: [\"dependencies\", \"lock\", \"yarn\", \"versions\"],\n },\n {\n id: \"package-lock\",\n name: \"Package Lock\",\n description: \"NPM dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"package-lock.json\",\n keywords: [\"dependencies\", \"lock\", \"npm\", \"versions\"],\n },\n {\n id: \"bun-lockb\",\n name: \"Bun Lock\",\n description: \"Bun dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"bun.lockb\" || filename === \"bun.lock\",\n keywords: [\"dependencies\", \"lock\", \"bun\", \"versions\"],\n },\n\n // ============================================================================\n // TypeScript\n // ============================================================================\n {\n id: \"tsconfig\",\n name: \"TypeScript Config\",\n description: \"TypeScript compiler configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"tsconfig.json\" ||\n (filename.startsWith(\"tsconfig.\") && filename.endsWith(\".json\")),\n keywords: [\n \"typescript\",\n \"config\",\n \"compiler\",\n \"ts\",\n \"settings\",\n \"paths\",\n \"types\",\n ],\n },\n {\n id: \"jsconfig\",\n name: \"JavaScript Config\",\n description: \"JavaScript project configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"jsconfig.json\",\n keywords: [\"javascript\", \"config\", \"compiler\", \"js\", \"settings\", \"paths\"],\n },\n\n // ============================================================================\n // Linting & Formatting\n // ============================================================================\n {\n id: \"eslint-config\",\n name: \"ESLint Config\",\n description: \"ESLint linting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".eslintrc\" ||\n filename === \".eslintrc.js\" ||\n filename === \".eslintrc.cjs\" ||\n filename === \".eslintrc.json\" ||\n filename === \".eslintrc.yml\" ||\n filename === \".eslintrc.yaml\" ||\n filename === \"eslint.config.js\" ||\n filename === \"eslint.config.mjs\" ||\n filename === \"eslint.config.cjs\",\n keywords: [\"eslint\", \"linting\", \"lint\", \"rules\", \"code quality\"],\n },\n {\n id: \"prettier-config\",\n name: \"Prettier Config\",\n description: \"Prettier code formatting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".prettierrc\" ||\n filename === \".prettierrc.js\" ||\n filename === \".prettierrc.cjs\" ||\n filename === \".prettierrc.json\" ||\n filename === \".prettierrc.yml\" ||\n filename === \".prettierrc.yaml\" ||\n filename === \"prettier.config.js\" ||\n filename === \"prettier.config.cjs\" ||\n filename === \"prettier.config.mjs\",\n keywords: [\"prettier\", \"formatting\", \"format\", \"code style\", \"style\"],\n },\n {\n id: \"biome-config\",\n name: \"Biome Config\",\n description: \"Biome linting and formatting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"biome.json\" || filename === \"biome.jsonc\",\n keywords: [\"biome\", \"linting\", \"formatting\", \"lint\", \"format\"],\n },\n\n // ============================================================================\n // Build Tools\n // ============================================================================\n {\n id: \"vite-config\",\n name: \"Vite Config\",\n description: \"Vite build tool configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"vite.config.ts\" ||\n filename === \"vite.config.js\" ||\n filename === \"vite.config.mjs\",\n keywords: [\"vite\", \"bundler\", \"build\", \"dev server\", \"hmr\"],\n },\n {\n id: \"webpack-config\",\n name: \"Webpack Config\",\n description: \"Webpack bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"webpack.config.js\" ||\n filename === \"webpack.config.ts\" ||\n (filename.startsWith(\"webpack.\") &&\n (filename.endsWith(\".js\") || filename.endsWith(\".ts\"))),\n keywords: [\"webpack\", \"bundler\", \"build\", \"loaders\", \"plugins\"],\n },\n {\n id: \"rollup-config\",\n name: \"Rollup Config\",\n description: \"Rollup bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"rollup.config.js\" ||\n filename === \"rollup.config.ts\" ||\n filename === \"rollup.config.mjs\",\n keywords: [\"rollup\", \"bundler\", \"build\", \"esm\", \"bundle\"],\n },\n {\n id: \"esbuild-config\",\n name: \"esbuild Config\",\n description: \"esbuild bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"esbuild.config.js\" ||\n filename === \"esbuild.config.ts\" ||\n filename === \"esbuild.config.mjs\",\n keywords: [\"esbuild\", \"bundler\", \"build\", \"fast\"],\n },\n\n // ============================================================================\n // Testing\n // ============================================================================\n {\n id: \"jest-config\",\n name: \"Jest Config\",\n description: \"Jest testing framework configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"jest.config.js\" ||\n filename === \"jest.config.ts\" ||\n filename === \"jest.config.mjs\" ||\n filename === \"jest.config.cjs\" ||\n filename === \"jest.config.json\",\n keywords: [\"jest\", \"testing\", \"test\", \"unit test\", \"config\"],\n },\n {\n id: \"vitest-config\",\n name: \"Vitest Config\",\n description: \"Vitest testing framework configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"vitest.config.ts\" ||\n filename === \"vitest.config.js\" ||\n filename === \"vitest.config.mts\",\n keywords: [\"vitest\", \"testing\", \"test\", \"unit test\", \"config\"],\n },\n {\n id: \"playwright-config\",\n name: \"Playwright Config\",\n description: \"Playwright E2E testing configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"playwright.config.ts\" ||\n filename === \"playwright.config.js\",\n keywords: [\"playwright\", \"testing\", \"e2e\", \"end-to-end\", \"browser test\"],\n },\n {\n id: \"cypress-config\",\n name: \"Cypress Config\",\n description: \"Cypress E2E testing configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"cypress.config.ts\" ||\n filename === \"cypress.config.js\" ||\n filename === \"cypress.json\",\n keywords: [\"cypress\", \"testing\", \"e2e\", \"end-to-end\", \"browser test\"],\n },\n\n // ============================================================================\n // Styling\n // ============================================================================\n {\n id: \"tailwind-config\",\n name: \"Tailwind Config\",\n description: \"Tailwind CSS configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"tailwind.config.js\" ||\n filename === \"tailwind.config.ts\" ||\n filename === \"tailwind.config.cjs\" ||\n filename === \"tailwind.config.mjs\",\n keywords: [\"tailwind\", \"css\", \"styling\", \"utility\", \"design\"],\n },\n {\n id: \"postcss-config\",\n name: \"PostCSS Config\",\n description: \"PostCSS configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"postcss.config.js\" ||\n filename === \"postcss.config.cjs\" ||\n filename === \"postcss.config.mjs\" ||\n filename === \".postcssrc\" ||\n filename === \".postcssrc.json\",\n keywords: [\"postcss\", \"css\", \"styling\", \"transforms\"],\n },\n\n // ============================================================================\n // Environment & Secrets\n // ============================================================================\n {\n id: \"env-file\",\n name: \"Environment File\",\n description: \"Environment variables file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".env\" ||\n filename === \".env.local\" ||\n filename === \".env.development\" ||\n filename === \".env.production\" ||\n filename === \".env.test\" ||\n filename.startsWith(\".env.\"),\n keywords: [\"environment\", \"env\", \"variables\", \"secrets\", \"config\"],\n },\n {\n id: \"env-example\",\n name: \"Environment Example\",\n description: \"Example environment variables file\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename === \".env.example\" ||\n filename === \".env.sample\" ||\n filename === \".env.template\",\n keywords: [\"environment\", \"env\", \"example\", \"template\", \"setup\"],\n },\n\n // ============================================================================\n // Deployment & CI/CD\n // ============================================================================\n {\n id: \"dockerfile\",\n name: \"Dockerfile\",\n description: \"Docker container image definition\",\n category: \"deployment\",\n match: (filepath, filename) =>\n filename === \"Dockerfile\" || filename.startsWith(\"Dockerfile.\"),\n keywords: [\"docker\", \"container\", \"image\", \"deployment\", \"build\"],\n },\n {\n id: \"docker-compose\",\n name: \"Docker Compose\",\n description: \"Docker Compose multi-container configuration\",\n category: \"deployment\",\n match: (filepath, filename) =>\n filename === \"docker-compose.yml\" ||\n filename === \"docker-compose.yaml\" ||\n filename === \"compose.yml\" ||\n filename === \"compose.yaml\" ||\n filename.startsWith(\"docker-compose.\"),\n keywords: [\"docker\", \"compose\", \"containers\", \"services\", \"deployment\"],\n },\n {\n id: \"github-actions\",\n name: \"GitHub Actions Workflow\",\n description: \"GitHub Actions CI/CD workflow\",\n category: \"deployment\",\n match: (filepath) =>\n filepath.includes(\".github/workflows/\") && filepath.endsWith(\".yml\"),\n keywords: [\"github\", \"actions\", \"ci\", \"cd\", \"workflow\", \"automation\"],\n },\n {\n id: \"vercel-config\",\n name: \"Vercel Config\",\n description: \"Vercel deployment configuration\",\n category: \"deployment\",\n match: (filepath, filename) => filename === \"vercel.json\",\n keywords: [\"vercel\", \"deployment\", \"hosting\", \"serverless\"],\n },\n {\n id: \"netlify-config\",\n name: \"Netlify Config\",\n description: \"Netlify deployment configuration\",\n category: \"deployment\",\n match: (filepath, filename) => filename === \"netlify.toml\",\n keywords: [\"netlify\", \"deployment\", \"hosting\", \"functions\"],\n },\n\n // ============================================================================\n // Git\n // ============================================================================\n {\n id: \"gitignore\",\n name: \"Git Ignore\",\n description: \"Git ignored files configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".gitignore\",\n keywords: [\"git\", \"ignore\", \"version control\", \"excluded\"],\n },\n {\n id: \"gitattributes\",\n name: \"Git Attributes\",\n description: \"Git file attributes configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".gitattributes\",\n keywords: [\"git\", \"attributes\", \"version control\", \"line endings\"],\n },\n\n // ============================================================================\n // Documentation\n // ============================================================================\n {\n id: \"readme\",\n name: \"README\",\n description: \"Project documentation\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"readme.md\" ||\n filename.toLowerCase() === \"readme\",\n keywords: [\n \"readme\",\n \"documentation\",\n \"docs\",\n \"overview\",\n \"getting started\",\n ],\n },\n {\n id: \"changelog\",\n name: \"Changelog\",\n description: \"Project changelog\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"changelog.md\" ||\n filename.toLowerCase() === \"changelog\",\n keywords: [\"changelog\", \"changes\", \"releases\", \"history\", \"versions\"],\n },\n {\n id: \"contributing\",\n name: \"Contributing Guide\",\n description: \"Contribution guidelines\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"contributing.md\" ||\n filename.toLowerCase() === \"contributing\",\n keywords: [\"contributing\", \"contribution\", \"guidelines\", \"development\"],\n },\n {\n id: \"license\",\n name: \"License\",\n description: \"Project license\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"license\" ||\n filename.toLowerCase() === \"license.md\" ||\n filename.toLowerCase() === \"license.txt\",\n keywords: [\"license\", \"legal\", \"copyright\", \"terms\"],\n },\n];\n",
|
|
15
|
+
"/**\n * Next.js Framework Conventions\n *\n * Patterns for recognizing Next.js specific files and structures.\n */\n\nimport type { FileConvention, FrameworkConventions } from \"../types\";\n\nconst nextjsConventions: FileConvention[] = [\n // ============================================================================\n // Configuration\n // ============================================================================\n {\n id: \"next-config\",\n name: \"Next.js Config\",\n description: \"Next.js framework configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"next.config.js\" ||\n filename === \"next.config.mjs\" ||\n filename === \"next.config.ts\",\n keywords: [\"nextjs\", \"next\", \"config\", \"framework\", \"settings\"],\n },\n {\n id: \"next-env\",\n name: \"Next.js Environment Types\",\n description: \"Next.js TypeScript environment declarations\",\n category: \"types\",\n match: (filepath, filename) => filename === \"next-env.d.ts\",\n keywords: [\"nextjs\", \"types\", \"typescript\", \"declarations\"],\n },\n\n // ============================================================================\n // App Router (Next.js 13+)\n // ============================================================================\n {\n id: \"next-layout\",\n name: \"Next.js Layout\",\n description: \"Next.js layout component (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"layout.tsx\" || filename === \"layout.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"layout\", \"wrapper\", \"template\", \"app router\"],\n dynamicKeywords: (filepath) => {\n // Extract route segment from path\n const match = filepath.match(/app\\/(.+?)\\/layout\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\") && !s.startsWith(\"[\"));\n return segments.map((s) => s.toLowerCase());\n }\n if (filepath === \"app/layout.tsx\" || filepath === \"app/layout.js\") {\n return [\"root\", \"main\"];\n }\n return [];\n },\n },\n {\n id: \"next-page\",\n name: \"Next.js Page\",\n description: \"Next.js page component (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"page.tsx\" || filename === \"page.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"page\", \"route\", \"view\", \"app router\"],\n dynamicKeywords: (filepath) => {\n // Extract route from path\n const match = filepath.match(/app\\/(.+?)\\/page\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\"))\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\")); // [id] -> id\n return segments.map((s) => s.toLowerCase());\n }\n if (filepath === \"app/page.tsx\" || filepath === \"app/page.js\") {\n return [\"home\", \"index\", \"root\"];\n }\n return [];\n },\n },\n {\n id: \"next-loading\",\n name: \"Next.js Loading\",\n description: \"Next.js loading UI component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"loading.tsx\" || filename === \"loading.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"loading\", \"suspense\", \"skeleton\", \"spinner\"],\n },\n {\n id: \"next-error\",\n name: \"Next.js Error\",\n description: \"Next.js error boundary component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"error.tsx\" || filename === \"error.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"error\", \"boundary\", \"fallback\", \"catch\"],\n },\n {\n id: \"next-not-found\",\n name: \"Next.js Not Found\",\n description: \"Next.js 404 page component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"not-found.tsx\" || filename === \"not-found.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"404\", \"not found\", \"missing\", \"error\"],\n },\n {\n id: \"next-template\",\n name: \"Next.js Template\",\n description: \"Next.js template component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"template.tsx\" || filename === \"template.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"template\", \"wrapper\", \"app router\"],\n },\n\n // ============================================================================\n // API Routes (App Router)\n // ============================================================================\n {\n id: \"next-route-handler\",\n name: \"Next.js Route Handler\",\n description: \"Next.js API route handler (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"route.ts\" || filename === \"route.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"api\", \"route\", \"handler\", \"endpoint\", \"rest\"],\n dynamicKeywords: (filepath) => {\n // Extract API path\n const match = filepath.match(/app\\/api\\/(.+?)\\/route\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\"))\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\"));\n return [\"api\", ...segments.map((s) => s.toLowerCase())];\n }\n return [\"api\"];\n },\n },\n\n // ============================================================================\n // Middleware & Special Files\n // ============================================================================\n {\n id: \"next-middleware\",\n name: \"Next.js Middleware\",\n description: \"Next.js edge middleware\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"middleware.ts\" || filename === \"middleware.js\",\n keywords: [\"nextjs\", \"middleware\", \"edge\", \"request\", \"interceptor\"],\n },\n {\n id: \"next-global-error\",\n name: \"Next.js Global Error\",\n description: \"Next.js global error handler\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"global-error.tsx\" || filename === \"global-error.js\",\n keywords: [\"nextjs\", \"error\", \"global\", \"boundary\", \"catch\"],\n },\n\n // ============================================================================\n // Pages Router (Legacy)\n // ============================================================================\n {\n id: \"next-pages-api\",\n name: \"Next.js API Route (Pages)\",\n description: \"Next.js API route (Pages Router)\",\n category: \"framework\",\n match: (filepath) =>\n filepath.includes(\"/pages/api/\") || filepath.startsWith(\"pages/api/\"),\n keywords: [\"nextjs\", \"api\", \"route\", \"handler\", \"endpoint\", \"pages router\"],\n dynamicKeywords: (filepath) => {\n const match = filepath.match(/pages\\/api\\/(.+?)\\.(ts|js)/);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\"));\n return [\"api\", ...segments.map((s) => s.toLowerCase())];\n }\n return [\"api\"];\n },\n },\n {\n id: \"next-pages-document\",\n name: \"Next.js Document\",\n description: \"Next.js custom document (Pages Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"_document.tsx\" || filename === \"_document.js\") &&\n (filepath.includes(\"/pages/\") || filepath.startsWith(\"pages/\")),\n keywords: [\"nextjs\", \"document\", \"html\", \"head\", \"body\", \"pages router\"],\n },\n {\n id: \"next-pages-app\",\n name: \"Next.js App (Pages)\",\n description: \"Next.js custom app (Pages Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"_app.tsx\" || filename === \"_app.js\") &&\n (filepath.includes(\"/pages/\") || filepath.startsWith(\"pages/\")),\n keywords: [\"nextjs\", \"app\", \"wrapper\", \"provider\", \"pages router\"],\n },\n];\n\n/**\n * Next.js framework conventions provider.\n */\nexport const nextjsFramework: FrameworkConventions = {\n id: \"nextjs\",\n name: \"Next.js\",\n detect: (filepath) => {\n // Detect if this is likely a Next.js project\n return (\n filepath === \"next.config.js\" ||\n filepath === \"next.config.mjs\" ||\n filepath === \"next.config.ts\" ||\n filepath.includes(\"/app/page.\") ||\n filepath.includes(\"/pages/_app.\")\n );\n },\n conventions: nextjsConventions,\n};\n",
|
|
16
|
+
"/**\n * Convex Framework Conventions\n *\n * Patterns for recognizing Convex backend files and structures.\n * Convex is a backend platform with real-time sync.\n */\n\nimport type { FileConvention, FrameworkConventions } from \"../types\";\n\nconst convexConventions: FileConvention[] = [\n // ============================================================================\n // Configuration\n // ============================================================================\n {\n id: \"convex-config\",\n name: \"Convex Config\",\n description: \"Convex project configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"convex.json\",\n keywords: [\"convex\", \"config\", \"backend\", \"settings\"],\n },\n\n // ============================================================================\n // Schema\n // ============================================================================\n {\n id: \"convex-schema\",\n name: \"Convex Schema\",\n description: \"Convex database schema definition\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"schema.ts\" &&\n (filepath.includes(\"/convex/\") || filepath.startsWith(\"convex/\")),\n keywords: [\"convex\", \"schema\", \"database\", \"tables\", \"types\", \"model\"],\n },\n\n // ============================================================================\n // Functions\n // ============================================================================\n {\n id: \"convex-function\",\n name: \"Convex Function File\",\n description: \"Convex backend function file\",\n category: \"framework\",\n match: (filepath, filename, extension) =>\n (extension === \".ts\" || extension === \".js\") &&\n (filepath.includes(\"/convex/\") || filepath.startsWith(\"convex/\")) &&\n !filepath.includes(\"/_generated/\") &&\n filename !== \"schema.ts\" &&\n !filename.startsWith(\"_\"),\n keywords: [\"convex\", \"function\", \"backend\", \"query\", \"mutation\", \"action\"],\n dynamicKeywords: (filepath) => {\n // Extract function file name as keyword\n const match = filepath.match(/convex\\/(.+?)\\.(ts|js)/);\n if (match) {\n const name = match[1].replace(/\\//g, \" \").split(\" \").pop() || \"\";\n if (name && ![\"schema\", \"http\", \"crons\"].includes(name)) {\n return [name.toLowerCase()];\n }\n }\n return [];\n },\n },\n\n // ============================================================================\n // HTTP Routes\n // ============================================================================\n {\n id: \"convex-http\",\n name: \"Convex HTTP Routes\",\n description: \"Convex HTTP endpoint definitions\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"http.ts\" &&\n (filepath.includes(\"/convex/\") || filepath.startsWith(\"convex/\")),\n keywords: [\"convex\", \"http\", \"routes\", \"api\", \"endpoints\", \"rest\"],\n },\n\n // ============================================================================\n // Cron Jobs\n // ============================================================================\n {\n id: \"convex-crons\",\n name: \"Convex Cron Jobs\",\n description: \"Convex scheduled function definitions\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"crons.ts\" &&\n (filepath.includes(\"/convex/\") || filepath.startsWith(\"convex/\")),\n keywords: [\n \"convex\",\n \"crons\",\n \"scheduled\",\n \"jobs\",\n \"background\",\n \"recurring\",\n ],\n },\n\n // ============================================================================\n // Generated Files\n // ============================================================================\n {\n id: \"convex-generated\",\n name: \"Convex Generated\",\n description: \"Convex auto-generated files\",\n category: \"framework\",\n match: (filepath) =>\n filepath.includes(\"/convex/_generated/\") ||\n filepath.startsWith(\"convex/_generated/\"),\n keywords: [\"convex\", \"generated\", \"types\", \"api\"],\n },\n\n // ============================================================================\n // Auth\n // ============================================================================\n {\n id: \"convex-auth\",\n name: \"Convex Auth\",\n description: \"Convex authentication configuration\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"auth.ts\" &&\n (filepath.includes(\"/convex/\") || filepath.startsWith(\"convex/\")),\n keywords: [\"convex\", \"auth\", \"authentication\", \"login\", \"users\"],\n },\n {\n id: \"convex-auth-config\",\n name: \"Convex Auth Config\",\n description: \"Convex auth configuration file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"auth.config.ts\",\n keywords: [\"convex\", \"auth\", \"config\", \"providers\", \"oauth\"],\n },\n];\n\n/**\n * Convex framework conventions provider.\n */\nexport const convexFramework: FrameworkConventions = {\n id: \"convex\",\n name: \"Convex\",\n detect: (filepath) => {\n // Detect if this is likely a Convex project\n return (\n filepath === \"convex.json\" ||\n filepath.startsWith(\"convex/\") ||\n filepath.includes(\"/convex/\")\n );\n },\n conventions: convexConventions,\n};\n",
|
|
17
|
+
"/**\n * Framework Conventions Registry\n *\n * Central registry for framework-specific conventions.\n * Add new frameworks here to extend convention support.\n */\n\nimport type { FrameworkConventions } from \"../types\";\nimport { nextjsFramework } from \"./nextjs\";\nimport { convexFramework } from \"./convex\";\n\n/**\n * All registered framework convention providers.\n * Add new frameworks to this array.\n */\nexport const frameworkProviders: FrameworkConventions[] = [\n nextjsFramework,\n convexFramework,\n];\n\n/**\n * Get all framework conventions.\n */\nexport function getAllFrameworkConventions() {\n return frameworkProviders.flatMap((f) => f.conventions);\n}\n\n/**\n * Get frameworks by ID.\n */\nexport function getFramework(id: string): FrameworkConventions | undefined {\n return frameworkProviders.find((f) => f.id === id);\n}\n\n// Re-export individual frameworks\nexport { nextjsFramework } from \"./nextjs\";\nexport { convexFramework } from \"./convex\";\n",
|
|
18
|
+
"/**\n * File Conventions Module\n *\n * Provides semantic keywords for files based on common conventions.\n * This helps improve search relevance by recognizing special file patterns.\n *\n * Categories:\n * - Entry Points: index.ts, main.ts, App.tsx, etc.\n * - Configuration: tsconfig.json, .prettierrc, package.json, etc.\n * - Frameworks: Next.js, Convex, and other framework-specific patterns\n * - Type Definitions: *.d.ts, *.types.ts\n *\n * Extensibility:\n * - Add new conventions to entryPoints.ts or configFiles.ts\n * - Add new frameworks in the frameworks/ directory\n */\n\nimport * as path from \"path\";\nimport type { FileConvention, ConventionMatch } from \"./types\";\nimport { entryPointConventions } from \"./entryPoints\";\nimport { configFileConventions } from \"./configFiles\";\nimport { getAllFrameworkConventions } from \"./frameworks\";\n\n// Re-export types\nexport type {\n FileConvention,\n ConventionCategory,\n ConventionMatch,\n FrameworkConventions,\n} from \"./types\";\n\n/**\n * All conventions combined.\n */\nfunction getAllConventions(): FileConvention[] {\n return [\n ...entryPointConventions,\n ...configFileConventions,\n ...getAllFrameworkConventions(),\n ];\n}\n\n/**\n * Type definition file conventions (built-in).\n */\nconst typeDefinitionConventions: FileConvention[] = [\n {\n id: \"dts-file\",\n name: \"TypeScript Declaration\",\n description: \"TypeScript type declaration file\",\n category: \"types\",\n match: (filepath, filename) => filename.endsWith(\".d.ts\"),\n keywords: [\"types\", \"declarations\", \"typescript\", \"definitions\"],\n },\n {\n id: \"types-file\",\n name: \"Types File\",\n description: \"TypeScript types file\",\n category: \"types\",\n match: (filepath, filename) =>\n filename.endsWith(\".types.ts\") || filename === \"types.ts\",\n keywords: [\"types\", \"definitions\", \"typescript\", \"interfaces\"],\n dynamicKeywords: (filepath) => {\n // Extract what the types are for\n const match = filepath.match(/([^/]+)\\.types\\.ts$/);\n if (match) {\n return [match[1].toLowerCase()];\n }\n return [];\n },\n },\n {\n id: \"types-folder\",\n name: \"Types Folder File\",\n description: \"File in a types folder\",\n category: \"types\",\n match: (filepath) =>\n filepath.includes(\"/types/\") || filepath.startsWith(\"types/\"),\n keywords: [\"types\", \"definitions\"],\n },\n];\n\n/**\n * Test file conventions (built-in).\n */\nconst testFileConventions: FileConvention[] = [\n {\n id: \"test-file\",\n name: \"Test File\",\n description: \"Unit/integration test file\",\n category: \"test\",\n match: (filepath, filename) =>\n filename.includes(\".test.\") ||\n filename.includes(\".spec.\") ||\n filename.includes(\"_test.\"),\n keywords: [\"test\", \"spec\", \"unit test\"],\n dynamicKeywords: (filepath) => {\n // Extract what's being tested\n const match = filepath.match(/([^/]+)\\.(test|spec)\\./);\n if (match) {\n return [match[1].toLowerCase()];\n }\n return [];\n },\n },\n {\n id: \"test-folder\",\n name: \"Test Folder File\",\n description: \"File in a test folder\",\n category: \"test\",\n match: (filepath) =>\n filepath.includes(\"/__tests__/\") ||\n filepath.includes(\"/test/\") ||\n filepath.includes(\"/tests/\") ||\n filepath.startsWith(\"__tests__/\") ||\n filepath.startsWith(\"test/\") ||\n filepath.startsWith(\"tests/\"),\n keywords: [\"test\", \"testing\"],\n },\n];\n\n/**\n * Get all conventions including built-in ones.\n */\nexport function getConventions(): FileConvention[] {\n return [\n ...getAllConventions(),\n ...typeDefinitionConventions,\n ...testFileConventions,\n ];\n}\n\n/**\n * Match a filepath against all conventions and return keywords.\n *\n * @param filepath - The file path (relative to project root)\n * @returns Array of keywords from all matching conventions\n */\nexport function getConventionKeywords(filepath: string): string[] {\n const conventions = getConventions();\n const filename = path.basename(filepath);\n const extension = path.extname(filepath);\n const keywords = new Set<string>();\n\n for (const convention of conventions) {\n try {\n if (convention.match(filepath, filename, extension)) {\n // Add static keywords\n for (const keyword of convention.keywords) {\n keywords.add(keyword.toLowerCase());\n }\n\n // Add dynamic keywords\n if (convention.dynamicKeywords) {\n const dynamicKws = convention.dynamicKeywords(filepath);\n for (const kw of dynamicKws) {\n if (kw && kw.length > 1) {\n keywords.add(kw.toLowerCase());\n }\n }\n }\n }\n } catch {\n // Skip conventions that throw errors\n }\n }\n\n return Array.from(keywords);\n}\n\n/**\n * Match a filepath against all conventions and return detailed matches.\n *\n * @param filepath - The file path (relative to project root)\n * @returns Array of convention matches with details\n */\nexport function matchConventions(filepath: string): ConventionMatch[] {\n const conventions = getConventions();\n const filename = path.basename(filepath);\n const extension = path.extname(filepath);\n const matches: ConventionMatch[] = [];\n\n for (const convention of conventions) {\n try {\n if (convention.match(filepath, filename, extension)) {\n const keywords = [...convention.keywords];\n\n if (convention.dynamicKeywords) {\n const dynamicKws = convention.dynamicKeywords(filepath);\n keywords.push(...dynamicKws.filter((k) => k && k.length > 1));\n }\n\n matches.push({\n convention,\n keywords: keywords.map((k) => k.toLowerCase()),\n });\n }\n } catch {\n // Skip conventions that throw errors\n }\n }\n\n return matches;\n}\n\n// Re-export convention collections for extension\nexport { entryPointConventions } from \"./entryPoints\";\nexport { configFileConventions } from \"./configFiles\";\nexport { frameworkProviders, getAllFrameworkConventions } from \"./frameworks\";\n",
|
|
19
|
+
"/**\n * File Introspection\n *\n * Extracts metadata from individual files for context-aware search.\n */\n\nimport * as path from \"path\";\nimport type {\n FileIntrospection,\n Project,\n ProjectStructure,\n Scope,\n} from \"./types\";\nimport { findProjectForFile, detectScopeFromName } from \"./projectDetector\";\nimport { getConventionKeywords } from \"./conventions\";\n\n/**\n * Layer detection patterns.\n */\nconst LAYER_PATTERNS: Record<string, string[]> = {\n controller: [\"controller\", \"api\", \"routes\", \"route\", \"handler\"],\n service: [\"service\", \"logic\", \"usecase\", \"usecases\", \"handler\"],\n repository: [\"repository\", \"repo\", \"dao\", \"store\", \"persistence\"],\n model: [\n \"model\",\n \"models\",\n \"entity\",\n \"entities\",\n \"schema\",\n \"schemas\",\n \"types\",\n \"type\",\n ],\n util: [\"util\", \"utils\", \"helper\", \"helpers\", \"common\", \"lib\"],\n config: [\"config\", \"configuration\", \"settings\"],\n middleware: [\"middleware\", \"middlewares\"],\n domain: [\"domain\"],\n infrastructure: [\"infrastructure\", \"infra\"],\n application: [\"application\", \"app\"],\n presentation: [\n \"presentation\",\n \"ui\",\n \"views\",\n \"view\",\n \"component\",\n \"components\",\n ],\n test: [\"test\", \"tests\", \"spec\", \"specs\", \"__tests__\", \"e2e\"],\n};\n\n/**\n * Domain detection patterns (feature areas).\n */\nconst DOMAIN_PATTERNS = [\n \"auth\",\n \"authentication\",\n \"user\",\n \"users\",\n \"account\",\n \"accounts\",\n \"profile\",\n \"profiles\",\n \"product\",\n \"products\",\n \"item\",\n \"items\",\n \"catalog\",\n \"order\",\n \"orders\",\n \"cart\",\n \"checkout\",\n \"payment\",\n \"payments\",\n \"billing\",\n \"subscription\",\n \"subscriptions\",\n \"notification\",\n \"notifications\",\n \"email\",\n \"sms\",\n \"report\",\n \"reports\",\n \"analytics\",\n \"metrics\",\n \"dashboard\",\n \"admin\",\n \"settings\",\n \"search\",\n \"chat\",\n \"message\",\n \"messages\",\n \"feed\",\n \"post\",\n \"posts\",\n \"comment\",\n \"comments\",\n \"media\",\n \"upload\",\n \"file\",\n \"files\",\n \"storage\",\n \"cache\",\n \"session\",\n \"log\",\n \"logs\",\n \"audit\",\n];\n\n/**\n * Framework detection from imports (simplified).\n */\nconst FRAMEWORK_INDICATORS: Record<string, string[]> = {\n nextjs: [\"next\", \"next/\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n react: [\"react\"],\n vue: [\"vue\"],\n angular: [\"@angular/\"],\n nestjs: [\"@nestjs/\"],\n koa: [\"koa\"],\n};\n\n/**\n * Language detection from file extension.\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".py\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n \".kt\": \"kotlin\",\n \".swift\": \"swift\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".cs\": \"csharp\",\n \".cpp\": \"cpp\",\n \".c\": \"c\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n \".md\": \"markdown\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n};\n\n/**\n * Extract introspection metadata for a file.\n */\nexport function introspectFile(\n filepath: string,\n structure: ProjectStructure,\n fileContent?: string\n): FileIntrospection {\n // Normalize path\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const segments = normalizedPath.split(\"/\").filter((s) => s.length > 0);\n const filename = segments[segments.length - 1] || \"\";\n const ext = path.extname(filename);\n\n // Find project\n const project = findProjectForFile(normalizedPath, structure);\n\n // Detect language\n const language = EXTENSION_TO_LANGUAGE[ext] || \"unknown\";\n\n // Detect layer from path\n const layer = detectLayer(segments, filename);\n\n // Detect domain from path\n const domain = detectDomain(segments);\n\n // Detect scope\n const scope = detectScope(segments, project, layer);\n\n // Detect framework (if content provided)\n let framework: string | undefined;\n if (fileContent) {\n framework = detectFramework(fileContent);\n }\n\n return {\n filepath: normalizedPath,\n project,\n scope,\n layer,\n domain,\n language,\n framework,\n depth: segments.length - 1, // Exclude filename\n pathSegments: segments.slice(0, -1), // Exclude filename\n };\n}\n\n/**\n * Detect architectural layer from path segments.\n */\nfunction detectLayer(segments: string[], filename: string): string | undefined {\n // Check filename first (e.g., userController.ts)\n const filenameLower = filename.toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n if (filenameLower.includes(pattern)) {\n return layer;\n }\n }\n }\n\n // Check directory segments\n for (let i = segments.length - 2; i >= 0; i--) {\n const segment = segments[i].toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n if (patterns.includes(segment)) {\n return layer;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect feature domain from path segments.\n */\nfunction detectDomain(segments: string[]): string | undefined {\n // Skip common non-domain segments\n const skipSegments = new Set([\n \"src\",\n \"lib\",\n \"app\",\n \"apps\",\n \"packages\",\n \"services\",\n \"modules\",\n \"features\",\n ...Object.values(LAYER_PATTERNS).flat(),\n ]);\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if (skipSegments.has(segmentLower)) continue;\n\n // Check if it matches a known domain\n if (DOMAIN_PATTERNS.includes(segmentLower)) {\n return segmentLower;\n }\n\n // Check for partial matches (e.g., \"userService\" → \"user\")\n for (const domain of DOMAIN_PATTERNS) {\n if (segmentLower.startsWith(domain) || segmentLower.endsWith(domain)) {\n return domain;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect scope from path and project.\n */\nfunction detectScope(\n segments: string[],\n project: Project,\n layer?: string\n): Scope {\n // Check project-level scope from project name\n const projectScope = detectScopeFromName(project.name);\n if (projectScope !== \"unknown\") {\n return projectScope;\n }\n\n // Infer from layer\n if (layer) {\n switch (layer) {\n case \"controller\":\n case \"repository\":\n case \"middleware\":\n return \"backend\";\n case \"presentation\":\n return \"frontend\";\n case \"util\":\n case \"model\":\n return \"shared\";\n case \"test\":\n return \"tooling\";\n }\n }\n\n // Check path segments for scope hints\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if ([\"server\", \"api\", \"backend\"].includes(segmentLower)) {\n return \"backend\";\n }\n if ([\"client\", \"web\", \"frontend\", \"ui\"].includes(segmentLower)) {\n return \"frontend\";\n }\n if ([\"shared\", \"common\", \"lib\", \"libs\"].includes(segmentLower)) {\n return \"shared\";\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Detect framework from file content (imports).\n */\nfunction detectFramework(content: string): string | undefined {\n for (const [framework, indicators] of Object.entries(FRAMEWORK_INDICATORS)) {\n for (const indicator of indicators) {\n if (\n content.includes(`from '${indicator}`) ||\n content.includes(`from \"${indicator}`) ||\n content.includes(`require('${indicator}`) ||\n content.includes(`require(\"${indicator}`)\n ) {\n return framework;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Extract keywords from introspection for search boosting.\n */\nexport function introspectionToKeywords(intro: FileIntrospection): string[] {\n const keywords: string[] = [];\n\n // Add filename keywords (without extension) - important for filename-based search\n const filename = path.basename(intro.filepath);\n const filenameWithoutExt = filename.replace(/\\.[^.]+$/, \"\");\n // Split camelCase/PascalCase/snake_case/kebab-case into parts\n const filenameParts = filenameWithoutExt\n .split(/[-_.]/)\n .flatMap((part) => part.split(/(?=[A-Z])/))\n .map((part) => part.toLowerCase())\n .filter((part) => part.length > 1);\n keywords.push(...filenameParts);\n // Also add the full filename without extension as a keyword\n keywords.push(filenameWithoutExt.toLowerCase());\n\n // Add project name keywords\n if (intro.project.name && intro.project.name !== \"root\") {\n keywords.push(intro.project.name.toLowerCase());\n }\n\n // Add scope\n if (intro.scope !== \"unknown\") {\n keywords.push(intro.scope);\n }\n\n // Add layer\n if (intro.layer) {\n keywords.push(intro.layer);\n }\n\n // Add domain\n if (intro.domain) {\n keywords.push(intro.domain);\n }\n\n // Add language\n if (intro.language !== \"unknown\") {\n keywords.push(intro.language);\n }\n\n // Add framework\n if (intro.framework) {\n keywords.push(intro.framework);\n }\n\n // Add path segments (filtered)\n const skipSegments = new Set([\"src\", \"lib\", \"index\"]);\n for (const segment of intro.pathSegments) {\n if (!skipSegments.has(segment.toLowerCase()) && segment.length > 2) {\n keywords.push(segment.toLowerCase());\n }\n }\n\n // Add convention-based keywords (config files, entry points, frameworks, etc.)\n const conventionKeywords = getConventionKeywords(intro.filepath);\n keywords.push(...conventionKeywords);\n\n return [...new Set(keywords)];\n}\n",
|
|
20
|
+
"/**\n * Introspection Module\n *\n * Manages file metadata for context-aware search boosting.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type {\n FileIntrospection,\n ProjectStructure,\n IntrospectionConfig,\n} from \"./types\";\nimport { detectProjectStructure } from \"./projectDetector\";\nimport { introspectFile, introspectionToKeywords } from \"./fileIntrospector\";\nimport { getRaggrepDir } from \"../infrastructure/config\";\nimport type { Config } from \"../domain/entities\";\n\n// Re-export types\nexport type { FileIntrospection, ProjectStructure, Project, Scope, ProjectType } from \"./types\";\nexport { introspectFile, introspectionToKeywords } from \"./fileIntrospector\";\nexport { detectProjectStructure, detectScopeFromName } from \"./projectDetector\";\n\n/**\n * Introspection index for a workspace.\n */\nexport class IntrospectionIndex {\n private rootDir: string;\n private structure: ProjectStructure | null = null;\n private files: Map<string, FileIntrospection> = new Map();\n private config: IntrospectionConfig = {};\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /**\n * Initialize by detecting project structure.\n */\n async initialize(): Promise<void> {\n this.structure = await detectProjectStructure(this.rootDir);\n \n // Try to load config overrides\n try {\n const configPath = path.join(this.rootDir, \".raggrep\", \"config.json\");\n const configContent = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(configContent);\n this.config = config.introspection || {};\n } catch {\n // No config or introspection section\n }\n }\n\n /**\n * Get project structure.\n */\n getStructure(): ProjectStructure | null {\n return this.structure;\n }\n\n /**\n * Introspect a file and add to index.\n */\n addFile(filepath: string, content?: string): FileIntrospection {\n if (!this.structure) {\n throw new Error(\"IntrospectionIndex not initialized\");\n }\n\n const intro = introspectFile(filepath, this.structure, content);\n \n // Apply config overrides\n this.applyOverrides(intro);\n \n this.files.set(filepath, intro);\n return intro;\n }\n\n /**\n * Get introspection for a file.\n */\n getFile(filepath: string): FileIntrospection | undefined {\n return this.files.get(filepath);\n }\n\n /**\n * Get all introspected files.\n */\n getAllFiles(): FileIntrospection[] {\n return Array.from(this.files.values());\n }\n\n /**\n * Apply config overrides to introspection.\n */\n private applyOverrides(intro: FileIntrospection): void {\n if (!this.config.projects) return;\n\n // Find matching project override\n for (const [projectPath, overrides] of Object.entries(this.config.projects)) {\n if (intro.filepath.startsWith(projectPath + \"/\") || intro.project.root === projectPath) {\n if (overrides.scope) {\n intro.scope = overrides.scope;\n }\n if (overrides.framework) {\n intro.framework = overrides.framework;\n }\n break;\n }\n }\n }\n\n /**\n * Save introspection index to disk.\n */\n async save(config: Config): Promise<void> {\n const introDir = path.join(getRaggrepDir(this.rootDir, config), \"introspection\");\n await fs.mkdir(introDir, { recursive: true });\n\n // Save project structure\n const projectPath = path.join(introDir, \"_project.json\");\n await fs.writeFile(\n projectPath,\n JSON.stringify(\n {\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n structure: this.structure,\n },\n null,\n 2\n )\n );\n\n // Save file introspections in directory structure\n for (const [filepath, intro] of this.files) {\n const introFilePath = path.join(\n introDir,\n \"files\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n await fs.mkdir(path.dirname(introFilePath), { recursive: true });\n await fs.writeFile(introFilePath, JSON.stringify(intro, null, 2));\n }\n\n console.log(\n ` [Introspection] Saved metadata for ${this.files.size} files`\n );\n }\n\n /**\n * Load introspection index from disk.\n */\n async load(config: Config): Promise<void> {\n const introDir = path.join(getRaggrepDir(this.rootDir, config), \"introspection\");\n\n try {\n // Load project structure\n const projectPath = path.join(introDir, \"_project.json\");\n const projectContent = await fs.readFile(projectPath, \"utf-8\");\n const projectData = JSON.parse(projectContent);\n this.structure = projectData.structure;\n\n // Load file introspections\n await this.loadFilesRecursive(path.join(introDir, \"files\"), \"\");\n } catch {\n // No introspection index yet\n this.structure = null;\n this.files.clear();\n }\n }\n\n /**\n * Recursively load file introspections.\n */\n private async loadFilesRecursive(basePath: string, prefix: string): Promise<void> {\n try {\n const entries = await fs.readdir(basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(basePath, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n await this.loadFilesRecursive(entryPath, relativePath);\n } else if (entry.name.endsWith(\".json\")) {\n const content = await fs.readFile(entryPath, \"utf-8\");\n const intro: FileIntrospection = JSON.parse(content);\n this.files.set(intro.filepath, intro);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.files.clear();\n this.structure = null;\n }\n}\n\n/**\n * Calculate search boost based on introspection and query.\n *\n * @param intro - File introspection\n * @param query - Search query\n * @returns Boost multiplier (1.0 = no boost, >1.0 = positive boost)\n */\nexport function calculateIntrospectionBoost(\n intro: FileIntrospection,\n query: string\n): number {\n let boost = 1.0;\n const queryTerms = query.toLowerCase().split(/\\s+/);\n\n // Domain match: +10%\n if (intro.domain && queryTerms.some((t) => intro.domain!.includes(t) || t.includes(intro.domain!))) {\n boost *= 1.1;\n }\n\n // Layer match: +5%\n if (intro.layer && queryTerms.some((t) => intro.layer!.includes(t) || t.includes(intro.layer!))) {\n boost *= 1.05;\n }\n\n // Scope match for backend queries: +5%\n const backendTerms = [\"api\", \"server\", \"backend\", \"endpoint\", \"route\"];\n if (\n queryTerms.some((t) => backendTerms.includes(t)) &&\n intro.scope === \"backend\"\n ) {\n boost *= 1.05;\n }\n\n // Scope match for frontend queries: +5%\n const frontendTerms = [\"ui\", \"component\", \"page\", \"view\", \"frontend\", \"client\"];\n if (\n queryTerms.some((t) => frontendTerms.includes(t)) &&\n intro.scope === \"frontend\"\n ) {\n boost *= 1.05;\n }\n\n // Path segment match: +3% per match\n for (const segment of intro.pathSegments) {\n if (queryTerms.some((t) => segment.toLowerCase().includes(t))) {\n boost *= 1.03;\n }\n }\n\n // Project name match: +5%\n if (\n intro.project.name !== \"root\" &&\n queryTerms.some((t) => intro.project.name.toLowerCase().includes(t))\n ) {\n boost *= 1.05;\n }\n\n return boost;\n}\n\n",
|
|
12
21
|
"/**\n * Regex-based Symbol Extraction\n *\n * Extracts symbols from code using regular expressions.\n * Language-agnostic but optimized for common patterns.\n */\n\nexport type SymbolType =\n | \"function\"\n | \"class\"\n | \"variable\"\n | \"interface\"\n | \"type\"\n | \"enum\"\n | \"method\"\n | \"other\";\n\nexport interface ExtractedSymbol {\n name: string;\n type: SymbolType;\n line: number;\n isExported: boolean;\n}\n\n/**\n * Patterns for extracting symbols from code.\n * Order matters - more specific patterns should come first.\n */\nconst SYMBOL_PATTERNS: Array<{\n type: SymbolType;\n pattern: RegExp;\n exported: boolean;\n}> = [\n // Exported function declarations\n {\n type: \"function\",\n pattern: /^export\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported arrow functions\n {\n type: \"function\",\n pattern: /^export\\s+(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: true,\n },\n // Exported classes\n {\n type: \"class\",\n pattern: /^export\\s+(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported interfaces (TypeScript)\n {\n type: \"interface\",\n pattern: /^export\\s+interface\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported types (TypeScript)\n {\n type: \"type\",\n pattern: /^export\\s+type\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported enums\n {\n type: \"enum\",\n pattern: /^export\\s+(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported variables\n {\n type: \"variable\",\n pattern: /^export\\s+(?:const|let|var)\\s+(\\w+)\\s*(?::|=)/gm,\n exported: true,\n },\n // Default exports\n {\n type: \"function\",\n pattern: /^export\\s+default\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n {\n type: \"class\",\n pattern: /^export\\s+default\\s+class\\s+(\\w+)/gm,\n exported: true,\n },\n\n // Non-exported declarations\n {\n type: \"function\",\n pattern: /^(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"function\",\n pattern: /^(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^interface\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n\n // Python patterns\n {\n type: \"function\",\n pattern: /^def\\s+(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^class\\s+(\\w+)(?:\\s*\\(|:)/gm,\n exported: false,\n },\n\n // Go patterns\n {\n type: \"function\",\n pattern: /^func\\s+(?:\\([^)]+\\)\\s+)?(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)\\s+(?:struct|interface)/gm,\n exported: false,\n },\n\n // Rust patterns\n {\n type: \"function\",\n pattern: /^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^(?:pub\\s+)?struct\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:pub\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^(?:pub\\s+)?trait\\s+(\\w+)/gm,\n exported: false,\n },\n];\n\n/**\n * Extract symbols from code content using regex patterns.\n *\n * @param content - The source code content\n * @returns Array of extracted symbols with their locations\n */\nexport function extractSymbols(content: string): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n const seenSymbols = new Set<string>(); // Track seen symbols to avoid duplicates\n\n // Split content into lines for line number calculation\n const lines = content.split(\"\\n\");\n\n for (const { type, pattern, exported } of SYMBOL_PATTERNS) {\n // Reset regex state\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const name = match[1];\n const symbolKey = `${name}:${type}`;\n\n // Skip if we've already seen this symbol (from a more specific pattern)\n if (seenSymbols.has(symbolKey)) continue;\n seenSymbols.add(symbolKey);\n\n // Calculate line number\n const beforeMatch = content.substring(0, match.index);\n const line = beforeMatch.split(\"\\n\").length;\n\n symbols.push({\n name,\n type,\n line,\n isExported: exported,\n });\n }\n }\n\n // Sort by line number\n return symbols.sort((a, b) => a.line - b.line);\n}\n\n/**\n * Extract symbol names as keywords for BM25 indexing.\n *\n * @param symbols - Array of extracted symbols\n * @returns Array of unique symbol names\n */\nexport function symbolsToKeywords(symbols: ExtractedSymbol[]): string[] {\n const keywords = new Set<string>();\n\n for (const symbol of symbols) {\n // Add the full name\n keywords.add(symbol.name.toLowerCase());\n\n // Split camelCase/PascalCase into parts\n const parts = symbol.name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/\\s+/);\n\n for (const part of parts) {\n if (part.length > 2) {\n keywords.add(part);\n }\n }\n }\n\n return Array.from(keywords);\n}\n\n",
|
|
13
|
-
"/**\n * Core Index Module\n *\n * Language-agnostic text search using:\n * - Regex-based symbol extraction\n * - BM25 keyword matching\n * - Line-based chunking\n *\n * Index location: .raggrep/index/core/\n *\n * This module provides fast, deterministic search without embeddings.\n * It complements language-specific modules by catching symbol matches.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n} from \"../../types\";\nimport type {\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from \"../../domain/entities\";\nimport { BM25Index, tokenize, normalizeScore } from \"../../domain/services/bm25\";\nimport { getRaggrepDir } from \"../../infrastructure/config\";\nimport { extractSymbols, symbolsToKeywords, type ExtractedSymbol } from \"./symbols\";\n\n/** Default minimum score for core search results */\nconst DEFAULT_MIN_SCORE = 0.1;\n\n/** Default number of results */\nconst DEFAULT_TOP_K = 20;\n\n/** Lines per chunk for basic chunking */\nconst LINES_PER_CHUNK = 50;\n\n/** Overlap between chunks */\nconst CHUNK_OVERLAP = 10;\n\n/**\n * Core module-specific data stored with file index\n */\nexport interface CoreModuleData {\n /** Extracted symbols */\n symbols: ExtractedSymbol[];\n /** BM25 tokens for this file */\n tokens: string[];\n [key: string]: unknown;\n}\n\n/**\n * Stored symbol index for fast lookup\n */\ninterface SymbolIndexEntry {\n filepath: string;\n symbols: ExtractedSymbol[];\n tokens: string[];\n}\n\nexport class CoreModule implements IndexModule {\n readonly id = \"core\";\n readonly name = \"Core Search\";\n readonly description = \"Language-agnostic text search with symbol extraction\";\n readonly version = \"1.0.0\";\n\n private symbolIndex: Map<string, SymbolIndexEntry> = new Map();\n private bm25Index: BM25Index | null = null;\n private rootDir: string = \"\";\n\n async initialize(_config: ModuleConfig): Promise<void> {\n // Core module needs no initialization\n }\n\n /**\n * Index a single file.\n */\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n this.rootDir = ctx.rootDir;\n\n // Extract symbols using regex\n const symbols = extractSymbols(content);\n const symbolKeywords = symbolsToKeywords(symbols);\n\n // Tokenize content for BM25\n const contentTokens = tokenize(content);\n const allTokens = [...new Set([...contentTokens, ...symbolKeywords])];\n\n // Create line-based chunks\n const chunks = this.createChunks(filepath, content, symbols);\n\n // Get file stats\n const stats = await ctx.getFileStats(filepath);\n\n // Store in memory for finalize\n this.symbolIndex.set(filepath, {\n filepath,\n symbols,\n tokens: allTokens,\n });\n\n // Build module data\n const moduleData: CoreModuleData = {\n symbols,\n tokens: allTokens,\n };\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n /**\n * Create line-based chunks from content.\n */\n private createChunks(\n filepath: string,\n content: string,\n symbols: ExtractedSymbol[]\n ): Chunk[] {\n const lines = content.split(\"\\n\");\n const chunks: Chunk[] = [];\n\n // Create overlapping chunks\n for (let start = 0; start < lines.length; start += LINES_PER_CHUNK - CHUNK_OVERLAP) {\n const end = Math.min(start + LINES_PER_CHUNK, lines.length);\n const chunkLines = lines.slice(start, end);\n const chunkContent = chunkLines.join(\"\\n\");\n\n // Find symbols in this chunk\n const chunkSymbols = symbols.filter(\n (s) => s.line >= start + 1 && s.line <= end\n );\n\n // Determine chunk type based on symbols\n let chunkType: ChunkType = \"block\";\n let chunkName: string | undefined;\n let isExported = false;\n\n if (chunkSymbols.length > 0) {\n const primarySymbol = chunkSymbols[0];\n chunkType = this.symbolTypeToChunkType(primarySymbol.type);\n chunkName = primarySymbol.name;\n isExported = primarySymbol.isExported;\n }\n\n const chunkId = `${filepath}:${start + 1}-${end}`;\n\n chunks.push({\n id: chunkId,\n content: chunkContent,\n startLine: start + 1,\n endLine: end,\n type: chunkType,\n name: chunkName,\n isExported,\n });\n\n // Stop if we've reached the end\n if (end >= lines.length) break;\n }\n\n return chunks;\n }\n\n /**\n * Convert symbol type to chunk type.\n */\n private symbolTypeToChunkType(symbolType: string): ChunkType {\n switch (symbolType) {\n case \"function\":\n case \"method\":\n return \"function\";\n case \"class\":\n return \"class\";\n case \"interface\":\n return \"interface\";\n case \"type\":\n return \"type\";\n case \"enum\":\n return \"enum\";\n case \"variable\":\n return \"variable\";\n default:\n return \"block\";\n }\n }\n\n /**\n * Finalize indexing - build BM25 index and save symbol index.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const config = ctx.config;\n const coreDir = path.join(getRaggrepDir(ctx.rootDir, config), \"index\", \"core\");\n\n // Ensure directory exists\n await fs.mkdir(coreDir, { recursive: true });\n\n // Build BM25 index from all tokens\n this.bm25Index = new BM25Index();\n for (const [filepath, entry] of this.symbolIndex) {\n this.bm25Index.addDocument(filepath, entry.tokens);\n }\n\n // Save symbol index\n const symbolIndexData = {\n version: this.version,\n lastUpdated: new Date().toISOString(),\n files: Object.fromEntries(this.symbolIndex),\n bm25Data: this.bm25Index.serialize(),\n };\n\n await fs.writeFile(\n path.join(coreDir, \"symbols.json\"),\n JSON.stringify(symbolIndexData, null, 2)\n );\n\n console.log(` [Core] Symbol index built with ${this.symbolIndex.size} files`);\n }\n\n /**\n * Search the index.\n */\n async search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n const config = ctx.config;\n const topK = options?.topK ?? DEFAULT_TOP_K;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n\n // Load symbol index if not in memory\n if (this.symbolIndex.size === 0) {\n await this.loadSymbolIndex(ctx.rootDir, config);\n }\n\n if (!this.bm25Index || this.symbolIndex.size === 0) {\n return [];\n }\n\n // Tokenize query\n const queryTokens = tokenize(query);\n\n // Get BM25 scores\n const bm25Results = this.bm25Index.search(query, topK * 2);\n const bm25Scores = new Map(bm25Results.map((r) => [r.id, r.score]));\n\n // Check for symbol name matches (exact or partial)\n const symbolMatches = this.findSymbolMatches(queryTokens);\n\n // Combine results\n const results: SearchResult[] = [];\n\n for (const filepath of this.symbolIndex.keys()) {\n const entry = this.symbolIndex.get(filepath)!;\n const bm25Score = bm25Scores.get(filepath) ?? 0;\n const symbolScore = symbolMatches.get(filepath) ?? 0;\n\n // Skip if no match\n if (bm25Score === 0 && symbolScore === 0) continue;\n\n // Combined score: symbol matches are highly weighted\n const combinedScore = 0.6 * normalizeScore(bm25Score) + 0.4 * symbolScore;\n\n if (combinedScore >= minScore) {\n // Load file index to get chunks\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n // Find best matching chunk\n const bestChunk = this.findBestChunk(fileIndex.chunks, queryTokens, entry.symbols);\n\n results.push({\n filepath,\n chunk: bestChunk,\n score: combinedScore,\n moduleId: this.id,\n context: {\n bm25Score: normalizeScore(bm25Score),\n symbolScore,\n },\n });\n }\n }\n\n // Sort by score and limit\n return results\n .sort((a, b) => b.score - a.score)\n .slice(0, topK);\n }\n\n /**\n * Find symbol name matches for query tokens.\n */\n private findSymbolMatches(queryTokens: string[]): Map<string, number> {\n const matches = new Map<string, number>();\n\n for (const [filepath, entry] of this.symbolIndex) {\n let matchScore = 0;\n\n for (const symbol of entry.symbols) {\n const symbolName = symbol.name.toLowerCase();\n const symbolParts = symbolsToKeywords([symbol]);\n\n for (const token of queryTokens) {\n // Exact match on symbol name\n if (symbolName === token) {\n matchScore += symbol.isExported ? 1.0 : 0.8;\n }\n // Partial match on symbol name\n else if (symbolName.includes(token) || token.includes(symbolName)) {\n matchScore += symbol.isExported ? 0.5 : 0.4;\n }\n // Match on symbol parts (camelCase split)\n else if (symbolParts.some((p) => p === token)) {\n matchScore += symbol.isExported ? 0.3 : 0.2;\n }\n }\n }\n\n if (matchScore > 0) {\n // Normalize by number of query tokens\n matches.set(filepath, Math.min(1, matchScore / queryTokens.length));\n }\n }\n\n return matches;\n }\n\n /**\n * Find the best matching chunk based on query tokens.\n */\n private findBestChunk(\n chunks: Chunk[],\n queryTokens: string[],\n symbols: ExtractedSymbol[]\n ): Chunk {\n let bestChunk = chunks[0];\n let bestScore = 0;\n\n for (const chunk of chunks) {\n let score = 0;\n const chunkContent = chunk.content.toLowerCase();\n\n // Score based on query token presence\n for (const token of queryTokens) {\n if (chunkContent.includes(token)) {\n score += 1;\n }\n }\n\n // Bonus for named chunks matching query\n if (chunk.name) {\n const nameLower = chunk.name.toLowerCase();\n for (const token of queryTokens) {\n if (nameLower.includes(token)) {\n score += 2;\n }\n }\n }\n\n // Bonus for exported symbols\n if (chunk.isExported) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestChunk = chunk;\n }\n }\n\n return bestChunk;\n }\n\n /**\n * Load the symbol index from disk.\n */\n private async loadSymbolIndex(rootDir: string, config: any): Promise<void> {\n const coreDir = path.join(getRaggrepDir(rootDir, config), \"index\", \"core\");\n const symbolsPath = path.join(coreDir, \"symbols.json\");\n\n try {\n const content = await fs.readFile(symbolsPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Restore symbol index\n this.symbolIndex = new Map(Object.entries(data.files));\n\n // Restore BM25 index\n if (data.bm25Data) {\n this.bm25Index = BM25Index.deserialize(data.bm25Data);\n }\n } catch (error) {\n // Index doesn't exist yet\n this.symbolIndex = new Map();\n this.bm25Index = null;\n }\n }\n\n async dispose(): Promise<void> {\n this.symbolIndex.clear();\n this.bm25Index = null;\n }\n}\n\n",
|
|
22
|
+
"/**\n * Core Index Module\n *\n * Language-agnostic text search using:\n * - Regex-based symbol extraction\n * - BM25 keyword matching\n * - Line-based chunking\n *\n * Index location: .raggrep/index/core/\n *\n * This module provides fast, deterministic search without embeddings.\n * It complements language-specific modules by catching symbol matches.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n} from \"../../types\";\nimport type {\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from \"../../domain/entities\";\nimport {\n BM25Index,\n tokenize,\n normalizeScore,\n} from \"../../domain/services/bm25\";\nimport { getRaggrepDir } from \"../../infrastructure/config\";\nimport { introspectionToKeywords } from \"../../introspection\";\nimport {\n extractSymbols,\n symbolsToKeywords,\n type ExtractedSymbol,\n} from \"./symbols\";\n\n/** Default minimum score for core search results */\nconst DEFAULT_MIN_SCORE = 0.1;\n\n/** Default number of results */\nconst DEFAULT_TOP_K = 20;\n\n/** Lines per chunk for basic chunking */\nconst LINES_PER_CHUNK = 50;\n\n/** Overlap between chunks */\nconst CHUNK_OVERLAP = 10;\n\n/**\n * Core module-specific data stored with file index\n */\nexport interface CoreModuleData {\n /** Extracted symbols */\n symbols: ExtractedSymbol[];\n /** BM25 tokens for this file */\n tokens: string[];\n [key: string]: unknown;\n}\n\n/**\n * Stored symbol index for fast lookup\n */\ninterface SymbolIndexEntry {\n filepath: string;\n symbols: ExtractedSymbol[];\n tokens: string[];\n}\n\nexport class CoreModule implements IndexModule {\n readonly id = \"core\";\n readonly name = \"Core Search\";\n readonly description = \"Language-agnostic text search with symbol extraction\";\n readonly version = \"1.0.0\";\n\n private symbolIndex: Map<string, SymbolIndexEntry> = new Map();\n private bm25Index: BM25Index | null = null;\n private rootDir: string = \"\";\n\n async initialize(_config: ModuleConfig): Promise<void> {\n // Core module needs no initialization\n }\n\n /**\n * Index a single file.\n */\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n this.rootDir = ctx.rootDir;\n\n // Extract symbols using regex\n const symbols = extractSymbols(content);\n const symbolKeywords = symbolsToKeywords(symbols);\n\n // Tokenize content for BM25\n const contentTokens = tokenize(content);\n \n // Get introspection keywords (includes filename, path segments, etc.)\n const intro = ctx.getIntrospection?.(filepath);\n const introKeywords = intro ? introspectionToKeywords(intro) : [];\n \n const allTokens = [...new Set([...contentTokens, ...symbolKeywords, ...introKeywords])];\n\n // Create line-based chunks\n const chunks = this.createChunks(filepath, content, symbols);\n\n // Get file stats\n const stats = await ctx.getFileStats(filepath);\n\n // Store in memory for finalize\n this.symbolIndex.set(filepath, {\n filepath,\n symbols,\n tokens: allTokens,\n });\n\n // Build module data\n const moduleData: CoreModuleData = {\n symbols,\n tokens: allTokens,\n };\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n /**\n * Create line-based chunks from content.\n */\n private createChunks(\n filepath: string,\n content: string,\n symbols: ExtractedSymbol[]\n ): Chunk[] {\n const lines = content.split(\"\\n\");\n const chunks: Chunk[] = [];\n\n // Create overlapping chunks\n for (\n let start = 0;\n start < lines.length;\n start += LINES_PER_CHUNK - CHUNK_OVERLAP\n ) {\n const end = Math.min(start + LINES_PER_CHUNK, lines.length);\n const chunkLines = lines.slice(start, end);\n const chunkContent = chunkLines.join(\"\\n\");\n\n // Find symbols in this chunk\n const chunkSymbols = symbols.filter(\n (s) => s.line >= start + 1 && s.line <= end\n );\n\n // Determine chunk type based on symbols\n let chunkType: ChunkType = \"block\";\n let chunkName: string | undefined;\n let isExported = false;\n\n if (chunkSymbols.length > 0) {\n const primarySymbol = chunkSymbols[0];\n chunkType = this.symbolTypeToChunkType(primarySymbol.type);\n chunkName = primarySymbol.name;\n isExported = primarySymbol.isExported;\n }\n\n const chunkId = `${filepath}:${start + 1}-${end}`;\n\n chunks.push({\n id: chunkId,\n content: chunkContent,\n startLine: start + 1,\n endLine: end,\n type: chunkType,\n name: chunkName,\n isExported,\n });\n\n // Stop if we've reached the end\n if (end >= lines.length) break;\n }\n\n return chunks;\n }\n\n /**\n * Convert symbol type to chunk type.\n */\n private symbolTypeToChunkType(symbolType: string): ChunkType {\n switch (symbolType) {\n case \"function\":\n case \"method\":\n return \"function\";\n case \"class\":\n return \"class\";\n case \"interface\":\n return \"interface\";\n case \"type\":\n return \"type\";\n case \"enum\":\n return \"enum\";\n case \"variable\":\n return \"variable\";\n default:\n return \"block\";\n }\n }\n\n /**\n * Finalize indexing - build BM25 index and save symbol index.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const config = ctx.config;\n const coreDir = path.join(\n getRaggrepDir(ctx.rootDir, config),\n \"index\",\n \"core\"\n );\n\n // Ensure directory exists\n await fs.mkdir(coreDir, { recursive: true });\n\n // Build BM25 index from all tokens\n this.bm25Index = new BM25Index();\n for (const [filepath, entry] of this.symbolIndex) {\n this.bm25Index.addDocument(filepath, entry.tokens);\n }\n\n // Save symbol index\n const symbolIndexData = {\n version: this.version,\n lastUpdated: new Date().toISOString(),\n files: Object.fromEntries(this.symbolIndex),\n bm25Data: this.bm25Index.serialize(),\n };\n\n await fs.writeFile(\n path.join(coreDir, \"symbols.json\"),\n JSON.stringify(symbolIndexData, null, 2)\n );\n\n console.log(\n ` [Core] Symbol index built with ${this.symbolIndex.size} files`\n );\n }\n\n /**\n * Search the index.\n */\n async search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n const config = ctx.config;\n const topK = options?.topK ?? DEFAULT_TOP_K;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n\n // Load symbol index if not in memory\n if (this.symbolIndex.size === 0) {\n await this.loadSymbolIndex(ctx.rootDir, config);\n }\n\n if (!this.bm25Index || this.symbolIndex.size === 0) {\n return [];\n }\n\n // Tokenize query\n const queryTokens = tokenize(query);\n\n // Get BM25 scores\n const bm25Results = this.bm25Index.search(query, topK * 2);\n const bm25Scores = new Map(bm25Results.map((r) => [r.id, r.score]));\n\n // Check for symbol name matches (exact or partial)\n const symbolMatches = this.findSymbolMatches(queryTokens);\n\n // Combine results\n const results: SearchResult[] = [];\n\n for (const filepath of this.symbolIndex.keys()) {\n const entry = this.symbolIndex.get(filepath)!;\n const bm25Score = bm25Scores.get(filepath) ?? 0;\n const symbolScore = symbolMatches.get(filepath) ?? 0;\n\n // Skip if no match\n if (bm25Score === 0 && symbolScore === 0) continue;\n\n // Combined score: symbol matches are highly weighted\n const combinedScore = 0.6 * normalizeScore(bm25Score) + 0.4 * symbolScore;\n\n if (combinedScore >= minScore) {\n // Load file index to get chunks\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n // Find best matching chunk\n const bestChunk = this.findBestChunk(\n fileIndex.chunks,\n queryTokens,\n entry.symbols\n );\n\n results.push({\n filepath,\n chunk: bestChunk,\n score: combinedScore,\n moduleId: this.id,\n context: {\n bm25Score: normalizeScore(bm25Score),\n symbolScore,\n },\n });\n }\n }\n\n // Sort by score and limit\n return results.sort((a, b) => b.score - a.score).slice(0, topK);\n }\n\n /**\n * Find symbol name matches for query tokens.\n */\n private findSymbolMatches(queryTokens: string[]): Map<string, number> {\n const matches = new Map<string, number>();\n\n for (const [filepath, entry] of this.symbolIndex) {\n let matchScore = 0;\n\n for (const symbol of entry.symbols) {\n const symbolName = symbol.name.toLowerCase();\n const symbolParts = symbolsToKeywords([symbol]);\n\n for (const token of queryTokens) {\n // Exact match on symbol name\n if (symbolName === token) {\n matchScore += symbol.isExported ? 1.0 : 0.8;\n }\n // Partial match on symbol name\n else if (symbolName.includes(token) || token.includes(symbolName)) {\n matchScore += symbol.isExported ? 0.5 : 0.4;\n }\n // Match on symbol parts (camelCase split)\n else if (symbolParts.some((p) => p === token)) {\n matchScore += symbol.isExported ? 0.3 : 0.2;\n }\n }\n }\n\n if (matchScore > 0) {\n // Normalize by number of query tokens\n matches.set(filepath, Math.min(1, matchScore / queryTokens.length));\n }\n }\n\n return matches;\n }\n\n /**\n * Find the best matching chunk based on query tokens.\n */\n private findBestChunk(\n chunks: Chunk[],\n queryTokens: string[],\n symbols: ExtractedSymbol[]\n ): Chunk {\n let bestChunk = chunks[0];\n let bestScore = 0;\n\n for (const chunk of chunks) {\n let score = 0;\n const chunkContent = chunk.content.toLowerCase();\n\n // Score based on query token presence\n for (const token of queryTokens) {\n if (chunkContent.includes(token)) {\n score += 1;\n }\n }\n\n // Bonus for named chunks matching query\n if (chunk.name) {\n const nameLower = chunk.name.toLowerCase();\n for (const token of queryTokens) {\n if (nameLower.includes(token)) {\n score += 2;\n }\n }\n }\n\n // Bonus for exported symbols\n if (chunk.isExported) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestChunk = chunk;\n }\n }\n\n return bestChunk;\n }\n\n /**\n * Load the symbol index from disk.\n */\n private async loadSymbolIndex(rootDir: string, config: any): Promise<void> {\n const coreDir = path.join(getRaggrepDir(rootDir, config), \"index\", \"core\");\n const symbolsPath = path.join(coreDir, \"symbols.json\");\n\n try {\n const content = await fs.readFile(symbolsPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Restore symbol index\n this.symbolIndex = new Map(Object.entries(data.files));\n\n // Restore BM25 index\n if (data.bm25Data) {\n this.bm25Index = BM25Index.deserialize(data.bm25Data);\n }\n } catch (error) {\n // Index doesn't exist yet\n this.symbolIndex = new Map();\n this.bm25Index = null;\n }\n }\n\n async dispose(): Promise<void> {\n this.symbolIndex.clear();\n this.bm25Index = null;\n }\n}\n",
|
|
14
23
|
"/**\n * Similarity Service\n *\n * Pure mathematical functions for computing vector similarity.\n * No external dependencies.\n */\n\n/**\n * Calculate cosine similarity between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Similarity score between -1 and 1 (1 = identical, 0 = orthogonal, -1 = opposite)\n * @throws Error if vectors have different lengths\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/**\n * Calculate Euclidean distance between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Distance (0 = identical, larger = more different)\n */\nexport function euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = a[i] - b[i];\n sum += diff * diff;\n }\n\n return Math.sqrt(sum);\n}\n\n",
|
|
15
24
|
"/**\n * TypeScript/JavaScript Code Parser\n * \n * Uses the TypeScript Compiler API for accurate AST-based parsing.\n * Extracts semantic chunks: functions, classes, interfaces, types, enums.\n */\n\nimport * as ts from 'typescript';\n\n/**\n * Chunk types that can be extracted from code\n */\nexport type ChunkType = \n | 'function' \n | 'class' \n | 'interface' \n | 'type' \n | 'enum'\n | 'variable'\n | 'block' \n | 'file';\n\n/**\n * Represents a parsed chunk of code with location information\n */\nexport interface ParsedChunk {\n /** The source code content */\n content: string;\n /** 1-based start line number */\n startLine: number;\n /** 1-based end line number */\n endLine: number;\n /** The type of code construct */\n type: ChunkType;\n /** Name of the construct (function name, class name, etc.) */\n name?: string;\n /** Whether this is exported */\n isExported?: boolean;\n /** JSDoc comment if present */\n jsDoc?: string;\n}\n\n/**\n * Parse code into semantic chunks based on file extension\n * @param content - The source code content\n * @param filepath - The file path (used to determine language)\n * @returns Array of parsed chunks\n */\nexport function parseCode(content: string, filepath: string): ParsedChunk[] {\n const ext = filepath.split('.').pop()?.toLowerCase();\n\n // For TypeScript/JavaScript files, use the TypeScript parser\n if (['ts', 'tsx', 'js', 'jsx', 'mts', 'cts', 'mjs', 'cjs'].includes(ext || '')) {\n return parseTypeScript(content, filepath);\n }\n\n // For other files, use simple line-based chunking\n return parseGenericCode(content);\n}\n\n/**\n * Parse TypeScript/JavaScript code using the TypeScript Compiler API\n * @param content - The source code content\n * @param filepath - The file path\n * @returns Array of parsed chunks\n */\nfunction parseTypeScript(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split('\\n');\n\n // Create a source file from the content\n const sourceFile = ts.createSourceFile(\n filepath,\n content,\n ts.ScriptTarget.Latest,\n true, // setParentNodes\n filepath.endsWith('.tsx') || filepath.endsWith('.jsx') \n ? ts.ScriptKind.TSX \n : ts.ScriptKind.TS\n );\n\n /**\n * Get line numbers for a node (1-based)\n */\n function getLineNumbers(node: ts.Node): { startLine: number; endLine: number } {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());\n return {\n startLine: start.line + 1,\n endLine: end.line + 1,\n };\n }\n\n /**\n * Get the source text for a node\n */\n function getNodeText(node: ts.Node): string {\n return node.getText(sourceFile);\n }\n\n /**\n * Check if a node has export modifier\n */\n function isExported(node: ts.Node): boolean {\n if (!ts.canHaveModifiers(node)) return false;\n const modifiers = ts.getModifiers(node);\n return modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;\n }\n\n /**\n * Get JSDoc comment for a node\n */\n function getJSDoc(node: ts.Node): string | undefined {\n const jsDocNodes = ts.getJSDocCommentsAndTags(node);\n if (jsDocNodes.length === 0) return undefined;\n \n return jsDocNodes\n .map(doc => doc.getText(sourceFile))\n .join('\\n');\n }\n\n /**\n * Get function name from various function declarations\n */\n function getFunctionName(node: ts.Node): string | undefined {\n if (ts.isFunctionDeclaration(node) && node.name) {\n return node.name.text;\n }\n if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {\n return node.name.text;\n }\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n return node.name.text;\n }\n return undefined;\n }\n\n /**\n * Visit nodes recursively to extract chunks\n */\n function visit(node: ts.Node): void {\n const { startLine, endLine } = getLineNumbers(node);\n\n // Function declarations (including async)\n if (ts.isFunctionDeclaration(node) && node.name) {\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'function',\n name: node.name.text,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return; // Don't recurse into function body\n }\n\n // Arrow functions and function expressions assigned to variables\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer && \n (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer))) {\n const name = ts.isIdentifier(decl.name) ? decl.name.text : undefined;\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'function',\n name,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return;\n }\n }\n }\n\n // Class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'class',\n name: node.name.text,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return; // Don't recurse into class body (it's included in the chunk)\n }\n\n // Interface declarations\n if (ts.isInterfaceDeclaration(node)) {\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'interface',\n name: node.name.text,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return;\n }\n\n // Type alias declarations\n if (ts.isTypeAliasDeclaration(node)) {\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'type',\n name: node.name.text,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return;\n }\n\n // Enum declarations\n if (ts.isEnumDeclaration(node)) {\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'enum',\n name: node.name.text,\n isExported: isExported(node),\n jsDoc: getJSDoc(node),\n });\n return;\n }\n\n // Exported variable declarations (constants)\n if (ts.isVariableStatement(node) && isExported(node)) {\n for (const decl of node.declarationList.declarations) {\n // Skip if it's a function (already handled above)\n if (decl.initializer && \n (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer))) {\n continue;\n }\n const name = ts.isIdentifier(decl.name) ? decl.name.text : undefined;\n chunks.push({\n content: getNodeText(node),\n startLine,\n endLine,\n type: 'variable',\n name,\n isExported: true,\n jsDoc: getJSDoc(node),\n });\n }\n return;\n }\n\n // Recurse into children\n ts.forEachChild(node, visit);\n }\n\n // Start visiting from the root\n ts.forEachChild(sourceFile, visit);\n\n // If no semantic chunks found, fall back to block-based chunking\n if (chunks.length === 0) {\n return parseGenericCode(content);\n }\n\n return chunks;\n}\n\n/**\n * Parse generic code using line-based chunking\n * Used for non-TypeScript/JavaScript files or as fallback\n * @param content - The source code content\n * @returns Array of parsed chunks\n */\nfunction parseGenericCode(content: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split('\\n');\n const CHUNK_SIZE = 30; // lines per chunk\n const OVERLAP = 5; // overlap between chunks\n\n // If file is small, treat as single chunk\n if (lines.length <= CHUNK_SIZE) {\n return [\n {\n content: content,\n startLine: 1,\n endLine: lines.length,\n type: 'file',\n },\n ];\n }\n\n // Split into overlapping chunks\n for (let i = 0; i < lines.length; i += CHUNK_SIZE - OVERLAP) {\n const endIdx = Math.min(i + CHUNK_SIZE, lines.length);\n chunks.push({\n content: lines.slice(i, endIdx).join('\\n'),\n startLine: i + 1,\n endLine: endIdx,\n type: 'block',\n });\n\n if (endIdx >= lines.length) break;\n }\n\n return chunks;\n}\n\n/**\n * Generate a unique chunk ID from filepath and line numbers\n * @param filepath - The source file path\n * @param startLine - Start line number\n * @param endLine - End line number\n * @returns Unique chunk identifier\n */\nexport function generateChunkId(filepath: string, startLine: number, endLine: number): string {\n const safePath = filepath.replace(/[/\\\\]/g, '-').replace(/\\./g, '_');\n return `${safePath}-${startLine}-${endLine}`;\n}\n",
|
|
16
25
|
"/**\n * File-based Index Storage Adapter\n * \n * Implements the IndexStorage port using the filesystem.\n * Index data is stored as JSON files in the .raggrep directory.\n */\n\nimport type { IndexStorage } from '../../domain/ports';\nimport type { FileSystem } from '../../domain/ports';\nimport type { \n Config, \n FileIndex, \n ModuleManifest, \n GlobalManifest,\n FileSummary,\n SymbolicIndexMeta,\n Tier1Manifest \n} from '../../domain/entities';\nimport { createDefaultConfig } from '../../domain/entities';\n\n/**\n * Filesystem-based index storage.\n * \n * Structure:\n * .raggrep/\n * ├── config.json\n * ├── manifest.json (global)\n * └── index/\n * └── <moduleId>/\n * ├── manifest.json (module)\n * ├── symbolic/\n * │ ├── _meta.json (BM25 statistics)\n * │ └── <filepath>.json (per-file summaries)\n * └── <filepath>.json (file indexes with embeddings)\n */\nexport class FileIndexStorage implements IndexStorage {\n private fs: FileSystem;\n private rootDir: string;\n private indexDir: string;\n\n constructor(fs: FileSystem, rootDir: string, indexDir: string = '.raggrep') {\n this.fs = fs;\n this.rootDir = fs.resolve(rootDir);\n this.indexDir = indexDir;\n }\n\n // ============================================================================\n // Path Helpers\n // ============================================================================\n\n private getIndexPath(): string {\n return this.fs.join(this.rootDir, this.indexDir);\n }\n\n private getConfigPath(): string {\n return this.fs.join(this.getIndexPath(), 'config.json');\n }\n\n private getGlobalManifestPath(): string {\n return this.fs.join(this.getIndexPath(), 'manifest.json');\n }\n\n private getModuleIndexPath(moduleId: string): string {\n return this.fs.join(this.getIndexPath(), 'index', moduleId);\n }\n\n private getModuleManifestPath(moduleId: string): string {\n return this.fs.join(this.getModuleIndexPath(moduleId), 'manifest.json');\n }\n\n // Symbolic index paths\n private getSymbolicPath(moduleId: string): string {\n return this.fs.join(this.getModuleIndexPath(moduleId), 'symbolic');\n }\n\n private getSymbolicMetaPath(moduleId: string): string {\n return this.fs.join(this.getSymbolicPath(moduleId), '_meta.json');\n }\n\n private getSymbolicFilePath(moduleId: string, filepath: string): string {\n const jsonPath = filepath.replace(/\\.[^.]+$/, '.json');\n return this.fs.join(this.getSymbolicPath(moduleId), jsonPath);\n }\n\n // File index paths (embeddings)\n private getFileIndexPath(moduleId: string, filepath: string): string {\n const jsonPath = filepath.replace(/\\.[^.]+$/, '.json');\n return this.fs.join(this.getModuleIndexPath(moduleId), jsonPath);\n }\n\n /** @deprecated Use getSymbolicMetaPath instead */\n private getTier1Path(moduleId: string): string {\n return this.fs.join(this.getModuleIndexPath(moduleId), 'tier1.json');\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n async loadConfig(): Promise<Config> {\n try {\n const content = await this.fs.readFile(this.getConfigPath());\n const savedConfig = JSON.parse(content) as Partial<Config>;\n return { ...createDefaultConfig(), ...savedConfig };\n } catch {\n return createDefaultConfig();\n }\n }\n\n async saveConfig(config: Config): Promise<void> {\n await this.fs.writeFile(this.getConfigPath(), JSON.stringify(config, null, 2));\n }\n\n // ============================================================================\n // Global Manifest\n // ============================================================================\n\n async loadGlobalManifest(): Promise<GlobalManifest | null> {\n try {\n const content = await this.fs.readFile(this.getGlobalManifestPath());\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n async saveGlobalManifest(manifest: GlobalManifest): Promise<void> {\n await this.fs.writeFile(this.getGlobalManifestPath(), JSON.stringify(manifest, null, 2));\n }\n\n // ============================================================================\n // Module Manifest\n // ============================================================================\n\n async loadModuleManifest(moduleId: string): Promise<ModuleManifest | null> {\n try {\n const content = await this.fs.readFile(this.getModuleManifestPath(moduleId));\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n async saveModuleManifest(moduleId: string, manifest: ModuleManifest): Promise<void> {\n await this.fs.writeFile(this.getModuleManifestPath(moduleId), JSON.stringify(manifest, null, 2));\n }\n\n // ============================================================================\n // Symbolic Index (lightweight file summaries for keyword search)\n // ============================================================================\n\n async loadSymbolicMeta(moduleId: string): Promise<SymbolicIndexMeta | null> {\n try {\n const content = await this.fs.readFile(this.getSymbolicMetaPath(moduleId));\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n async saveSymbolicMeta(moduleId: string, meta: SymbolicIndexMeta): Promise<void> {\n await this.fs.writeFile(this.getSymbolicMetaPath(moduleId), JSON.stringify(meta, null, 2));\n }\n\n async loadFileSummary(moduleId: string, filepath: string): Promise<FileSummary | null> {\n try {\n const content = await this.fs.readFile(this.getSymbolicFilePath(moduleId, filepath));\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n async saveFileSummary(moduleId: string, filepath: string, summary: FileSummary): Promise<void> {\n await this.fs.writeFile(this.getSymbolicFilePath(moduleId, filepath), JSON.stringify(summary, null, 2));\n }\n\n async deleteFileSummary(moduleId: string, filepath: string): Promise<void> {\n try {\n await this.fs.deleteFile(this.getSymbolicFilePath(moduleId, filepath));\n } catch {\n // Ignore if file doesn't exist\n }\n }\n\n /**\n * List all file summaries by reading the module manifest.\n * Returns filepaths relative to the project root.\n */\n async listFileSummaries(moduleId: string): Promise<string[]> {\n const manifest = await this.loadModuleManifest(moduleId);\n if (!manifest) {\n return [];\n }\n return Object.keys(manifest.files);\n }\n\n // ============================================================================\n // Tier 1 Index (deprecated - use Symbolic Index instead)\n // ============================================================================\n\n /** @deprecated Use loadSymbolicMeta and loadFileSummary instead */\n async loadTier1Index(moduleId: string): Promise<Tier1Manifest | null> {\n try {\n const content = await this.fs.readFile(this.getTier1Path(moduleId));\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n /** @deprecated Use saveSymbolicMeta and saveFileSummary instead */\n async saveTier1Index(moduleId: string, manifest: Tier1Manifest): Promise<void> {\n await this.fs.writeFile(this.getTier1Path(moduleId), JSON.stringify(manifest, null, 2));\n }\n\n // ============================================================================\n // File Indexes (full index with embeddings)\n // ============================================================================\n\n async loadFileIndex(moduleId: string, filepath: string): Promise<FileIndex | null> {\n try {\n const content = await this.fs.readFile(this.getFileIndexPath(moduleId, filepath));\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n async saveFileIndex(moduleId: string, filepath: string, index: FileIndex): Promise<void> {\n await this.fs.writeFile(this.getFileIndexPath(moduleId, filepath), JSON.stringify(index, null, 2));\n }\n\n async deleteFileIndex(moduleId: string, filepath: string): Promise<void> {\n await this.fs.deleteFile(this.getFileIndexPath(moduleId, filepath));\n }\n\n async listIndexedFiles(moduleId: string): Promise<string[]> {\n const manifest = await this.loadModuleManifest(moduleId);\n if (!manifest) {\n return [];\n }\n return Object.keys(manifest.files);\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n async indexExists(): Promise<boolean> {\n return this.fs.exists(this.getIndexPath());\n }\n\n async deleteIndex(): Promise<void> {\n // Note: This is a simplified implementation\n // A full implementation would recursively delete the directory\n const indexPath = this.getIndexPath();\n if (await this.fs.exists(indexPath)) {\n // For safety, we don't implement recursive delete here\n throw new Error('deleteIndex not fully implemented - please delete .raggrep manually');\n }\n }\n\n getRootDir(): string {\n return this.rootDir;\n }\n}\n\n",
|
|
@@ -19,15 +28,12 @@
|
|
|
19
28
|
"/**\n * Storage Infrastructure\n *\n * Handles persistence of index data to the filesystem.\n */\n\nexport { FileIndexStorage } from \"./fileIndexStorage\";\nexport { SymbolicIndex, getSymbolicPath } from \"./symbolicIndex\";\n\n",
|
|
20
29
|
"/**\n * TypeScript Language Index Module\n * \n * Provides TypeScript/JavaScript-aware code search using:\n * - AST parsing via TypeScript Compiler API\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n * \n * Index location: .raggrep/index/language/typescript/\n */\n\nimport * as path from 'path';\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from '../../../types';\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from '../../../infrastructure/embeddings';\nimport { cosineSimilarity } from '../../../domain/services/similarity';\nimport { BM25Index, normalizeScore } from '../../../domain/services/bm25';\nimport { getEmbeddingConfigFromModule, getRaggrepDir } from '../../../infrastructure/config';\nimport { parseCode, generateChunkId } from './parseCode';\nimport { SymbolicIndex } from '../../../infrastructure/storage';\nimport { extractKeywords } from '../../../domain/services/keywords';\nimport type { EmbeddingConfig } from '../../../domain/ports';\nimport type { FileSummary } from '../../../domain/entities';\nimport { parsePathContext, formatPathContextForEmbedding } from '../../../domain/services/keywords';\n\n/** Default minimum similarity score for search results */\nexport const DEFAULT_MIN_SCORE = 0.15;\n\n/** Default number of results to return */\nexport const DEFAULT_TOP_K = 10;\n\n/** Weight for semantic similarity in hybrid scoring (0-1) */\nconst SEMANTIC_WEIGHT = 0.7;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.3;\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface SemanticModuleData {\n embeddings: number[][];\n /** Store the model used for these embeddings for compatibility checking */\n embeddingModel: string;\n [key: string]: unknown; // Index signature for compatibility with Record<string, unknown>\n}\n\n/** Number of candidate files to retrieve from Tier 1 before loading Tier 2 */\nconst TIER1_CANDIDATE_MULTIPLIER = 3;\n\nexport class TypeScriptModule implements IndexModule {\n readonly id = 'language/typescript';\n readonly name = 'TypeScript Search';\n readonly description = 'TypeScript-aware code search with AST parsing and semantic embeddings';\n readonly version = '1.0.0';\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private rootDir: string = '';\n\n async initialize(config: ModuleConfig): Promise<void> {\n // Extract embedding config from module options\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n \n // Configure the embedding provider\n configureEmbeddings(this.embeddingConfig);\n \n // Clear pending summaries for fresh indexing\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Store rootDir for finalize\n this.rootDir = ctx.rootDir;\n \n // Parse code into chunks\n const parsedChunks = parseCode(content, filepath);\n\n if (parsedChunks.length === 0) {\n return null;\n }\n\n // Parse path context for structural awareness\n const pathContext = parsePathContext(filepath);\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n\n // Generate embeddings for all chunks with path context\n // Prepending path context helps the embedding model understand file structure\n const chunkContents = parsedChunks.map((c) => {\n // For named chunks, include the name for better embedding\n const namePrefix = c.name ? `${c.name}: ` : '';\n return `${pathPrefix} ${namePrefix}${c.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks with all metadata\n const chunks: Chunk[] = parsedChunks.map((pc) => ({\n id: generateChunkId(filepath, pc.startLine, pc.endLine),\n content: pc.content,\n startLine: pc.startLine,\n endLine: pc.endLine,\n type: pc.type,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.jsDoc,\n }));\n\n // Extract references (imports)\n const references = this.extractReferences(content, filepath);\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: SemanticModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build Tier 1 summary for this file\n const chunkTypes = [...new Set(parsedChunks.map(pc => pc.type))] as ChunkType[];\n const exports = parsedChunks\n .filter(pc => pc.isExported && pc.name)\n .map(pc => pc.name!);\n \n // Extract keywords from all chunks + path keywords\n const allKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach(k => allKeywords.add(k));\n }\n // Add path keywords\n pathContext.keywords.forEach(k => allKeywords.add(k));\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: Array.from(allKeywords),\n exports,\n lastModified: stats.lastModified,\n // Include parsed path context for search boosting\n pathContext: {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n },\n };\n \n // Store summary for finalize\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n references,\n };\n }\n\n /**\n * Finalize indexing by building and saving the symbolic index\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n \n // Initialize symbolic index\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n \n // Add all pending summaries\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFile(summary);\n }\n \n // Build BM25 index from summaries\n this.symbolicIndex.buildBM25Index();\n \n // Save to disk (creates symbolic/ folder with per-file summaries)\n await this.symbolicIndex.save();\n \n console.log(` Symbolic index built with ${this.pendingSummaries.size} file summaries`);\n \n // Clear pending summaries\n this.pendingSummaries.clear();\n }\n\n /**\n * Search the semantic index for chunks matching the query.\n * \n * Uses a tiered approach for efficient search:\n * 1. Tier 1: Use BM25 on file summaries to find candidate files\n * 2. Tier 2: Load only candidate files and compute semantic similarity\n * \n * @param query - Natural language search query\n * @param ctx - Search context with index access\n * @param options - Search options (topK, minScore, filePatterns)\n * @returns Array of search results sorted by relevance\n */\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const { topK = DEFAULT_TOP_K, minScore = DEFAULT_MIN_SCORE, filePatterns } = options;\n\n // Load symbolic index for candidate filtering\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n \n let candidateFiles: string[];\n \n try {\n await symbolicIndex.initialize();\n \n // Use BM25 keyword search on symbolic index to find candidate files\n const maxCandidates = topK * TIER1_CANDIDATE_MULTIPLIER;\n candidateFiles = symbolicIndex.findCandidates(query, maxCandidates);\n \n // If no candidates found via BM25, fall back to all files\n if (candidateFiles.length === 0) {\n candidateFiles = symbolicIndex.getAllFiles();\n }\n } catch {\n // Symbolic index doesn't exist, fall back to loading all files\n candidateFiles = await ctx.listIndexedFiles();\n }\n\n // Apply file pattern filter\n if (filePatterns && filePatterns.length > 0) {\n candidateFiles = candidateFiles.filter(filepath => {\n return filePatterns.some(pattern => {\n if (pattern.startsWith('*.')) {\n const ext = pattern.slice(1);\n return filepath.endsWith(ext);\n }\n return filepath.includes(pattern);\n });\n });\n }\n\n // Get query embedding for semantic search\n const queryEmbedding = await getEmbedding(query);\n\n // Tier 2: Load only candidate files and compute scores\n const bm25Index = new BM25Index();\n const allChunksData: Array<{\n filepath: string;\n chunk: Chunk;\n embedding: number[];\n }> = [];\n\n for (const filepath of candidateFiles) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as SemanticModuleData;\n if (!moduleData?.embeddings) continue;\n\n for (let i = 0; i < fileIndex.chunks.length; i++) {\n const chunk = fileIndex.chunks[i];\n const embedding = moduleData.embeddings[i];\n\n if (!embedding) continue;\n\n allChunksData.push({\n filepath: fileIndex.filepath,\n chunk,\n embedding,\n });\n\n // Add to BM25 index for chunk-level keyword matching\n bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\n // Perform BM25 search at chunk level\n const bm25Results = bm25Index.search(query, topK * 3);\n const bm25Scores = new Map<string, number>();\n \n for (const result of bm25Results) {\n bm25Scores.set(result.id, normalizeScore(result.score, 3));\n }\n\n // Extract query terms for path matching\n const queryTerms = query.toLowerCase().split(/\\s+/).filter(t => t.length > 2);\n \n // Build path boost map from file summaries\n const pathBoosts = new Map<string, number>();\n for (const filepath of candidateFiles) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const ctx = summary.pathContext;\n \n // Check if query terms match domain\n if (ctx.domain && queryTerms.some(t => ctx.domain!.includes(t) || t.includes(ctx.domain!))) {\n boost += 0.1;\n }\n \n // Check if query terms match layer\n if (ctx.layer && queryTerms.some(t => ctx.layer!.includes(t) || t.includes(ctx.layer!))) {\n boost += 0.05;\n }\n \n // Check if query terms match path segments\n const segmentMatch = ctx.segments.some(seg => \n queryTerms.some(t => seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase()))\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n \n pathBoosts.set(filepath, boost);\n }\n }\n\n // Calculate hybrid scores for all chunks\n const results: SearchResult[] = [];\n\n for (const { filepath, chunk, embedding } of allChunksData) {\n const semanticScore = cosineSimilarity(queryEmbedding, embedding);\n const bm25Score = bm25Scores.get(chunk.id) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n \n // Hybrid score: weighted combination of semantic, BM25, and path boost\n const hybridScore = (SEMANTIC_WEIGHT * semanticScore) + (BM25_WEIGHT * bm25Score) + pathBoost;\n\n if (hybridScore >= minScore || bm25Score > 0.3) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n },\n });\n }\n }\n\n // Sort by score descending and take top K\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n private extractReferences(content: string, filepath: string): string[] {\n const references: string[] = [];\n\n // Extract import statements\n const importRegex = /import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n const requireRegex = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n if (importPath.startsWith('.')) {\n const dir = path.dirname(filepath);\n const resolved = path.normalize(path.join(dir, importPath));\n references.push(resolved);\n }\n }\n\n while ((match = requireRegex.exec(content)) !== null) {\n const importPath = match[1];\n if (importPath.startsWith('.')) {\n const dir = path.dirname(filepath);\n const resolved = path.normalize(path.join(dir, importPath));\n references.push(resolved);\n }\n }\n\n return references;\n }\n}\n",
|
|
21
30
|
"// Module registry - manages available index modules\nimport { IndexModule, ModuleRegistry, Config } from '../types';\n\nclass ModuleRegistryImpl implements ModuleRegistry {\n private modules = new Map<string, IndexModule>();\n\n register(module: IndexModule): void {\n if (this.modules.has(module.id)) {\n console.warn(`Module '${module.id}' is already registered, overwriting...`);\n }\n this.modules.set(module.id, module);\n }\n\n get(id: string): IndexModule | undefined {\n return this.modules.get(id);\n }\n\n list(): IndexModule[] {\n return Array.from(this.modules.values());\n }\n\n getEnabled(config: Config): IndexModule[] {\n const enabledIds = new Set(\n config.modules\n .filter(m => m.enabled)\n .map(m => m.id)\n );\n \n return this.list().filter(m => enabledIds.has(m.id));\n }\n}\n\n// Global singleton registry\nexport const registry: ModuleRegistry = new ModuleRegistryImpl();\n\n// Auto-register built-in modules\nexport async function registerBuiltInModules(): Promise<void> {\n // Dynamic import to avoid circular dependencies\n const { CoreModule } = await import('./core');\n const { TypeScriptModule } = await import('./language/typescript');\n \n // Register core module first (fast, language-agnostic)\n registry.register(new CoreModule());\n \n // Register language-specific modules\n registry.register(new TypeScriptModule());\n}\n",
|
|
22
|
-
"/**\n * Project Structure Detection\n *\n * Auto-detects monorepo structure and project types from:\n * - Folder layout (apps/, packages/, etc.)\n * - package.json files (for TypeScript/JavaScript projects)\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type { Project, ProjectType, ProjectStructure, Scope } from \"./types\";\n\n/** Maximum depth to scan for package.json files */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Directories to skip when scanning for package.json */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".raggrep\",\n]);\n\n/**\n * Patterns for detecting project directories.\n */\nconst PROJECT_PATTERNS: Array<{\n pattern: RegExp;\n type: ProjectType;\n defaultScope: Scope;\n}> = [\n // apps/ - typically frontend or backend apps\n { pattern: /^apps\\/([^/]+)/, type: \"app\", defaultScope: \"unknown\" },\n // packages/ - shared libraries\n { pattern: /^packages\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n // libs/ - shared libraries\n { pattern: /^libs\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n // services/ - backend services\n { pattern: /^services\\/([^/]+)/, type: \"service\", defaultScope: \"backend\" },\n // scripts/ - tooling\n { pattern: /^scripts\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n // tools/ - tooling\n { pattern: /^tools\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n];\n\n/**\n * Keywords for detecting scope from project name or path.\n */\nconst SCOPE_KEYWORDS: Record<Scope, string[]> = {\n frontend: [\n \"web\",\n \"webapp\",\n \"frontend\",\n \"client\",\n \"ui\",\n \"app\",\n \"mobile\",\n \"react\",\n \"vue\",\n \"angular\",\n \"next\",\n \"nuxt\",\n ],\n backend: [\n \"api\",\n \"server\",\n \"backend\",\n \"service\",\n \"worker\",\n \"lambda\",\n \"functions\",\n ],\n shared: [\"shared\", \"common\", \"utils\", \"lib\", \"core\", \"types\", \"models\"],\n tooling: [\n \"scripts\",\n \"tools\",\n \"cli\",\n \"devtools\",\n \"build\",\n \"config\",\n \"infra\",\n ],\n unknown: [],\n};\n\n/**\n * Detect scope from project name.\n */\nexport function detectScopeFromName(name: string): Scope {\n const nameLower = name.toLowerCase();\n\n for (const [scope, keywords] of Object.entries(SCOPE_KEYWORDS)) {\n if (scope === \"unknown\") continue;\n for (const keyword of keywords) {\n if (nameLower.includes(keyword)) {\n return scope as Scope;\n }\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Parsed information from a package.json file.\n */\ninterface PackageJsonInfo {\n name: string;\n relativePath: string;\n type: ProjectType;\n hasWorkspaces: boolean;\n}\n\n/**\n * Scan for package.json files and extract project info.\n */\nasync function scanForPackageJsons(\n rootDir: string,\n currentDir: string = \"\",\n depth: number = 0\n): Promise<PackageJsonInfo[]> {\n if (depth > MAX_SCAN_DEPTH) return [];\n\n const results: PackageJsonInfo[] = [];\n const fullDir = currentDir ? path.join(rootDir, currentDir) : rootDir;\n\n try {\n const entries = await fs.readdir(fullDir, { withFileTypes: true });\n\n // Check for package.json in current directory\n const hasPackageJson = entries.some(\n (e) => e.isFile() && e.name === \"package.json\"\n );\n\n if (hasPackageJson && currentDir) {\n // Don't add root package.json as a project\n const info = await parsePackageJson(rootDir, currentDir);\n if (info) {\n results.push(info);\n }\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const subPath = currentDir ? `${currentDir}/${entry.name}` : entry.name;\n const subResults = await scanForPackageJsons(rootDir, subPath, depth + 1);\n results.push(...subResults);\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Parse a package.json file and extract project metadata.\n */\nasync function parsePackageJson(\n rootDir: string,\n relativePath: string\n): Promise<PackageJsonInfo | null> {\n try {\n const packageJsonPath = path.join(rootDir, relativePath, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // Use package name or folder name\n const name = pkg.name || path.basename(relativePath);\n\n // Detect type from dependencies\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n let type: ProjectType = \"unknown\";\n\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"] || deps[\"svelte\"]) {\n type = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"] || deps[\"hono\"]) {\n type = \"service\";\n } else if (pkg.main || pkg.exports) {\n type = \"library\";\n }\n\n // Check if this is a monorepo root (has workspaces)\n const hasWorkspaces = Boolean(pkg.workspaces);\n\n return { name, relativePath, type, hasWorkspaces };\n } catch {\n return null;\n }\n}\n\n/**\n * Detect project structure in a workspace.\n *\n * Uses two strategies:\n * 1. Folder pattern detection (apps/, packages/, etc.)\n * 2. package.json scanning for more accurate project boundaries\n */\nexport async function detectProjectStructure(\n rootDir: string\n): Promise<ProjectStructure> {\n const projectMap = new Map<string, Project>();\n let isMonorepo = false;\n\n try {\n const entries = await fs.readdir(rootDir, { withFileTypes: true });\n const dirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n // Strategy 1: Check for standard monorepo patterns\n const monorepoPatterns = [\"apps\", \"packages\", \"libs\", \"services\"];\n const hasMonorepoStructure = monorepoPatterns.some((p) =>\n dirNames.includes(p)\n );\n\n if (hasMonorepoStructure) {\n isMonorepo = true;\n\n // Scan each monorepo directory for subprojects\n for (const pattern of monorepoPatterns) {\n if (!dirNames.includes(pattern)) continue;\n\n const patternDir = path.join(rootDir, pattern);\n try {\n const subDirs = await fs.readdir(patternDir, { withFileTypes: true });\n\n for (const subDir of subDirs) {\n if (!subDir.isDirectory()) continue;\n\n const projectRoot = `${pattern}/${subDir.name}`;\n const type = getProjectType(pattern);\n\n // Add to map (can be overridden by package.json info)\n projectMap.set(projectRoot, {\n name: subDir.name,\n root: projectRoot,\n type,\n });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n }\n\n // Strategy 2: Scan for package.json files\n const packageJsons = await scanForPackageJsons(rootDir);\n\n for (const pkg of packageJsons) {\n // Monorepo indicator: nested package.json with workspaces\n if (pkg.hasWorkspaces) {\n isMonorepo = true;\n }\n\n // Multiple package.json files indicate monorepo\n if (packageJsons.length > 1) {\n isMonorepo = true;\n }\n\n // Override or add project from package.json\n // package.json info is more authoritative than folder pattern\n projectMap.set(pkg.relativePath, {\n name: pkg.name,\n root: pkg.relativePath,\n type: pkg.type,\n });\n }\n\n // Check root package.json for workspaces and type\n let rootType: ProjectType = \"unknown\";\n try {\n const rootPkgPath = path.join(rootDir, \"package.json\");\n const rootPkg = JSON.parse(await fs.readFile(rootPkgPath, \"utf-8\"));\n\n if (rootPkg.workspaces) {\n isMonorepo = true;\n }\n\n // Detect type from dependencies\n const deps = { ...rootPkg.dependencies, ...rootPkg.devDependencies };\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"]) {\n rootType = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"]) {\n rootType = \"service\";\n }\n } catch {\n // No package.json or not readable\n }\n\n // Convert map to sorted array (shorter paths first for better matching)\n const projects = Array.from(projectMap.values()).sort(\n (a, b) => a.root.length - b.root.length\n );\n\n return {\n projects,\n isMonorepo,\n rootType: isMonorepo ? undefined : rootType,\n };\n } catch {\n return {\n projects: [],\n isMonorepo: false,\n rootType: \"unknown\",\n };\n }\n}\n\n/**\n * Get project type from pattern directory name.\n */\nfunction getProjectType(patternDir: string): ProjectType {\n switch (patternDir) {\n case \"apps\":\n return \"app\";\n case \"packages\":\n case \"libs\":\n return \"library\";\n case \"services\":\n return \"service\";\n case \"scripts\":\n case \"tools\":\n return \"script\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Find which project a file belongs to.\n *\n * Matches against detected projects (from package.json and folder patterns).\n * For nested projects, returns the most specific (deepest) match.\n */\nexport function findProjectForFile(\n filepath: string,\n structure: ProjectStructure\n): Project {\n // Normalize path\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n\n // Find all matching projects\n const matches: Project[] = [];\n\n // Check against detected projects (from package.json scanning)\n for (const project of structure.projects) {\n if (\n normalizedPath === project.root ||\n normalizedPath.startsWith(project.root + \"/\")\n ) {\n matches.push(project);\n }\n }\n\n // If we have matches, return the most specific (longest root path)\n if (matches.length > 0) {\n return matches.reduce((best, current) =>\n current.root.length > best.root.length ? current : best\n );\n }\n\n // Fallback: Check against pattern matching for any path\n for (const { pattern, type } of PROJECT_PATTERNS) {\n const match = normalizedPath.match(pattern);\n if (match) {\n return {\n name: match[1],\n root: match[0],\n type,\n };\n }\n }\n\n // Default: root project\n return {\n name: \"root\",\n root: \"\",\n type: structure.rootType ?? \"unknown\",\n };\n}\n\n",
|
|
23
|
-
"/**\n * File Introspection\n *\n * Extracts metadata from individual files for context-aware search.\n */\n\nimport * as path from \"path\";\nimport type {\n FileIntrospection,\n Project,\n ProjectStructure,\n Scope,\n} from \"./types\";\nimport { findProjectForFile, detectScopeFromName } from \"./projectDetector\";\n\n/**\n * Layer detection patterns.\n */\nconst LAYER_PATTERNS: Record<string, string[]> = {\n controller: [\"controller\", \"api\", \"routes\", \"route\", \"handler\"],\n service: [\"service\", \"logic\", \"usecase\", \"usecases\", \"handler\"],\n repository: [\"repository\", \"repo\", \"dao\", \"store\", \"persistence\"],\n model: [\"model\", \"models\", \"entity\", \"entities\", \"schema\", \"schemas\", \"types\", \"type\"],\n util: [\"util\", \"utils\", \"helper\", \"helpers\", \"common\", \"lib\"],\n config: [\"config\", \"configuration\", \"settings\"],\n middleware: [\"middleware\", \"middlewares\"],\n domain: [\"domain\"],\n infrastructure: [\"infrastructure\", \"infra\"],\n application: [\"application\", \"app\"],\n presentation: [\"presentation\", \"ui\", \"views\", \"view\", \"component\", \"components\"],\n test: [\"test\", \"tests\", \"spec\", \"specs\", \"__tests__\", \"e2e\"],\n};\n\n/**\n * Domain detection patterns (feature areas).\n */\nconst DOMAIN_PATTERNS = [\n \"auth\",\n \"authentication\",\n \"user\",\n \"users\",\n \"account\",\n \"accounts\",\n \"profile\",\n \"profiles\",\n \"product\",\n \"products\",\n \"item\",\n \"items\",\n \"catalog\",\n \"order\",\n \"orders\",\n \"cart\",\n \"checkout\",\n \"payment\",\n \"payments\",\n \"billing\",\n \"subscription\",\n \"subscriptions\",\n \"notification\",\n \"notifications\",\n \"email\",\n \"sms\",\n \"report\",\n \"reports\",\n \"analytics\",\n \"metrics\",\n \"dashboard\",\n \"admin\",\n \"settings\",\n \"search\",\n \"chat\",\n \"message\",\n \"messages\",\n \"feed\",\n \"post\",\n \"posts\",\n \"comment\",\n \"comments\",\n \"media\",\n \"upload\",\n \"file\",\n \"files\",\n \"storage\",\n \"cache\",\n \"session\",\n \"log\",\n \"logs\",\n \"audit\",\n];\n\n/**\n * Framework detection from imports (simplified).\n */\nconst FRAMEWORK_INDICATORS: Record<string, string[]> = {\n nextjs: [\"next\", \"next/\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n react: [\"react\"],\n vue: [\"vue\"],\n angular: [\"@angular/\"],\n nestjs: [\"@nestjs/\"],\n koa: [\"koa\"],\n};\n\n/**\n * Language detection from file extension.\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".py\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n \".kt\": \"kotlin\",\n \".swift\": \"swift\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".cs\": \"csharp\",\n \".cpp\": \"cpp\",\n \".c\": \"c\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n \".md\": \"markdown\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n};\n\n/**\n * Extract introspection metadata for a file.\n */\nexport function introspectFile(\n filepath: string,\n structure: ProjectStructure,\n fileContent?: string\n): FileIntrospection {\n // Normalize path\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const segments = normalizedPath.split(\"/\").filter((s) => s.length > 0);\n const filename = segments[segments.length - 1] || \"\";\n const ext = path.extname(filename);\n\n // Find project\n const project = findProjectForFile(normalizedPath, structure);\n\n // Detect language\n const language = EXTENSION_TO_LANGUAGE[ext] || \"unknown\";\n\n // Detect layer from path\n const layer = detectLayer(segments, filename);\n\n // Detect domain from path\n const domain = detectDomain(segments);\n\n // Detect scope\n const scope = detectScope(segments, project, layer);\n\n // Detect framework (if content provided)\n let framework: string | undefined;\n if (fileContent) {\n framework = detectFramework(fileContent);\n }\n\n return {\n filepath: normalizedPath,\n project,\n scope,\n layer,\n domain,\n language,\n framework,\n depth: segments.length - 1, // Exclude filename\n pathSegments: segments.slice(0, -1), // Exclude filename\n };\n}\n\n/**\n * Detect architectural layer from path segments.\n */\nfunction detectLayer(segments: string[], filename: string): string | undefined {\n // Check filename first (e.g., userController.ts)\n const filenameLower = filename.toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n if (filenameLower.includes(pattern)) {\n return layer;\n }\n }\n }\n\n // Check directory segments\n for (let i = segments.length - 2; i >= 0; i--) {\n const segment = segments[i].toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n if (patterns.includes(segment)) {\n return layer;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect feature domain from path segments.\n */\nfunction detectDomain(segments: string[]): string | undefined {\n // Skip common non-domain segments\n const skipSegments = new Set([\n \"src\",\n \"lib\",\n \"app\",\n \"apps\",\n \"packages\",\n \"services\",\n \"modules\",\n \"features\",\n ...Object.values(LAYER_PATTERNS).flat(),\n ]);\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if (skipSegments.has(segmentLower)) continue;\n\n // Check if it matches a known domain\n if (DOMAIN_PATTERNS.includes(segmentLower)) {\n return segmentLower;\n }\n\n // Check for partial matches (e.g., \"userService\" → \"user\")\n for (const domain of DOMAIN_PATTERNS) {\n if (segmentLower.startsWith(domain) || segmentLower.endsWith(domain)) {\n return domain;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect scope from path and project.\n */\nfunction detectScope(\n segments: string[],\n project: Project,\n layer?: string\n): Scope {\n // Check project-level scope from project name\n const projectScope = detectScopeFromName(project.name);\n if (projectScope !== \"unknown\") {\n return projectScope;\n }\n\n // Infer from layer\n if (layer) {\n switch (layer) {\n case \"controller\":\n case \"repository\":\n case \"middleware\":\n return \"backend\";\n case \"presentation\":\n return \"frontend\";\n case \"util\":\n case \"model\":\n return \"shared\";\n case \"test\":\n return \"tooling\";\n }\n }\n\n // Check path segments for scope hints\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if ([\"server\", \"api\", \"backend\"].includes(segmentLower)) {\n return \"backend\";\n }\n if ([\"client\", \"web\", \"frontend\", \"ui\"].includes(segmentLower)) {\n return \"frontend\";\n }\n if ([\"shared\", \"common\", \"lib\", \"libs\"].includes(segmentLower)) {\n return \"shared\";\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Detect framework from file content (imports).\n */\nfunction detectFramework(content: string): string | undefined {\n for (const [framework, indicators] of Object.entries(FRAMEWORK_INDICATORS)) {\n for (const indicator of indicators) {\n if (content.includes(`from '${indicator}`) || content.includes(`from \"${indicator}`) ||\n content.includes(`require('${indicator}`) || content.includes(`require(\"${indicator}`)) {\n return framework;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Extract keywords from introspection for search boosting.\n */\nexport function introspectionToKeywords(intro: FileIntrospection): string[] {\n const keywords: string[] = [];\n\n // Add project name keywords\n if (intro.project.name && intro.project.name !== \"root\") {\n keywords.push(intro.project.name.toLowerCase());\n }\n\n // Add scope\n if (intro.scope !== \"unknown\") {\n keywords.push(intro.scope);\n }\n\n // Add layer\n if (intro.layer) {\n keywords.push(intro.layer);\n }\n\n // Add domain\n if (intro.domain) {\n keywords.push(intro.domain);\n }\n\n // Add language\n if (intro.language !== \"unknown\") {\n keywords.push(intro.language);\n }\n\n // Add framework\n if (intro.framework) {\n keywords.push(intro.framework);\n }\n\n // Add path segments (filtered)\n const skipSegments = new Set([\"src\", \"lib\", \"index\"]);\n for (const segment of intro.pathSegments) {\n if (!skipSegments.has(segment.toLowerCase()) && segment.length > 2) {\n keywords.push(segment.toLowerCase());\n }\n }\n\n return [...new Set(keywords)];\n}\n\n",
|
|
24
|
-
"/**\n * Introspection Module\n *\n * Manages file metadata for context-aware search boosting.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type {\n FileIntrospection,\n ProjectStructure,\n IntrospectionConfig,\n} from \"./types\";\nimport { detectProjectStructure } from \"./projectDetector\";\nimport { introspectFile, introspectionToKeywords } from \"./fileIntrospector\";\nimport { getRaggrepDir } from \"../infrastructure/config\";\nimport type { Config } from \"../domain/entities\";\n\n// Re-export types\nexport type { FileIntrospection, ProjectStructure, Project, Scope, ProjectType } from \"./types\";\nexport { introspectFile, introspectionToKeywords } from \"./fileIntrospector\";\nexport { detectProjectStructure, detectScopeFromName } from \"./projectDetector\";\n\n/**\n * Introspection index for a workspace.\n */\nexport class IntrospectionIndex {\n private rootDir: string;\n private structure: ProjectStructure | null = null;\n private files: Map<string, FileIntrospection> = new Map();\n private config: IntrospectionConfig = {};\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /**\n * Initialize by detecting project structure.\n */\n async initialize(): Promise<void> {\n this.structure = await detectProjectStructure(this.rootDir);\n \n // Try to load config overrides\n try {\n const configPath = path.join(this.rootDir, \".raggrep\", \"config.json\");\n const configContent = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(configContent);\n this.config = config.introspection || {};\n } catch {\n // No config or introspection section\n }\n }\n\n /**\n * Get project structure.\n */\n getStructure(): ProjectStructure | null {\n return this.structure;\n }\n\n /**\n * Introspect a file and add to index.\n */\n addFile(filepath: string, content?: string): FileIntrospection {\n if (!this.structure) {\n throw new Error(\"IntrospectionIndex not initialized\");\n }\n\n const intro = introspectFile(filepath, this.structure, content);\n \n // Apply config overrides\n this.applyOverrides(intro);\n \n this.files.set(filepath, intro);\n return intro;\n }\n\n /**\n * Get introspection for a file.\n */\n getFile(filepath: string): FileIntrospection | undefined {\n return this.files.get(filepath);\n }\n\n /**\n * Get all introspected files.\n */\n getAllFiles(): FileIntrospection[] {\n return Array.from(this.files.values());\n }\n\n /**\n * Apply config overrides to introspection.\n */\n private applyOverrides(intro: FileIntrospection): void {\n if (!this.config.projects) return;\n\n // Find matching project override\n for (const [projectPath, overrides] of Object.entries(this.config.projects)) {\n if (intro.filepath.startsWith(projectPath + \"/\") || intro.project.root === projectPath) {\n if (overrides.scope) {\n intro.scope = overrides.scope;\n }\n if (overrides.framework) {\n intro.framework = overrides.framework;\n }\n break;\n }\n }\n }\n\n /**\n * Save introspection index to disk.\n */\n async save(config: Config): Promise<void> {\n const introDir = path.join(getRaggrepDir(this.rootDir, config), \"introspection\");\n await fs.mkdir(introDir, { recursive: true });\n\n // Save project structure\n const projectPath = path.join(introDir, \"_project.json\");\n await fs.writeFile(\n projectPath,\n JSON.stringify(\n {\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n structure: this.structure,\n },\n null,\n 2\n )\n );\n\n // Save file introspections in directory structure\n for (const [filepath, intro] of this.files) {\n const introFilePath = path.join(\n introDir,\n \"files\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n await fs.mkdir(path.dirname(introFilePath), { recursive: true });\n await fs.writeFile(introFilePath, JSON.stringify(intro, null, 2));\n }\n\n console.log(\n ` [Introspection] Saved metadata for ${this.files.size} files`\n );\n }\n\n /**\n * Load introspection index from disk.\n */\n async load(config: Config): Promise<void> {\n const introDir = path.join(getRaggrepDir(this.rootDir, config), \"introspection\");\n\n try {\n // Load project structure\n const projectPath = path.join(introDir, \"_project.json\");\n const projectContent = await fs.readFile(projectPath, \"utf-8\");\n const projectData = JSON.parse(projectContent);\n this.structure = projectData.structure;\n\n // Load file introspections\n await this.loadFilesRecursive(path.join(introDir, \"files\"), \"\");\n } catch {\n // No introspection index yet\n this.structure = null;\n this.files.clear();\n }\n }\n\n /**\n * Recursively load file introspections.\n */\n private async loadFilesRecursive(basePath: string, prefix: string): Promise<void> {\n try {\n const entries = await fs.readdir(basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(basePath, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n await this.loadFilesRecursive(entryPath, relativePath);\n } else if (entry.name.endsWith(\".json\")) {\n const content = await fs.readFile(entryPath, \"utf-8\");\n const intro: FileIntrospection = JSON.parse(content);\n this.files.set(intro.filepath, intro);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.files.clear();\n this.structure = null;\n }\n}\n\n/**\n * Calculate search boost based on introspection and query.\n *\n * @param intro - File introspection\n * @param query - Search query\n * @returns Boost multiplier (1.0 = no boost, >1.0 = positive boost)\n */\nexport function calculateIntrospectionBoost(\n intro: FileIntrospection,\n query: string\n): number {\n let boost = 1.0;\n const queryTerms = query.toLowerCase().split(/\\s+/);\n\n // Domain match: +10%\n if (intro.domain && queryTerms.some((t) => intro.domain!.includes(t) || t.includes(intro.domain!))) {\n boost *= 1.1;\n }\n\n // Layer match: +5%\n if (intro.layer && queryTerms.some((t) => intro.layer!.includes(t) || t.includes(intro.layer!))) {\n boost *= 1.05;\n }\n\n // Scope match for backend queries: +5%\n const backendTerms = [\"api\", \"server\", \"backend\", \"endpoint\", \"route\"];\n if (\n queryTerms.some((t) => backendTerms.includes(t)) &&\n intro.scope === \"backend\"\n ) {\n boost *= 1.05;\n }\n\n // Scope match for frontend queries: +5%\n const frontendTerms = [\"ui\", \"component\", \"page\", \"view\", \"frontend\", \"client\"];\n if (\n queryTerms.some((t) => frontendTerms.includes(t)) &&\n intro.scope === \"frontend\"\n ) {\n boost *= 1.05;\n }\n\n // Path segment match: +3% per match\n for (const segment of intro.pathSegments) {\n if (queryTerms.some((t) => segment.toLowerCase().includes(t))) {\n boost *= 1.03;\n }\n }\n\n // Project name match: +5%\n if (\n intro.project.name !== \"root\" &&\n queryTerms.some((t) => intro.project.name.toLowerCase().includes(t))\n ) {\n boost *= 1.05;\n }\n\n return boost;\n}\n\n",
|
|
25
|
-
"/**\n * File watcher for incremental indexing\n * \n * Best practices implemented:\n * - Debouncing: Batches rapid file changes (e.g., IDE saves, git operations)\n * - Queuing: Prevents concurrent index operations\n * - Efficient filtering: Only watches relevant file types\n * - Graceful shutdown: Proper cleanup on SIGINT/SIGTERM\n * - Error recovery: Continues watching after index errors\n */\n\nimport { watch, type FSWatcher } from 'chokidar';\nimport * as path from 'path';\nimport { loadConfig } from '../../infrastructure/config';\nimport type { Config } from '../../domain/entities';\nimport { indexDirectory, cleanupIndex, type IndexOptions, type IndexResult } from './index';\n\n/** Default debounce delay in milliseconds */\nconst DEFAULT_DEBOUNCE_MS = 300;\n\n/** Maximum files to batch before forcing an index */\nconst MAX_BATCH_SIZE = 100;\n\nexport interface WatchOptions extends IndexOptions {\n /** Debounce delay in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when indexing starts */\n onIndexStart?: (files: string[]) => void;\n /** Callback when indexing completes */\n onIndexComplete?: (results: IndexResult[]) => void;\n /** Callback when a file change is detected */\n onFileChange?: (event: 'add' | 'change' | 'unlink', filepath: string) => void;\n /** Callback for errors */\n onError?: (error: Error) => void;\n}\n\nexport interface FileWatcher {\n /** Stop watching and clean up */\n stop: () => Promise<void>;\n /** Whether the watcher is currently running */\n isRunning: () => boolean;\n}\n\n/**\n * Start watching a directory for file changes and index incrementally\n */\nexport async function watchDirectory(\n rootDir: string,\n options: WatchOptions = {}\n): Promise<FileWatcher> {\n const {\n debounceMs = DEFAULT_DEBOUNCE_MS,\n verbose = false,\n model,\n onIndexStart,\n onIndexComplete,\n onFileChange,\n onError,\n } = options;\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n // Load config\n const config = await loadConfig(rootDir);\n \n // Build glob patterns for watched files\n const watchPatterns = config.extensions.map(ext => `**/*${ext}`);\n \n // Build ignore patterns\n const ignorePatterns = [\n ...config.ignorePaths.map(p => `**/${p}/**`),\n `**/${config.indexDir}/**`, // Always ignore the index directory\n ];\n\n // State management\n let isRunning = true;\n let isIndexing = false;\n let pendingChanges = new Map<string, 'add' | 'change' | 'unlink'>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let watcher: FSWatcher | null = null;\n\n /**\n * Process pending file changes\n */\n async function processPendingChanges(): Promise<void> {\n if (!isRunning || isIndexing || pendingChanges.size === 0) {\n return;\n }\n\n isIndexing = true;\n const changes = new Map(pendingChanges);\n pendingChanges.clear();\n\n try {\n // Separate additions/changes from deletions\n const filesToIndex: string[] = [];\n const filesToDelete: string[] = [];\n\n for (const [filepath, event] of changes) {\n if (event === 'unlink') {\n filesToDelete.push(filepath);\n } else {\n filesToIndex.push(filepath);\n }\n }\n\n // Handle deletions via cleanup\n if (filesToDelete.length > 0) {\n if (verbose) {\n console.log(`\\n[Watch] Cleaning up ${filesToDelete.length} deleted file(s)...`);\n }\n await cleanupIndex(rootDir, { verbose: false });\n }\n\n // Handle additions/changes via incremental index\n if (filesToIndex.length > 0) {\n if (onIndexStart) {\n onIndexStart(filesToIndex);\n }\n\n if (verbose) {\n console.log(`\\n[Watch] Indexing ${filesToIndex.length} changed file(s)...`);\n }\n\n const results = await indexDirectory(rootDir, {\n model,\n verbose: false, // Keep output clean in watch mode\n });\n\n if (onIndexComplete) {\n onIndexComplete(results);\n }\n\n // Print summary\n for (const result of results) {\n if (result.indexed > 0 || result.errors > 0) {\n console.log(`[Watch] ${result.moduleId}: ${result.indexed} indexed, ${result.errors} errors`);\n }\n }\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[Watch] Error during indexing:', err.message);\n if (onError) {\n onError(err);\n }\n } finally {\n isIndexing = false;\n\n // Process any changes that came in while we were indexing\n if (pendingChanges.size > 0) {\n scheduleProcessing();\n }\n }\n }\n\n /**\n * Schedule processing of pending changes (with debounce)\n */\n function scheduleProcessing(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n // Force processing if batch is too large\n if (pendingChanges.size >= MAX_BATCH_SIZE) {\n processPendingChanges();\n return;\n }\n\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n processPendingChanges();\n }, debounceMs);\n }\n\n /**\n * Handle a file event\n */\n function handleFileEvent(event: 'add' | 'change' | 'unlink', filepath: string): void {\n if (!isRunning) return;\n\n // Convert to relative path\n const relativePath = path.relative(rootDir, filepath);\n\n // Skip if it's in an ignored directory (extra safety check)\n for (const ignorePath of config.ignorePaths) {\n if (relativePath.startsWith(ignorePath) || relativePath.includes(`/${ignorePath}/`)) {\n return;\n }\n }\n\n if (onFileChange) {\n onFileChange(event, relativePath);\n }\n\n if (verbose) {\n const symbol = event === 'add' ? '+' : event === 'unlink' ? '-' : '~';\n console.log(`[Watch] ${symbol} ${relativePath}`);\n }\n\n // Update pending changes (later events override earlier ones for same file)\n pendingChanges.set(relativePath, event);\n scheduleProcessing();\n }\n\n // Create the watcher\n watcher = watch(watchPatterns, {\n cwd: rootDir,\n ignored: ignorePatterns,\n persistent: true,\n ignoreInitial: true, // Don't trigger events for existing files\n awaitWriteFinish: {\n stabilityThreshold: 100, // Wait for file to be stable\n pollInterval: 50,\n },\n // Performance optimizations\n usePolling: false, // Use native fs events when possible\n atomic: true, // Handle atomic writes (common in editors)\n });\n\n // Set up event handlers\n watcher.on('add', (filepath) => handleFileEvent('add', path.join(rootDir, filepath)));\n watcher.on('change', (filepath) => handleFileEvent('change', path.join(rootDir, filepath)));\n watcher.on('unlink', (filepath) => handleFileEvent('unlink', path.join(rootDir, filepath)));\n\n watcher.on('error', (error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[Watch] Watcher error:', err);\n if (onError) {\n onError(err);\n }\n });\n\n // Wait for watcher to be ready\n await new Promise<void>((resolve) => {\n watcher!.on('ready', () => {\n resolve();\n });\n });\n\n // Return control interface\n return {\n stop: async () => {\n isRunning = false;\n \n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n \n if (watcher) {\n await watcher.close();\n watcher = null;\n }\n },\n isRunning: () => isRunning,\n };\n}\n\n",
|
|
26
|
-
"// Main indexer - coordinates modules for indexing files\nimport { glob } from 'glob';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport {\n Config,\n IndexContext,\n IndexModule,\n ModuleManifest,\n GlobalManifest,\n FileIndex,\n} from '../../types';\nimport {\n DEFAULT_CONFIG,\n loadConfig,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getModuleConfig,\n} from '../../infrastructure/config';\nimport { registry, registerBuiltInModules } from '../../modules/registry';\nimport type { EmbeddingModelName } from '../../domain/ports';\nimport { IntrospectionIndex } from '../../introspection';\n\nexport interface IndexResult {\n moduleId: string;\n indexed: number;\n skipped: number;\n errors: number;\n}\n\nexport interface IndexOptions {\n /** Override the embedding model (semantic module) */\n model?: EmbeddingModelName;\n /** Show detailed progress */\n verbose?: boolean;\n}\n\nexport interface CleanupResult {\n moduleId: string;\n /** Number of stale entries removed */\n removed: number;\n /** Number of valid entries kept */\n kept: number;\n}\n\nexport interface IndexStatus {\n /** Whether an index exists */\n exists: boolean;\n /** Root directory path */\n rootDir: string;\n /** Index directory path */\n indexDir: string;\n /** Last time the index was updated */\n lastUpdated?: string;\n /** Active modules and their file counts */\n modules: Array<{\n id: string;\n fileCount: number;\n lastUpdated: string;\n }>;\n /** Total number of indexed files */\n totalFiles: number;\n}\n\n/**\n * Index a directory using all enabled modules\n */\nexport async function indexDirectory(rootDir: string, options: IndexOptions = {}): Promise<IndexResult[]> {\n const verbose = options.verbose ?? false;\n \n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n console.log(`Indexing directory: ${rootDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n if (verbose) {\n const structure = introspection.getStructure();\n if (structure?.isMonorepo) {\n console.log(`Detected monorepo with ${structure.projects.length} projects`);\n }\n }\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n console.log('No modules enabled. Check your configuration.');\n return [];\n }\n\n console.log(`Enabled modules: ${enabledModules.map((m) => m.id).join(', ')}`);\n\n // Get all files matching extensions\n const files = await findFiles(rootDir, config);\n console.log(`Found ${files.length} files to index`);\n\n // Index with each module\n const results: IndexResult[] = [];\n\n for (const module of enabledModules) {\n console.log(`\\n[${module.name}] Starting indexing...`);\n\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n // Apply CLI overrides to module config\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === 'language/typescript') {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n await module.initialize(configWithOverrides);\n }\n\n const result = await indexWithModule(rootDir, files, module, config, verbose, introspection);\n results.push(result);\n\n // Call finalize to build secondary indexes (Tier 1, BM25, etc.)\n if (module.finalize) {\n console.log(`[${module.name}] Building secondary indexes...`);\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n return fs.readFile(fullPath, 'utf-8');\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n };\n await module.finalize(ctx);\n }\n\n console.log(`[${module.name}] Complete: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`);\n }\n\n // Save introspection data\n await introspection.save(config);\n\n // Update global manifest\n await updateGlobalManifest(rootDir, enabledModules, config);\n\n return results;\n}\n\n/**\n * Index files with a specific module\n */\nasync function indexWithModule(\n rootDir: string,\n files: string[],\n module: IndexModule,\n config: Config,\n verbose: boolean,\n introspection: IntrospectionIndex\n): Promise<IndexResult> {\n const result: IndexResult = {\n moduleId: module.id,\n indexed: 0,\n skipped: 0,\n errors: 0,\n };\n\n // Load existing manifest for this module\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n\n // Create index context\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n return fs.readFile(fullPath, 'utf-8');\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n // Process each file\n for (const filepath of files) {\n const relativePath = path.relative(rootDir, filepath);\n \n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n if (verbose) {\n console.log(` Skipped ${relativePath} (unchanged)`);\n }\n result.skipped++;\n continue;\n }\n\n // Read and index file\n const content = await fs.readFile(filepath, 'utf-8');\n \n // Add introspection for this file\n introspection.addFile(relativePath, content);\n \n if (verbose) {\n console.log(` Processing ${relativePath}...`);\n }\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n if (verbose) {\n console.log(` Skipped ${relativePath} (no chunks)`);\n }\n result.skipped++;\n continue;\n }\n\n // Write index file\n await writeFileIndex(rootDir, module.id, relativePath, fileIndex, config);\n\n // Update manifest\n manifest.files[relativePath] = {\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n\n result.indexed++;\n } catch (error) {\n console.error(` Error indexing ${relativePath}:`, error);\n result.errors++;\n }\n }\n\n // Update manifest\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n return result;\n}\n\nasync function findFiles(rootDir: string, config: Config): Promise<string[]> {\n const patterns = config.extensions.map((ext) => `**/*${ext}`);\n const ignorePatterns = config.ignorePaths.map((p) => `**/${p}/**`);\n\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n absolute: true,\n ignore: ignorePatterns,\n });\n files.push(...matches);\n }\n\n return [...new Set(files)]; // Remove duplicates\n}\n\nasync function loadModuleManifest(\n rootDir: string,\n moduleId: string,\n config: Config\n): Promise<ModuleManifest> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n\n try {\n const content = await fs.readFile(manifestPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {\n moduleId,\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n files: {},\n };\n }\n}\n\nasync function writeModuleManifest(\n rootDir: string,\n moduleId: string,\n manifest: ModuleManifest,\n config: Config\n): Promise<void> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\nasync function writeFileIndex(\n rootDir: string,\n moduleId: string,\n filepath: string,\n fileIndex: FileIndex,\n config: Config\n): Promise<void> {\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n const indexFilePath = path.join(indexPath, filepath.replace(/\\.[^.]+$/, '.json'));\n\n await fs.mkdir(path.dirname(indexFilePath), { recursive: true });\n await fs.writeFile(indexFilePath, JSON.stringify(fileIndex, null, 2));\n}\n\nasync function updateGlobalManifest(\n rootDir: string,\n modules: IndexModule[],\n config: Config\n): Promise<void> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n const manifest: GlobalManifest = {\n version: config.version,\n lastUpdated: new Date().toISOString(),\n modules: modules.map((m) => m.id),\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Clean up stale index entries for files that no longer exist\n * @param rootDir - Root directory of the project\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n */\nexport async function cleanupIndex(\n rootDir: string, \n options: { verbose?: boolean } = {}\n): Promise<CleanupResult[]> {\n const verbose = options.verbose ?? false;\n \n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n console.log(`Cleaning up index in: ${rootDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n console.log('No modules enabled.');\n return [];\n }\n\n const results: CleanupResult[] = [];\n\n for (const module of enabledModules) {\n console.log(`\\n[${module.name}] Checking for stale entries...`);\n \n const result = await cleanupModuleIndex(rootDir, module.id, config, verbose);\n results.push(result);\n \n console.log(`[${module.name}] Removed ${result.removed} stale entries, kept ${result.kept} valid entries`);\n }\n\n return results;\n}\n\n/**\n * Clean up stale index entries for a specific module\n */\nasync function cleanupModuleIndex(\n rootDir: string,\n moduleId: string,\n config: Config,\n verbose: boolean\n): Promise<CleanupResult> {\n const result: CleanupResult = {\n moduleId,\n removed: 0,\n kept: 0,\n };\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n \n const filesToRemove: string[] = [];\n const updatedFiles: ModuleManifest['files'] = {};\n\n // Check each indexed file\n for (const [filepath, entry] of Object.entries(manifest.files)) {\n const fullPath = path.join(rootDir, filepath);\n \n try {\n await fs.access(fullPath);\n // File exists, keep it\n updatedFiles[filepath] = entry;\n result.kept++;\n } catch {\n // File doesn't exist, mark for removal\n filesToRemove.push(filepath);\n result.removed++;\n \n if (verbose) {\n console.log(` Removing stale entry: ${filepath}`);\n }\n }\n }\n\n // Remove stale index files\n for (const filepath of filesToRemove) {\n const indexFilePath = path.join(indexPath, filepath.replace(/\\.[^.]+$/, '.json'));\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist, that's okay\n }\n }\n\n // Update manifest with only valid files\n manifest.files = updatedFiles;\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, moduleId, manifest, config);\n\n // Clean up empty directories in the index\n await cleanupEmptyDirectories(indexPath);\n\n return result;\n}\n\n/**\n * Recursively remove empty directories\n */\nasync function cleanupEmptyDirectories(dir: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n // Process subdirectories first\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = path.join(dir, entry.name);\n await cleanupEmptyDirectories(subDir);\n }\n }\n \n // Check if directory is now empty (re-read after potential subdirectory removal)\n const remainingEntries = await fs.readdir(dir);\n \n // Don't remove the root index directory or manifest files\n if (remainingEntries.length === 0) {\n await fs.rmdir(dir);\n return true;\n }\n \n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current status of the index\n * @param rootDir - Root directory of the project\n * @returns Index status information\n */\nexport async function getIndexStatus(rootDir: string): Promise<IndexStatus> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n // Load config\n const config = await loadConfig(rootDir);\n const indexDir = path.join(rootDir, config.indexDir);\n \n const status: IndexStatus = {\n exists: false,\n rootDir,\n indexDir,\n modules: [],\n totalFiles: 0,\n };\n \n // Check if index directory exists\n try {\n await fs.access(indexDir);\n } catch {\n return status;\n }\n \n // Try to load global manifest\n try {\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n const content = await fs.readFile(globalManifestPath, 'utf-8');\n const globalManifest: GlobalManifest = JSON.parse(content);\n \n status.exists = true;\n status.lastUpdated = globalManifest.lastUpdated;\n \n // Load each module's manifest\n for (const moduleId of globalManifest.modules) {\n try {\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const fileCount = Object.keys(manifest.files).length;\n \n status.modules.push({\n id: moduleId,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n \n status.totalFiles += fileCount;\n } catch {\n // Module manifest doesn't exist or is corrupt\n }\n }\n } catch {\n // Global manifest doesn't exist - check if there's any index data\n try {\n const entries = await fs.readdir(path.join(indexDir, 'index'));\n if (entries.length > 0) {\n status.exists = true;\n // Try to load manifests for known modules\n for (const entry of entries) {\n try {\n const manifest = await loadModuleManifest(rootDir, entry, config);\n const fileCount = Object.keys(manifest.files).length;\n \n status.modules.push({\n id: entry,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n \n status.totalFiles += fileCount;\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // No index directory\n }\n }\n \n return status;\n}\n\n// Re-export watcher\nexport { watchDirectory, type WatchOptions, type FileWatcher } from './watcher';\n",
|
|
31
|
+
"/**\n * File watcher for incremental indexing\n * \n * Best practices implemented:\n * - Debouncing: Batches rapid file changes (e.g., IDE saves, git operations)\n * - Queuing: Prevents concurrent index operations\n * - Efficient filtering: Only watches relevant file types\n * - Graceful shutdown: Proper cleanup on SIGINT/SIGTERM\n * - Error recovery: Continues watching after index errors\n */\n\nimport { watch, type FSWatcher } from 'chokidar';\nimport * as path from 'path';\nimport { loadConfig, getIndexLocation } from '../../infrastructure/config';\nimport type { Config } from '../../domain/entities';\nimport { indexDirectory, cleanupIndex, type IndexOptions, type IndexResult } from './index';\n\n/** Default debounce delay in milliseconds */\nconst DEFAULT_DEBOUNCE_MS = 300;\n\n/** Maximum files to batch before forcing an index */\nconst MAX_BATCH_SIZE = 100;\n\nexport interface WatchOptions extends IndexOptions {\n /** Debounce delay in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when indexing starts */\n onIndexStart?: (files: string[]) => void;\n /** Callback when indexing completes */\n onIndexComplete?: (results: IndexResult[]) => void;\n /** Callback when a file change is detected */\n onFileChange?: (event: 'add' | 'change' | 'unlink', filepath: string) => void;\n /** Callback for errors */\n onError?: (error: Error) => void;\n}\n\nexport interface FileWatcher {\n /** Stop watching and clean up */\n stop: () => Promise<void>;\n /** Whether the watcher is currently running */\n isRunning: () => boolean;\n}\n\n/**\n * Start watching a directory for file changes and index incrementally\n */\nexport async function watchDirectory(\n rootDir: string,\n options: WatchOptions = {}\n): Promise<FileWatcher> {\n const {\n debounceMs = DEFAULT_DEBOUNCE_MS,\n verbose = false,\n model,\n onIndexStart,\n onIndexComplete,\n onFileChange,\n onError,\n } = options;\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n // Load config\n const config = await loadConfig(rootDir);\n \n // Get index location (now in temp directory, so no need to ignore in project)\n const indexLocation = getIndexLocation(rootDir);\n \n // Create a set of valid extensions for fast lookup\n const validExtensions = new Set(config.extensions);\n \n // Build ignore patterns - watch directory, filter by extension\n const ignorePatterns = [\n ...config.ignorePaths.map(p => `**/${p}/**`),\n '**/node_modules/**',\n '**/.git/**',\n ];\n \n /**\n * Check if a file should be watched based on its extension\n */\n function shouldWatchFile(filepath: string): boolean {\n const ext = path.extname(filepath);\n return validExtensions.has(ext);\n }\n\n // State management\n let isRunning = true;\n let isIndexing = false;\n let pendingChanges = new Map<string, 'add' | 'change' | 'unlink'>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let watcher: FSWatcher | null = null;\n\n /**\n * Process pending file changes\n */\n async function processPendingChanges(): Promise<void> {\n if (!isRunning || isIndexing || pendingChanges.size === 0) {\n return;\n }\n\n isIndexing = true;\n const changes = new Map(pendingChanges);\n pendingChanges.clear();\n\n try {\n // Separate additions/changes from deletions\n const filesToIndex: string[] = [];\n const filesToDelete: string[] = [];\n\n for (const [filepath, event] of changes) {\n if (event === 'unlink') {\n filesToDelete.push(filepath);\n } else {\n filesToIndex.push(filepath);\n }\n }\n\n // Handle deletions via cleanup\n if (filesToDelete.length > 0) {\n if (verbose) {\n console.log(`\\n[Watch] Cleaning up ${filesToDelete.length} deleted file(s)...`);\n }\n await cleanupIndex(rootDir, { verbose: false });\n }\n\n // Handle additions/changes via incremental index\n if (filesToIndex.length > 0) {\n if (onIndexStart) {\n onIndexStart(filesToIndex);\n }\n\n if (verbose) {\n console.log(`\\n[Watch] Indexing ${filesToIndex.length} changed file(s)...`);\n }\n\n const results = await indexDirectory(rootDir, {\n model,\n verbose: false, // Keep output clean in watch mode\n });\n\n if (onIndexComplete) {\n onIndexComplete(results);\n }\n\n // Print summary\n for (const result of results) {\n if (result.indexed > 0 || result.errors > 0) {\n console.log(`[Watch] ${result.moduleId}: ${result.indexed} indexed, ${result.errors} errors`);\n }\n }\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[Watch] Error during indexing:', err.message);\n if (onError) {\n onError(err);\n }\n } finally {\n isIndexing = false;\n\n // Process any changes that came in while we were indexing\n if (pendingChanges.size > 0) {\n scheduleProcessing();\n }\n }\n }\n\n /**\n * Schedule processing of pending changes (with debounce)\n */\n function scheduleProcessing(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n // Force processing if batch is too large\n if (pendingChanges.size >= MAX_BATCH_SIZE) {\n processPendingChanges();\n return;\n }\n\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n processPendingChanges();\n }, debounceMs);\n }\n\n /**\n * Handle a file event\n */\n function handleFileEvent(event: 'add' | 'change' | 'unlink', filepath: string): void {\n if (!isRunning) return;\n\n // Convert to relative path\n const relativePath = path.relative(rootDir, filepath);\n\n // Skip if file doesn't have a valid extension\n // For unlink events, we still need to check the extension to only clean up indexed files\n if (!shouldWatchFile(filepath)) {\n return;\n }\n\n // Skip if it's in an ignored directory (extra safety check)\n for (const ignorePath of config.ignorePaths) {\n if (relativePath.startsWith(ignorePath) || relativePath.includes(`/${ignorePath}/`)) {\n return;\n }\n }\n\n if (onFileChange) {\n onFileChange(event, relativePath);\n }\n\n if (verbose) {\n const symbol = event === 'add' ? '+' : event === 'unlink' ? '-' : '~';\n console.log(`[Watch] ${symbol} ${relativePath}`);\n }\n\n // Update pending changes (later events override earlier ones for same file)\n pendingChanges.set(relativePath, event);\n scheduleProcessing();\n }\n\n // Create the watcher - watch the directory itself (not glob patterns)\n // This ensures new files in new directories are detected\n watcher = watch(rootDir, {\n ignored: ignorePatterns,\n persistent: true,\n ignoreInitial: true, // Don't trigger events for existing files\n awaitWriteFinish: {\n stabilityThreshold: 100, // Wait for file to be stable\n pollInterval: 50,\n },\n // Performance optimizations\n usePolling: false, // Use native fs events when possible\n atomic: true, // Handle atomic writes (common in editors)\n // Watch directories for new file detection\n depth: 99, // Watch deeply nested directories\n });\n\n // Set up event handlers\n // When watching a directory directly, chokidar gives us absolute paths\n watcher.on('add', (filepath) => handleFileEvent('add', filepath));\n watcher.on('change', (filepath) => handleFileEvent('change', filepath));\n watcher.on('unlink', (filepath) => handleFileEvent('unlink', filepath));\n\n watcher.on('error', (error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[Watch] Watcher error:', err);\n if (onError) {\n onError(err);\n }\n });\n\n // Wait for watcher to be ready\n await new Promise<void>((resolve) => {\n watcher!.on('ready', () => {\n resolve();\n });\n });\n\n // Return control interface\n return {\n stop: async () => {\n isRunning = false;\n \n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n \n if (watcher) {\n await watcher.close();\n watcher = null;\n }\n },\n isRunning: () => isRunning,\n };\n}\n\n",
|
|
32
|
+
"// Main indexer - coordinates modules for indexing files\nimport { glob } from 'glob';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport {\n Config,\n IndexContext,\n IndexModule,\n ModuleManifest,\n GlobalManifest,\n FileIndex,\n} from '../../types';\nimport {\n DEFAULT_CONFIG,\n loadConfig,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getModuleConfig,\n getIndexLocation,\n} from '../../infrastructure/config';\nimport { registry, registerBuiltInModules } from '../../modules/registry';\nimport type { EmbeddingModelName } from '../../domain/ports';\nimport { IntrospectionIndex } from '../../introspection';\n\nexport interface IndexResult {\n moduleId: string;\n indexed: number;\n skipped: number;\n errors: number;\n}\n\nexport interface IndexOptions {\n /** Override the embedding model (semantic module) */\n model?: EmbeddingModelName;\n /** Show detailed progress */\n verbose?: boolean;\n}\n\nexport interface CleanupResult {\n moduleId: string;\n /** Number of stale entries removed */\n removed: number;\n /** Number of valid entries kept */\n kept: number;\n}\n\nexport interface IndexStatus {\n /** Whether an index exists */\n exists: boolean;\n /** Root directory path */\n rootDir: string;\n /** Index directory path */\n indexDir: string;\n /** Last time the index was updated */\n lastUpdated?: string;\n /** Active modules and their file counts */\n modules: Array<{\n id: string;\n fileCount: number;\n lastUpdated: string;\n }>;\n /** Total number of indexed files */\n totalFiles: number;\n}\n\n/**\n * Index a directory using all enabled modules\n */\nexport async function indexDirectory(rootDir: string, options: IndexOptions = {}): Promise<IndexResult[]> {\n const verbose = options.verbose ?? false;\n \n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n // Show index location\n const location = getIndexLocation(rootDir);\n console.log(`Indexing directory: ${rootDir}`);\n console.log(`Index location: ${location.indexDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n if (verbose) {\n const structure = introspection.getStructure();\n if (structure?.isMonorepo) {\n console.log(`Detected monorepo with ${structure.projects.length} projects`);\n }\n }\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n console.log('No modules enabled. Check your configuration.');\n return [];\n }\n\n console.log(`Enabled modules: ${enabledModules.map((m) => m.id).join(', ')}`);\n\n // Get all files matching extensions\n const files = await findFiles(rootDir, config);\n console.log(`Found ${files.length} files to index`);\n\n // Index with each module\n const results: IndexResult[] = [];\n\n for (const module of enabledModules) {\n console.log(`\\n[${module.name}] Starting indexing...`);\n\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n // Apply CLI overrides to module config\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === 'language/typescript') {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n await module.initialize(configWithOverrides);\n }\n\n const result = await indexWithModule(rootDir, files, module, config, verbose, introspection);\n results.push(result);\n\n // Call finalize to build secondary indexes (Tier 1, BM25, etc.)\n if (module.finalize) {\n console.log(`[${module.name}] Building secondary indexes...`);\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n return fs.readFile(fullPath, 'utf-8');\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n };\n await module.finalize(ctx);\n }\n\n console.log(`[${module.name}] Complete: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`);\n }\n\n // Save introspection data\n await introspection.save(config);\n\n // Update global manifest\n await updateGlobalManifest(rootDir, enabledModules, config);\n\n return results;\n}\n\n/**\n * Index files with a specific module\n */\nasync function indexWithModule(\n rootDir: string,\n files: string[],\n module: IndexModule,\n config: Config,\n verbose: boolean,\n introspection: IntrospectionIndex\n): Promise<IndexResult> {\n const result: IndexResult = {\n moduleId: module.id,\n indexed: 0,\n skipped: 0,\n errors: 0,\n };\n\n // Load existing manifest for this module\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n\n // Create index context\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n return fs.readFile(fullPath, 'utf-8');\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n // Process each file\n for (const filepath of files) {\n const relativePath = path.relative(rootDir, filepath);\n \n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n if (verbose) {\n console.log(` Skipped ${relativePath} (unchanged)`);\n }\n result.skipped++;\n continue;\n }\n\n // Read and index file\n const content = await fs.readFile(filepath, 'utf-8');\n \n // Add introspection for this file\n introspection.addFile(relativePath, content);\n \n if (verbose) {\n console.log(` Processing ${relativePath}...`);\n }\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n if (verbose) {\n console.log(` Skipped ${relativePath} (no chunks)`);\n }\n result.skipped++;\n continue;\n }\n\n // Write index file\n await writeFileIndex(rootDir, module.id, relativePath, fileIndex, config);\n\n // Update manifest\n manifest.files[relativePath] = {\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n\n result.indexed++;\n } catch (error) {\n console.error(` Error indexing ${relativePath}:`, error);\n result.errors++;\n }\n }\n\n // Update manifest\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n return result;\n}\n\nasync function findFiles(rootDir: string, config: Config): Promise<string[]> {\n const patterns = config.extensions.map((ext) => `**/*${ext}`);\n const ignorePatterns = config.ignorePaths.map((p) => `**/${p}/**`);\n\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n absolute: true,\n ignore: ignorePatterns,\n });\n files.push(...matches);\n }\n\n return [...new Set(files)]; // Remove duplicates\n}\n\nasync function loadModuleManifest(\n rootDir: string,\n moduleId: string,\n config: Config\n): Promise<ModuleManifest> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n\n try {\n const content = await fs.readFile(manifestPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {\n moduleId,\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n files: {},\n };\n }\n}\n\nasync function writeModuleManifest(\n rootDir: string,\n moduleId: string,\n manifest: ModuleManifest,\n config: Config\n): Promise<void> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\nasync function writeFileIndex(\n rootDir: string,\n moduleId: string,\n filepath: string,\n fileIndex: FileIndex,\n config: Config\n): Promise<void> {\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n const indexFilePath = path.join(indexPath, filepath.replace(/\\.[^.]+$/, '.json'));\n\n await fs.mkdir(path.dirname(indexFilePath), { recursive: true });\n await fs.writeFile(indexFilePath, JSON.stringify(fileIndex, null, 2));\n}\n\nasync function updateGlobalManifest(\n rootDir: string,\n modules: IndexModule[],\n config: Config\n): Promise<void> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n const manifest: GlobalManifest = {\n version: config.version,\n lastUpdated: new Date().toISOString(),\n modules: modules.map((m) => m.id),\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Clean up stale index entries for files that no longer exist\n * @param rootDir - Root directory of the project\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n */\nexport async function cleanupIndex(\n rootDir: string, \n options: { verbose?: boolean } = {}\n): Promise<CleanupResult[]> {\n const verbose = options.verbose ?? false;\n \n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n console.log(`Cleaning up index in: ${rootDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n console.log('No modules enabled.');\n return [];\n }\n\n const results: CleanupResult[] = [];\n\n for (const module of enabledModules) {\n console.log(`\\n[${module.name}] Checking for stale entries...`);\n \n const result = await cleanupModuleIndex(rootDir, module.id, config, verbose);\n results.push(result);\n \n console.log(`[${module.name}] Removed ${result.removed} stale entries, kept ${result.kept} valid entries`);\n }\n\n return results;\n}\n\n/**\n * Clean up stale index entries for a specific module\n */\nasync function cleanupModuleIndex(\n rootDir: string,\n moduleId: string,\n config: Config,\n verbose: boolean\n): Promise<CleanupResult> {\n const result: CleanupResult = {\n moduleId,\n removed: 0,\n kept: 0,\n };\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n \n const filesToRemove: string[] = [];\n const updatedFiles: ModuleManifest['files'] = {};\n\n // Check each indexed file\n for (const [filepath, entry] of Object.entries(manifest.files)) {\n const fullPath = path.join(rootDir, filepath);\n \n try {\n await fs.access(fullPath);\n // File exists, keep it\n updatedFiles[filepath] = entry;\n result.kept++;\n } catch {\n // File doesn't exist, mark for removal\n filesToRemove.push(filepath);\n result.removed++;\n \n if (verbose) {\n console.log(` Removing stale entry: ${filepath}`);\n }\n }\n }\n\n // Remove stale index files\n for (const filepath of filesToRemove) {\n const indexFilePath = path.join(indexPath, filepath.replace(/\\.[^.]+$/, '.json'));\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist, that's okay\n }\n }\n\n // Update manifest with only valid files\n manifest.files = updatedFiles;\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, moduleId, manifest, config);\n\n // Clean up empty directories in the index\n await cleanupEmptyDirectories(indexPath);\n\n return result;\n}\n\n/**\n * Recursively remove empty directories\n */\nasync function cleanupEmptyDirectories(dir: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n // Process subdirectories first\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = path.join(dir, entry.name);\n await cleanupEmptyDirectories(subDir);\n }\n }\n \n // Check if directory is now empty (re-read after potential subdirectory removal)\n const remainingEntries = await fs.readdir(dir);\n \n // Don't remove the root index directory or manifest files\n if (remainingEntries.length === 0) {\n await fs.rmdir(dir);\n return true;\n }\n \n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current status of the index\n * @param rootDir - Root directory of the project\n * @returns Index status information\n */\nexport async function getIndexStatus(rootDir: string): Promise<IndexStatus> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n \n // Load config\n const config = await loadConfig(rootDir);\n \n // Get index location (now in temp directory)\n const location = getIndexLocation(rootDir);\n const indexDir = location.indexDir;\n \n const status: IndexStatus = {\n exists: false,\n rootDir,\n indexDir,\n modules: [],\n totalFiles: 0,\n };\n \n // Check if index directory exists\n try {\n await fs.access(indexDir);\n } catch {\n return status;\n }\n \n // Try to load global manifest\n try {\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n const content = await fs.readFile(globalManifestPath, 'utf-8');\n const globalManifest: GlobalManifest = JSON.parse(content);\n \n status.exists = true;\n status.lastUpdated = globalManifest.lastUpdated;\n \n // Load each module's manifest\n for (const moduleId of globalManifest.modules) {\n try {\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const fileCount = Object.keys(manifest.files).length;\n \n status.modules.push({\n id: moduleId,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n \n status.totalFiles += fileCount;\n } catch {\n // Module manifest doesn't exist or is corrupt\n }\n }\n } catch {\n // Global manifest doesn't exist - check if there's any index data\n try {\n const entries = await fs.readdir(path.join(indexDir, 'index'));\n if (entries.length > 0) {\n status.exists = true;\n // Try to load manifests for known modules\n for (const entry of entries) {\n try {\n const manifest = await loadModuleManifest(rootDir, entry, config);\n const fileCount = Object.keys(manifest.files).length;\n \n status.modules.push({\n id: entry,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n \n status.totalFiles += fileCount;\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // No index directory\n }\n }\n \n return status;\n}\n\n// Re-export watcher\nexport { watchDirectory, type WatchOptions, type FileWatcher } from './watcher';\n",
|
|
27
33
|
"// Search module - queries across all enabled modules\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport {\n Config,\n SearchContext,\n SearchOptions,\n SearchResult,\n FileIndex,\n IndexModule,\n GlobalManifest,\n} from '../../types';\nimport {\n loadConfig,\n getModuleIndexPath,\n getGlobalManifestPath,\n getModuleConfig,\n} from '../../infrastructure/config';\nimport { registry, registerBuiltInModules } from '../../modules/registry';\n\n/**\n * Search across all enabled modules\n */\nexport async function search(\n rootDir: string,\n query: string,\n options: SearchOptions = {}\n): Promise<SearchResult[]> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n console.log(`Searching for: \"${query}\"`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Check which modules have indexes\n const globalManifest = await loadGlobalManifest(rootDir, config);\n \n if (!globalManifest || globalManifest.modules.length === 0) {\n console.log('No index found. Run \"bun run index\" first.');\n return [];\n }\n\n // Get modules that are both enabled and have indexes\n const modulesToSearch: IndexModule[] = [];\n \n for (const moduleId of globalManifest.modules) {\n const module = registry.get(moduleId);\n const moduleConfig = getModuleConfig(config, moduleId);\n \n if (module && moduleConfig?.enabled) {\n // Initialize module if needed\n if (module.initialize) {\n await module.initialize(moduleConfig);\n }\n modulesToSearch.push(module);\n }\n }\n\n if (modulesToSearch.length === 0) {\n console.log('No enabled modules with indexes found.');\n return [];\n }\n\n // Search with each module and aggregate results\n const allResults: SearchResult[] = [];\n\n for (const module of modulesToSearch) {\n const ctx = createSearchContext(rootDir, module.id, config);\n const moduleResults = await module.search(query, ctx, options);\n allResults.push(...moduleResults);\n }\n\n // Sort all results by score\n allResults.sort((a, b) => b.score - a.score);\n\n // Return top K\n const topK = options.topK ?? 10;\n return allResults.slice(0, topK);\n}\n\n/**\n * Create a search context for a specific module\n */\nfunction createSearchContext(\n rootDir: string,\n moduleId: string,\n config: Config\n): SearchContext {\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n\n return {\n rootDir,\n config,\n \n loadFileIndex: async (filepath: string): Promise<FileIndex | null> => {\n // filepath may or may not have an extension\n // If it has an extension, replace it with .json; otherwise append .json\n const hasExtension = /\\.[^./]+$/.test(filepath);\n const indexFilePath = hasExtension\n ? path.join(indexPath, filepath.replace(/\\.[^.]+$/, '.json'))\n : path.join(indexPath, filepath + '.json');\n \n try {\n const content = await fs.readFile(indexFilePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n },\n \n listIndexedFiles: async (): Promise<string[]> => {\n const files: string[] = [];\n await traverseDirectory(indexPath, files, indexPath);\n \n // Convert index file paths back to source file paths\n return files\n .filter(f => f.endsWith('.json') && !f.endsWith('manifest.json'))\n .map(f => {\n const relative = path.relative(indexPath, f);\n // Convert .json back to original extension (we'll handle this generically)\n return relative.replace(/\\.json$/, '');\n });\n },\n };\n}\n\nasync function traverseDirectory(dir: string, files: string[], basePath: string): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, files, basePath);\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n}\n\nasync function loadGlobalManifest(rootDir: string, config: Config): Promise<GlobalManifest | null> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n try {\n const content = await fs.readFile(manifestPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Format search results for display\n * @param results - Array of search results to format\n * @returns Formatted string for console output\n */\nexport function formatSearchResults(results: SearchResult[]): string {\n if (results.length === 0) {\n return 'No results found.';\n }\n\n let output = `Found ${results.length} results:\\n\\n`;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const { chunk } = result;\n \n // Format location with optional name\n const location = `${result.filepath}:${chunk.startLine}-${chunk.endLine}`;\n const nameInfo = chunk.name ? ` (${chunk.name})` : '';\n \n output += `${i + 1}. ${location}${nameInfo}\\n`;\n output += ` Score: ${(result.score * 100).toFixed(1)}% | Type: ${chunk.type}`;\n \n // Add export indicator\n if (chunk.isExported) {\n output += ' | exported';\n }\n output += '\\n';\n\n // Show preview (first 3 lines)\n const lines = chunk.content.split('\\n').slice(0, 3);\n for (const line of lines) {\n const trimmedLine = line.substring(0, 80);\n output += ` ${trimmedLine}${line.length > 80 ? '...' : ''}\\n`;\n }\n\n output += '\\n';\n }\n\n return output;\n}\n",
|
|
28
34
|
"// Main CLI entry point for raggrep\n\nimport { EMBEDDING_MODELS, getCacheDir } from \"../../infrastructure/embeddings\";\nimport type { EmbeddingModelName } from \"../../domain/ports\";\n// @ts-ignore - JSON import inlined by Bun at build time\nimport pkg from \"../../../package.json\";\n\nconst VERSION = pkg.version;\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\n// Handle --version / -v at top level (before any command)\nif (command === \"--version\" || command === \"-v\") {\n console.log(`raggrep v${VERSION}`);\n process.exit(0);\n}\n\n/**\n * Format a date as a human-readable \"time ago\" string\n */\nfunction formatTimeAgo(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return \"just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n // For older dates, show the actual date\n return date.toLocaleDateString();\n}\n\n/**\n * Parsed CLI flags from command line arguments\n */\ninterface ParsedFlags {\n /** Embedding model to use */\n model?: EmbeddingModelName;\n /** Number of results to return */\n topK?: number;\n /** Minimum similarity score threshold (0-1) */\n minScore?: number;\n /** File extension filter (e.g., 'ts', 'tsx') */\n fileType?: string;\n /** Show help message */\n help: boolean;\n /** Show detailed progress */\n verbose: boolean;\n /** Watch mode for continuous indexing */\n watch: boolean;\n /** Remaining positional arguments */\n remaining: string[];\n}\n\n/**\n * Parse CLI flags from command line arguments\n * @param args - Array of command line arguments (excluding command name)\n * @returns Parsed flags object\n */\nfunction parseFlags(args: string[]): ParsedFlags {\n const flags: ParsedFlags = {\n help: false,\n verbose: false,\n watch: false,\n remaining: [],\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === \"--help\" || arg === \"-h\") {\n flags.help = true;\n } else if (arg === \"--verbose\" || arg === \"-v\") {\n flags.verbose = true;\n } else if (arg === \"--watch\" || arg === \"-w\") {\n flags.watch = true;\n } else if (arg === \"--model\" || arg === \"-m\") {\n const modelName = args[++i];\n if (modelName && modelName in EMBEDDING_MODELS) {\n flags.model = modelName as EmbeddingModelName;\n } else {\n console.error(`Invalid model: ${modelName}`);\n console.error(\n `Available models: ${Object.keys(EMBEDDING_MODELS).join(\", \")}`\n );\n process.exit(1);\n }\n } else if (arg === \"--top\" || arg === \"-k\") {\n const k = parseInt(args[++i], 10);\n if (!isNaN(k) && k > 0) {\n flags.topK = k;\n }\n } else if (arg === \"--min-score\" || arg === \"-s\") {\n const score = parseFloat(args[++i]);\n if (!isNaN(score) && score >= 0 && score <= 1) {\n flags.minScore = score;\n } else {\n console.error(\n `Invalid min-score: ${args[i]}. Must be a number between 0 and 1.`\n );\n process.exit(1);\n }\n } else if (arg === \"--type\" || arg === \"-t\") {\n const type = args[++i];\n if (type) {\n // Normalize: remove leading dot if present\n flags.fileType = type.startsWith(\".\") ? type.slice(1) : type;\n } else {\n console.error(\"--type requires a file extension (e.g., ts, tsx, js)\");\n process.exit(1);\n }\n } else if (!arg.startsWith(\"-\")) {\n flags.remaining.push(arg);\n }\n }\n\n return flags;\n}\n\nasync function main() {\n const flags = parseFlags(args.slice(1)); // Skip the command itself\n\n switch (command) {\n case \"index\": {\n if (flags.help) {\n const models = Object.keys(EMBEDDING_MODELS).join(\", \");\n console.log(`\nraggrep index - Index the current directory for semantic search\n\nUsage:\n raggrep index [options]\n\nOptions:\n -w, --watch Watch for file changes and re-index automatically\n -m, --model <name> Embedding model to use (default: all-MiniLM-L6-v2)\n -v, --verbose Show detailed progress\n -h, --help Show this help message\n\nAvailable Models:\n ${models}\n\nModel Cache: ${getCacheDir()}\n\nExamples:\n raggrep index\n raggrep index --watch\n raggrep index --model bge-small-en-v1.5\n raggrep index --verbose\n`);\n process.exit(0);\n }\n\n const { indexDirectory, watchDirectory } = await import(\"../indexer\");\n\n // Initial indexing\n console.log(\"RAGgrep Indexer\");\n console.log(\"================\\n\");\n try {\n const results = await indexDirectory(process.cwd(), {\n model: flags.model,\n verbose: flags.verbose,\n });\n console.log(\"\\n================\");\n console.log(\"Summary:\");\n for (const result of results) {\n console.log(\n ` ${result.moduleId}: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`\n );\n }\n } catch (error) {\n console.error(\"Error during indexing:\", error);\n process.exit(1);\n }\n\n // Watch mode\n if (flags.watch) {\n console.log(\"\\n┌─────────────────────────────────────────┐\");\n console.log(\"│ Watching for changes... (Ctrl+C to stop) │\");\n console.log(\"└─────────────────────────────────────────┘\\n\");\n\n try {\n const watcher = await watchDirectory(process.cwd(), {\n model: flags.model,\n verbose: flags.verbose,\n onFileChange: (event, filepath) => {\n if (flags.verbose) {\n const symbol =\n event === \"add\" ? \"+\" : event === \"unlink\" ? \"-\" : \"~\";\n console.log(` ${symbol} ${filepath}`);\n }\n },\n });\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.log(\"\\n\\nStopping watcher...\");\n await watcher.stop();\n console.log(\"Done.\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep the process running\n await new Promise(() => {}); // Never resolves\n } catch (error) {\n console.error(\"Error starting watcher:\", error);\n process.exit(1);\n }\n }\n break;\n }\n\n case \"query\": {\n if (flags.help) {\n console.log(`\nraggrep query - Search the indexed codebase\n\nUsage:\n raggrep query <search query> [options]\n\nOptions:\n -k, --top <n> Number of results to return (default: 10)\n -s, --min-score <n> Minimum similarity score 0-1 (default: 0.15)\n -t, --type <ext> Filter by file extension (e.g., ts, tsx, js)\n -h, --help Show this help message\n\nNote:\n If the current directory has not been indexed, raggrep will\n automatically index it before searching.\n\nExamples:\n raggrep query \"user authentication\"\n raggrep query \"handle errors\" --top 5\n raggrep query \"database\" --min-score 0.1\n raggrep query \"interface\" --type ts\n`);\n process.exit(0);\n }\n\n const { search, formatSearchResults } = await import(\"../search\");\n const { getIndexStatus, indexDirectory } = await import(\"../indexer\");\n const query = flags.remaining[0];\n\n if (!query) {\n console.error(\"Usage: raggrep query <search query>\");\n console.error('Run \"raggrep query --help\" for more information.');\n process.exit(1);\n }\n\n try {\n // Check if index exists, if not, create it first\n const status = await getIndexStatus(process.cwd());\n\n if (!status.exists) {\n console.log(\"No index found. Indexing directory first...\\n\");\n console.log(\"RAGgrep Indexer\");\n console.log(\"================\\n\");\n\n const indexResults = await indexDirectory(process.cwd(), {\n model: flags.model,\n verbose: false,\n });\n\n console.log(\"\\n================\");\n console.log(\"Summary:\");\n for (const result of indexResults) {\n console.log(\n ` ${result.moduleId}: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`\n );\n }\n console.log(\"\");\n }\n\n console.log(\"RAGgrep Search\");\n console.log(\"==============\\n\");\n\n // Build file patterns if type filter specified\n const filePatterns = flags.fileType\n ? [`*.${flags.fileType}`]\n : undefined;\n\n const results = await search(process.cwd(), query, {\n topK: flags.topK ?? 10,\n minScore: flags.minScore,\n filePatterns,\n });\n console.log(formatSearchResults(results));\n } catch (error) {\n console.error(\"Error during search:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"cleanup\": {\n if (flags.help) {\n console.log(`\nraggrep cleanup - Remove stale index entries for deleted files\n\nUsage:\n raggrep cleanup [options]\n\nOptions:\n -v, --verbose Show detailed progress\n -h, --help Show this help message\n\nDescription:\n Scans the index and removes entries for files that no longer exist.\n Run this command after deleting files to clean up the index.\n\nExamples:\n raggrep cleanup\n raggrep cleanup --verbose\n`);\n process.exit(0);\n }\n\n const { cleanupIndex } = await import(\"../indexer\");\n console.log(\"RAGgrep Cleanup\");\n console.log(\"===============\\n\");\n try {\n const results = await cleanupIndex(process.cwd(), {\n verbose: flags.verbose,\n });\n console.log(\"\\n===============\");\n console.log(\"Summary:\");\n for (const result of results) {\n console.log(\n ` ${result.moduleId}: ${result.removed} removed, ${result.kept} kept`\n );\n }\n } catch (error) {\n console.error(\"Error during cleanup:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"status\": {\n if (flags.help) {\n console.log(`\nraggrep status - Show the current state of the index\n\nUsage:\n raggrep status [options]\n\nOptions:\n -h, --help Show this help message\n\nDescription:\n Displays information about the index in the current directory,\n including whether it exists, how many files are indexed, and\n when it was last updated.\n\nExamples:\n raggrep status\n`);\n process.exit(0);\n }\n\n const { getIndexStatus } = await import(\"../indexer\");\n try {\n const status = await getIndexStatus(process.cwd());\n\n if (!status.exists) {\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ○ Not indexed │\n└─────────────────────────────────────────┘\n\n Directory: ${status.rootDir}\n\n Run \"raggrep index\" to create an index.\n`);\n } else {\n const date = status.lastUpdated ? new Date(status.lastUpdated) : null;\n const timeAgo = date ? formatTimeAgo(date) : \"unknown\";\n\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ● Indexed │\n└─────────────────────────────────────────┘\n\n Files: ${status.totalFiles.toString().padEnd(10)} Updated: ${timeAgo}\n Location: ${status.indexDir}\n`);\n if (status.modules.length > 0) {\n console.log(\" Modules:\");\n for (const mod of status.modules) {\n console.log(` └─ ${mod.id} (${mod.fileCount} files)`);\n }\n console.log(\"\");\n }\n }\n } catch (error) {\n console.error(\"Error getting status:\", error);\n process.exit(1);\n }\n break;\n }\n\n default:\n console.log(`\nraggrep v${VERSION} - Local filesystem-based RAG system for codebases\n\nUsage:\n raggrep <command> [options]\n\nCommands:\n index Index the current directory\n query Search the indexed codebase\n status Show the current state of the index\n cleanup Remove stale index entries for deleted files\n\nOptions:\n -h, --help Show help for a command\n -v, --version Show version number\n\nExamples:\n raggrep index\n raggrep query \"user login\"\n raggrep status\n raggrep cleanup\n\nRun 'raggrep <command> --help' for more information.\n`);\n if (command && command !== \"--help\" && command !== \"-h\") {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n }\n}\n\nmain();\n"
|
|
29
35
|
],
|
|
30
|
-
"mappings": "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",
|
|
31
|
-
"debugId": "
|
|
36
|
+
"mappings": ";;;;;;;;;;;;;AAOA;AACA;AACA;AAAA;AAmCO,MAAM,8BAA2D;AAAA,EAC9D,WAA6C;AAAA,EAC7C;AAAA,EACA,iBAAiB;AAAA,EACjB,cAAoC;AAAA,EAE5C,WAAW,CAAC,QAAmC;AAAA,IAC7C,KAAK,SAAS;AAAA,MACZ,OAAO,QAAQ,SAAS;AAAA,MACxB,cAAc,QAAQ,gBAAgB;AAAA,IACxC;AAAA;AAAA,OAGI,WAAU,CAAC,QAAyC;AAAA,IACxD,IAAI,QAAQ;AAAA,MAEV,IAAI,OAAO,UAAU,KAAK,OAAO,OAAO;AAAA,QACtC,KAAK,WAAW;AAAA,MAClB;AAAA,MACA,KAAK,SAAS,KAAK,KAAK,WAAW,OAAO;AAAA,IAC5C;AAAA,IAEA,MAAM,KAAK,eAAe;AAAA;AAAA,OAGd,eAAc,GAAkB;AAAA,IAC5C,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,kBAAkB,KAAK,aAAa;AAAA,MAC3C,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,KAAK,iBAAiB;AAAA,IAEtB,KAAK,eAAe,YAAY;AAAA,MAC9B,MAAM,UAAU,iBAAiB,KAAK,OAAO;AAAA,MAE7C,IAAI,KAAK,OAAO,cAAc;AAAA,QAC5B,QAAQ,IAAI;AAAA,6BAAgC,KAAK,OAAO,OAAO;AAAA,QAC/D,QAAQ,IAAI,YAAY,WAAW;AAAA,MACrC;AAAA,MAEA,IAAI;AAAA,QACF,KAAK,WAAW,MAAM,SAAS,sBAAsB,SAAS;AAAA,UAC5D,mBAAmB,KAAK,OAAO,eAC3B,CAAC,aAAmE;AAAA,YAClE,IAAI,SAAS,WAAW,cAAc,SAAS,MAAM;AAAA,cACnD,MAAM,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,QAAQ,IAAI;AAAA,cAChE,QAAQ,OAAO,MAAM,mBAAmB,SAAS,SAAS,SAAS;AAAA,YACrE,EAAO,SAAI,SAAS,WAAW,UAAU,SAAS,MAAM;AAAA,cACtD,QAAQ,OAAO,MAAM,kBAAkB,SAAS;AAAA,CAAsB;AAAA,YACxE;AAAA,cAEF;AAAA,QACN,CAAC;AAAA,QAED,IAAI,KAAK,OAAO,cAAc;AAAA,UAC5B,QAAQ,IAAI;AAAA,CAAkB;AAAA,QAChC;AAAA,QACA,OAAO,OAAO;AAAA,QACd,KAAK,WAAW;AAAA,QAChB,MAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,gBAC1D;AAAA,QACA,KAAK,iBAAiB;AAAA,QACtB,KAAK,cAAc;AAAA;AAAA,OAEpB;AAAA,IAEH,OAAO,KAAK;AAAA;AAAA,OAGR,aAAY,CAAC,MAAiC;AAAA,IAClD,MAAM,KAAK,eAAe;AAAA,IAE1B,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,MACvC,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,IAED,OAAO,MAAM,KAAK,OAAO,IAAoB;AAAA;AAAA,OAGzC,cAAa,CAAC,OAAsC;AAAA,IACxD,IAAI,MAAM,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAEhC,MAAM,KAAK,eAAe;AAAA,IAE1B,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,UAAsB,CAAC;AAAA,IAG7B,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK,YAAY;AAAA,MACjD,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,UAAU;AAAA,MAE3C,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,SAAS;AAAA,QACxB,MAAM,SAAS,MAAM,KAAK,SAAU,MAAM;AAAA,UACxC,SAAS;AAAA,UACT,WAAW;AAAA,QACb,CAAC;AAAA,QACD,OAAO,MAAM,KAAK,OAAO,IAAoB;AAAA,OAC9C,CACH;AAAA,MAEA,QAAQ,KAAK,GAAG,OAAO;AAAA,IACzB;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,YAAY,GAAW;AAAA,IACrB,OAAO;AAAA;AAAA,EAGT,YAAY,GAAW;AAAA,IACrB,OAAO,KAAK,OAAO;AAAA;AAAA,OAGf,QAAO,GAAkB;AAAA,IAC7B,KAAK,WAAW;AAAA;AAEpB;AAKO,SAAS,WAAW,GAAW;AAAA,EACpC,OAAO;AAAA;AAiCF,SAAS,mBAAmB,CAAC,QAAwC;AAAA,EAC1E,MAAM,YAAY,KAAK,iBAAiB,OAAO;AAAA,EAG/C,IAAI,UAAU,UAAU,aAAa,OAAO;AAAA,IAC1C,iBAAiB;AAAA,EACnB;AAAA,EAEA,eAAe;AAAA;AAMV,SAAS,kBAAkB,GAAoB;AAAA,EACpD,OAAO,KAAK,aAAa;AAAA;AAM3B,eAAe,oBAAoB,GAA2C;AAAA,EAC5E,IAAI,CAAC,gBAAgB;AAAA,IACnB,iBAAiB,IAAI,8BAA8B,YAAY;AAAA,IAC/D,MAAM,eAAe,WAAW;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAMT,eAAsB,YAAY,CAAC,MAAiC;AAAA,EAClE,MAAM,WAAW,MAAM,qBAAqB;AAAA,EAC5C,OAAO,SAAS,aAAa,IAAI;AAAA;AAMnC,eAAsB,aAAa,CAAC,OAAsC;AAAA,EACxE,MAAM,WAAW,MAAM,qBAAqB;AAAA,EAC5C,OAAO,SAAS,cAAc,KAAK;AAAA;AAAA,IA/O/B,WAOO,kBAQP,sBAAsB,KAGtB,aAAa,IA0Kf,iBAAuD,MACvD;AAAA;AAAA,EA7LE,YAAiB,UAAQ,WAAQ,GAAG,UAAU,WAAW,QAAQ;AAAA,EAGvE,IAAI,WAAW;AAAA,EACf,IAAI,mBAAmB;AAAA,EAGV,mBAAuD;AAAA,IAClE,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,EAC7B;AAAA,EAiLI,eAAgC;AAAA,IAClC,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA;;;;EC3MA;AAAA;;;;;ACwGO,SAAS,mBAAmB,GAAW;AAAA,EAC5C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,IAvFW,sBAmDA;AAAA;AAAA,EAnDA,uBAAuB;AAAA,IAElC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IAGA;AAAA,EACF;AAAA,EAKa,qBAAqB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;;;;ECtEA;AAAA,EAIA;AAAA;;;AChCA;AACA;AACA;AACA;AA+BA,SAAS,QAAQ,CAAC,WAA2B;AAAA,EAC3C,OAAc,kBAAW,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA;AAezE,SAAS,aAAa,CAC3B,SACA,UAAkB,gBACV;AAAA,EAER,MAAM,eAAoB,cAAQ,OAAO;AAAA,EAGzC,MAAM,cAAc,SAAS,YAAY;AAAA,EAGzC,OAAY,WAAK,mBAAmB,WAAW;AAAA;AAO1C,SAAS,gBAAgB,CAAC,SAI/B;AAAA,EACA,MAAM,eAAoB,cAAQ,OAAO;AAAA,EACzC,MAAM,cAAc,SAAS,YAAY;AAAA,EAEzC,OAAO;AAAA,IACL,UAAe,WAAK,mBAAmB,WAAW;AAAA,IAClD,aAAa;AAAA,IACb;AAAA,EACF;AAAA;AAMK,SAAS,kBAAkB,CAChC,SACA,UACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,WAAK,UAAU,SAAS,QAAQ;AAAA;AAMvC,SAAS,qBAAqB,CACnC,SACA,UACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,WAAK,UAAU,SAAS,UAAU,eAAe;AAAA;AAMxD,SAAS,qBAAqB,CACnC,SACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,WAAK,UAAU,eAAe;AAAA;AAOrC,SAAS,aAAa,CAC3B,SACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,WAAK,UAAU,aAAa;AAAA;AAU1C,eAAsB,UAAU,CAAC,SAAkC;AAAA,EACjE,MAAM,aAAa,cAAc,SAAS,cAAc;AAAA,EAExD,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAS,YAAY,OAAO;AAAA,IACrD,MAAM,cAAc,KAAK,MAAM,OAAO;AAAA,IACtC,OAAO,KAAK,mBAAmB,YAAY;AAAA,IAC3C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAuBJ,SAAS,eAAe,CAC7B,QACA,UAC0B;AAAA,EAC1B,OAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA;AAM9C,SAAS,4BAA4B,CAC1C,cACiB;AAAA,EACjB,MAAM,UAAU,aAAa,WAAW,CAAC;AAAA,EACzC,MAAM,YAAa,QAAQ,kBAA6B;AAAA,EAGxD,IAAI,EAAE,aAAa,oBAAmB;AAAA,IACpC,QAAQ,KACN,4BAA4B,6CAC9B;AAAA,IACA,OAAO,EAAE,OAAO,mBAAmB;AAAA,EACrC;AAAA,EAEA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,cAAc,QAAQ,iBAAiB;AAAA,EACzC;AAAA;AAAA,IAtLW,gBAGP,mBAGO;AAAA;AAAA,EAdb;AAAA,EAQa,iBAAyB,oBAAoB;AAAA,EAGpD,oBAAyB,WAAQ,WAAO,GAAG,iBAAiB;AAAA,EAGrD,oBAAuD;AAAA,IAClE,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,EAC7B;AAAA;;;;ECzBA;AAAA;;;ACkBO,SAAS,QAAQ,CAAC,MAAwB;AAAA,EAC/C,OAAO,KACJ,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,WAAS,MAAM,SAAS,CAAC;AAAA;AAMrC,SAAS,aAAa,CAAC,MAAc,QAA0B;AAAA,EAC7D,OAAO,OAAO,OAAO,OAAK,MAAM,IAAI,EAAE;AAAA;AAAA;AA2BjC,MAAM,UAAU;AAAA,EACb,YAAgE,IAAI;AAAA,EACpE,eAAuB;AAAA,EACvB,sBAA2C,IAAI;AAAA,EAC/C,YAAoB;AAAA,EAO5B,YAAY,CAAC,WAAiC;AAAA,IAC5C,IAAI,cAAc,KAAK,eAAe,KAAK;AAAA,IAE3C,WAAW,OAAO,WAAW;AAAA,MAC3B,MAAM,SAAS,IAAI,UAAU,SAAS,IAAI,OAAO;AAAA,MACjD,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE,SAAS,IAAI,SAAS,OAAO,CAAC;AAAA,MAC3D,eAAe,OAAO;AAAA,MACtB,KAAK;AAAA,MAGL,MAAM,cAAc,IAAI,IAAI,MAAM;AAAA,MAClC,WAAW,QAAQ,aAAa;AAAA,QAC9B,MAAM,QAAQ,KAAK,oBAAoB,IAAI,IAAI,KAAK;AAAA,QACpD,KAAK,oBAAoB,IAAI,MAAM,QAAQ,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,KAAK,eAAe,KAAK,YAAY,IAAI,cAAc,KAAK,YAAY;AAAA;AAAA,EAMlE,GAAG,CAAC,MAAsB;AAAA,IAChC,MAAM,UAAU,KAAK,oBAAoB,IAAI,IAAI,KAAK;AAAA,IACtD,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAG1B,OAAO,KAAK,IAAI,KAAK,KAAK,YAAY,UAAU,QAAQ,UAAU,IAAI;AAAA;AAAA,EAMhE,KAAK,CAAC,QAAkB,YAA8B;AAAA,IAC5D,MAAM,YAAY,OAAO;AAAA,IACzB,IAAI,QAAQ;AAAA,IAEZ,WAAW,QAAQ,YAAY;AAAA,MAC7B,MAAM,KAAK,cAAc,MAAM,MAAM;AAAA,MACrC,IAAI,OAAO;AAAA,QAAG;AAAA,MAEd,MAAM,WAAW,KAAK,IAAI,IAAI;AAAA,MAG9B,MAAM,YAAY,MAAM,UAAU;AAAA,MAClC,MAAM,cAAc,KAAK,WAAW,IAAI,SAAS,UAAU,YAAY,KAAK;AAAA,MAE5E,SAAS,YAAY,YAAY;AAAA,IACnC;AAAA,IAEA,OAAO;AAAA;AAAA,EAUT,MAAM,CAAC,OAAe,OAAe,IAAkB;AAAA,IACrD,MAAM,aAAa,SAAS,KAAK;AAAA,IACjC,IAAI,WAAW,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAErC,MAAM,UAAwB,CAAC;AAAA,IAE/B,YAAY,MAAM,aAAa,KAAK,WAAW;AAAA,MAC7C,MAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU;AAAA,MAC3C,IAAI,QAAQ,GAAG;AAAA,QACb,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAAA,MAM1B,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK;AAAA;AAAA,EAMd,KAAK,GAAS;AAAA,IACZ,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,oBAAoB,MAAM;AAAA,IAC/B,KAAK,eAAe;AAAA,IACpB,KAAK,YAAY;AAAA;AAAA,EASnB,WAAW,CAAC,IAAY,QAAwB;AAAA,IAC9C,KAAK,aAAa,CAAC,EAAE,IAAI,SAAS,IAAI,OAAO,CAAC,CAAC;AAAA;AAAA,EAMjD,SAAS,GAAuB;AAAA,IAC9B,MAAM,YAAsC,CAAC;AAAA,IAC7C,YAAY,MAAM,aAAa,KAAK,WAAW;AAAA,MAC7C,UAAU,MAAM;AAAA,IAClB;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,qBAAqB,OAAO,YAAY,KAAK,mBAAmB;AAAA,MAChE,WAAW,KAAK;AAAA,IAClB;AAAA;AAAA,SAMK,WAAW,CAAC,MAAqC;AAAA,IACtD,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,YAAY,KAAK;AAAA,IACvB,MAAM,sBAAsB,IAAI,IAAI,OAAO,QAAQ,KAAK,mBAAmB,CAAC;AAAA,IAE5E,YAAY,IAAI,WAAW,OAAO,QAAQ,KAAK,SAAS,GAAG;AAAA,MACzD,MAAM,UAAU,IAAI,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC;AAAA,IACjD;AAAA,IAEA,OAAO;AAAA;AAEX;AAmBO,SAAS,cAAc,CAAC,OAAe,WAAmB,GAAW;AAAA,EAC1E,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,CAAC;AAAA;AAAA,IAxN1C,UAAU,KACV,SAAS;;;ACRf;AACA;AAmFO,SAAS,mBAAmB,CAAC,MAAqB;AAAA,EACvD,MAAM,YAAY,KAAK,YAAY;AAAA,EAEnC,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,IAC9D,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,WAAW,WAAW,UAAU;AAAA,MAC9B,IAAI,UAAU,SAAS,OAAO,GAAG;AAAA,QAC/B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAgBT,eAAe,mBAAmB,CAChC,SACA,aAAqB,IACrB,QAAgB,GACY;AAAA,EAC5B,IAAI,QAAQ;AAAA,IAAgB,OAAO,CAAC;AAAA,EAEpC,MAAM,UAA6B,CAAC;AAAA,EACpC,MAAM,UAAU,aAAkB,WAAK,SAAS,UAAU,IAAI;AAAA,EAE9D,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAGjE,MAAM,iBAAiB,QAAQ,KAC7B,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,cAClC;AAAA,IAEA,IAAI,kBAAkB,YAAY;AAAA,MAEhC,MAAM,OAAO,MAAM,iBAAiB,SAAS,UAAU;AAAA,MACvD,IAAI,MAAM;AAAA,QACR,QAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,IAGA,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,CAAC,MAAM,YAAY;AAAA,QAAG;AAAA,MAC1B,IAAI,UAAU,IAAI,MAAM,IAAI;AAAA,QAAG;AAAA,MAE/B,MAAM,UAAU,aAAa,GAAG,cAAc,MAAM,SAAS,MAAM;AAAA,MACnE,MAAM,aAAa,MAAM,oBAAoB,SAAS,SAAS,QAAQ,CAAC;AAAA,MACxE,QAAQ,KAAK,GAAG,UAAU;AAAA,IAC5B;AAAA,IACA,MAAM;AAAA,EAIR,OAAO;AAAA;AAMT,eAAe,gBAAgB,CAC7B,SACA,cACiC;AAAA,EACjC,IAAI;AAAA,IACF,MAAM,kBAAuB,WAAK,SAAS,cAAc,cAAc;AAAA,IACvE,MAAM,UAAU,MAAS,aAAS,iBAAiB,OAAO;AAAA,IAC1D,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,IAG9B,MAAM,OAAO,IAAI,QAAa,eAAS,YAAY;AAAA,IAGnD,MAAM,OAAO,KAAK,IAAI,iBAAiB,IAAI,gBAAgB;AAAA,IAC3D,IAAI,OAAoB;AAAA,IAExB,IAAI,KAAK,WAAW,KAAK,YAAY,KAAK,UAAU,KAAK,WAAW;AAAA,MAClE,OAAO;AAAA,IACT,EAAO,SAAI,KAAK,cAAc,KAAK,cAAc,KAAK,UAAU,KAAK,SAAS;AAAA,MAC5E,OAAO;AAAA,IACT,EAAO,SAAI,IAAI,QAAQ,IAAI,SAAS;AAAA,MAClC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,gBAAgB,QAAQ,IAAI,UAAU;AAAA,IAE5C,OAAO,EAAE,MAAM,cAAc,MAAM,cAAc;AAAA,IACjD,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAWX,eAAsB,sBAAsB,CAC1C,SAC2B;AAAA,EAC3B,MAAM,aAAa,IAAI;AAAA,EACvB,IAAI,aAAa;AAAA,EAEjB,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IACjE,MAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAGzE,MAAM,mBAAmB,CAAC,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAChE,MAAM,uBAAuB,iBAAiB,KAAK,CAAC,MAClD,SAAS,SAAS,CAAC,CACrB;AAAA,IAEA,IAAI,sBAAsB;AAAA,MACxB,aAAa;AAAA,MAGb,WAAW,WAAW,kBAAkB;AAAA,QACtC,IAAI,CAAC,SAAS,SAAS,OAAO;AAAA,UAAG;AAAA,QAEjC,MAAM,aAAkB,WAAK,SAAS,OAAO;AAAA,QAC7C,IAAI;AAAA,UACF,MAAM,UAAU,MAAS,YAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,UAEpE,WAAW,UAAU,SAAS;AAAA,YAC5B,IAAI,CAAC,OAAO,YAAY;AAAA,cAAG;AAAA,YAE3B,MAAM,cAAc,GAAG,WAAW,OAAO;AAAA,YACzC,MAAM,OAAO,eAAe,OAAO;AAAA,YAGnC,WAAW,IAAI,aAAa;AAAA,cAC1B,MAAM,OAAO;AAAA,cACb,MAAM;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,IACF;AAAA,IAGA,MAAM,eAAe,MAAM,oBAAoB,OAAO;AAAA,IAEtD,WAAW,OAAO,cAAc;AAAA,MAE9B,IAAI,IAAI,eAAe;AAAA,QACrB,aAAa;AAAA,MACf;AAAA,MAGA,IAAI,aAAa,SAAS,GAAG;AAAA,QAC3B,aAAa;AAAA,MACf;AAAA,MAIA,WAAW,IAAI,IAAI,cAAc;AAAA,QAC/B,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAwB;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,cAAmB,WAAK,SAAS,cAAc;AAAA,MACrD,MAAM,UAAU,KAAK,MAAM,MAAS,aAAS,aAAa,OAAO,CAAC;AAAA,MAElE,IAAI,QAAQ,YAAY;AAAA,QACtB,aAAa;AAAA,MACf;AAAA,MAGA,MAAM,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,gBAAgB;AAAA,MACnE,IAAI,KAAK,WAAW,KAAK,YAAY,KAAK,QAAQ;AAAA,QAChD,WAAW;AAAA,MACb,EAAO,SAAI,KAAK,cAAc,KAAK,cAAc,KAAK,QAAQ;AAAA,QAC5D,WAAW;AAAA,MACb;AAAA,MACA,MAAM;AAAA,IAKR,MAAM,WAAW,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,KAC/C,CAAC,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,MACnC;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,aAAa,YAAY;AAAA,IACrC;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA;AAAA;AAOJ,SAAS,cAAc,CAAC,YAAiC;AAAA,EACvD,QAAQ;AAAA,SACD;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAUN,SAAS,kBAAkB,CAChC,UACA,WACS;AAAA,EAET,MAAM,iBAAiB,SAAS,QAAQ,OAAO,GAAG;AAAA,EAGlD,MAAM,UAAqB,CAAC;AAAA,EAG5B,WAAW,WAAW,UAAU,UAAU;AAAA,IACxC,IACE,mBAAmB,QAAQ,QAC3B,eAAe,WAAW,QAAQ,OAAO,GAAG,GAC5C;AAAA,MACA,QAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,OAAO,QAAQ,OAAO,CAAC,MAAM,YAC3B,QAAQ,KAAK,SAAS,KAAK,KAAK,SAAS,UAAU,IACrD;AAAA,EACF;AAAA,EAGA,aAAa,SAAS,UAAU,kBAAkB;AAAA,IAChD,MAAM,QAAQ,eAAe,MAAM,OAAO;AAAA,IAC1C,IAAI,OAAO;AAAA,MACT,OAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,UAAU,YAAY;AAAA,EAC9B;AAAA;AAAA,IAnXI,iBAAiB,GAGjB,WAcA,kBAsBA;AAAA;AAAA,EApCA,YAAY,IAAI,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EAKK,mBAID;AAAA,IAEH,EAAE,SAAS,kBAAkB,MAAM,OAAO,cAAc,UAAU;AAAA,IAElE,EAAE,SAAS,sBAAsB,MAAM,WAAW,cAAc,SAAS;AAAA,IAEzE,EAAE,SAAS,kBAAkB,MAAM,WAAW,cAAc,SAAS;AAAA,IAErE,EAAE,SAAS,sBAAsB,MAAM,WAAW,cAAc,UAAU;AAAA,IAE1E,EAAE,SAAS,qBAAqB,MAAM,UAAU,cAAc,UAAU;AAAA,IAExE,EAAE,SAAS,mBAAmB,MAAM,UAAU,cAAc,UAAU;AAAA,EACxE;AAAA,EAKM,iBAA0C;AAAA,IAC9C,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,UAAU,UAAU,SAAS,OAAO,QAAQ,SAAS,QAAQ;AAAA,IACtE,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AAAA;;;ACjFA;AAMA,SAAS,eAAe,CAAC,UAA0B;AAAA,EACjD,MAAM,MAAW,cAAQ,QAAQ;AAAA,EACjC,OAAY,eAAS,GAAG;AAAA;AAAA,IAMb;AAAA;AAAA,0BAA0C;AAAA,IACrD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,mCAAmC,KAAK,QAAQ;AAAA;AAAA,MAEzD,UAAU,CAAC,SAAS,UAAU,WAAW,QAAQ;AAAA,MAEjD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QAEvC,IAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC7D,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,kCAAkC,KAAK,QAAQ;AAAA;AAAA,MAExD,UAAU,CAAC,SAAS,QAAQ,cAAc,aAAa,SAAS;AAAA,IAClE;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,8BAA8B,KAAK,QAAQ;AAAA;AAAA,MAEpD,UAAU,CAAC,QAAQ,OAAO,eAAe,aAAa,MAAM;AAAA,IAC9D;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,UAAU,QAAQ,SAAS;AAAA,MAC/C,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QACvC,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC5C,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,WAAW,QAAQ,UAAU,QAAQ;AAAA,MACzD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QACvC,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC5C,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa,YAAY,aAAa;AAAA;AAAA,MAE/C,UAAU,CAAC,SAAS,SAAS,QAAQ,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA;;;ICnGa;AAAA;AAAA,0BAA0C;AAAA,IAIrD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,WAAW,gBAAgB,OAAO,WAAW,YAAY,MAAM;AAAA,IAC5E;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,yBAAyB,aAAa;AAAA,MACrD,UAAU,CAAC,aAAa,YAAY,QAAQ,UAAU;AAAA,IACxD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,gBAAgB,QAAQ,QAAQ,UAAU;AAAA,IACvD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,gBAAgB,QAAQ,OAAO,UAAU;AAAA,IACtD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eAAe,aAAa;AAAA,MAC3C,UAAU,CAAC,gBAAgB,QAAQ,OAAO,UAAU;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,mBACZ,SAAS,WAAW,WAAW,KAAK,SAAS,SAAS,OAAO;AAAA,MAChE,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,cAAc,UAAU,YAAY,MAAM,YAAY,OAAO;AAAA,IAC1E;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eACb,aAAa,kBACb,aAAa,mBACb,aAAa,oBACb,aAAa,mBACb,aAAa,oBACb,aAAa,sBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,QAAQ,SAAS,cAAc;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,iBACb,aAAa,oBACb,aAAa,qBACb,aAAa,sBACb,aAAa,qBACb,aAAa,sBACb,aAAa,wBACb,aAAa,yBACb,aAAa;AAAA,MACf,UAAU,CAAC,YAAY,cAAc,UAAU,cAAc,OAAO;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBAAgB,aAAa;AAAA,MAC5C,UAAU,CAAC,SAAS,WAAW,cAAc,QAAQ,QAAQ;AAAA,IAC/D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,oBACb,aAAa;AAAA,MACf,UAAU,CAAC,QAAQ,WAAW,SAAS,cAAc,KAAK;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACZ,SAAS,WAAW,UAAU,MAC5B,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,KAAK;AAAA,MACxD,UAAU,CAAC,WAAW,WAAW,SAAS,WAAW,SAAS;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBACb,aAAa,sBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,SAAS,OAAO,QAAQ;AAAA,IAC1D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,WAAW,SAAS,MAAM;AAAA,IAClD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,oBACb,aAAa,qBACb,aAAa,qBACb,aAAa;AAAA,MACf,UAAU,CAAC,QAAQ,WAAW,QAAQ,aAAa,QAAQ;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBACb,aAAa,sBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,QAAQ,aAAa,QAAQ;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,0BACb,aAAa;AAAA,MACf,UAAU,CAAC,cAAc,WAAW,OAAO,cAAc,cAAc;AAAA,IACzE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,WAAW,OAAO,cAAc,cAAc;AAAA,IACtE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,wBACb,aAAa,wBACb,aAAa,yBACb,aAAa;AAAA,MACf,UAAU,CAAC,YAAY,OAAO,WAAW,WAAW,QAAQ;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,wBACb,aAAa,wBACb,aAAa,gBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,OAAO,WAAW,YAAY;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,UACb,aAAa,gBACb,aAAa,sBACb,aAAa,qBACb,aAAa,eACb,SAAS,WAAW,OAAO;AAAA,MAC7B,UAAU,CAAC,eAAe,OAAO,aAAa,WAAW,QAAQ;AAAA,IACnE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,kBACb,aAAa,iBACb,aAAa;AAAA,MACf,UAAU,CAAC,eAAe,OAAO,WAAW,YAAY,OAAO;AAAA,IACjE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBAAgB,SAAS,WAAW,aAAa;AAAA,MAChE,UAAU,CAAC,UAAU,aAAa,SAAS,cAAc,OAAO;AAAA,IAClE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,wBACb,aAAa,yBACb,aAAa,iBACb,aAAa,kBACb,SAAS,WAAW,iBAAiB;AAAA,MACvC,UAAU,CAAC,UAAU,WAAW,cAAc,YAAY,YAAY;AAAA,IACxE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,oBAAoB,KAAK,SAAS,SAAS,MAAM;AAAA,MACrE,UAAU,CAAC,UAAU,WAAW,MAAM,MAAM,YAAY,YAAY;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,cAAc,WAAW,YAAY;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,WAAW,cAAc,WAAW,WAAW;AAAA,IAC5D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,OAAO,UAAU,mBAAmB,UAAU;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,OAAO,cAAc,mBAAmB,cAAc;AAAA,IACnE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,eAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,kBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,aAAa,WAAW,YAAY,WAAW,UAAU;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,qBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,gBAAgB,gBAAgB,cAAc,aAAa;AAAA,IACxE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,aAC3B,SAAS,YAAY,MAAM,gBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,WAAW,SAAS,aAAa,OAAO;AAAA,IACrD;AAAA,EACF;AAAA;;;ICpZM,mBAoNO;AAAA;AAAA,EApNP,oBAAsC;AAAA,IAI1C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,qBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,QAAQ,UAAU,aAAa,UAAU;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,SAAS,cAAc,cAAc;AAAA,IAC5D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,gBAAgB,aAAa,iBAC1C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,UAAU,WAAW,YAAY,YAAY;AAAA,MAClE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,sBAAsB;AAAA,QACnD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAAA,UACzD,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,QAC5C;AAAA,QACA,IAAI,aAAa,oBAAoB,aAAa,iBAAiB;AAAA,UACjE,OAAO,CAAC,QAAQ,MAAM;AAAA,QACxB;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,eACxC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,QAAQ,SAAS,QAAQ,YAAY;AAAA,MAC1D,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,oBAAoB;AAAA,QACjD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,QAC5C;AAAA,QACA,IAAI,aAAa,kBAAkB,aAAa,eAAe;AAAA,UAC7D,OAAO,CAAC,QAAQ,SAAS,MAAM;AAAA,QACjC;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,iBAAiB,aAAa,kBAC3C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,WAAW,YAAY,YAAY,SAAS;AAAA,IACnE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,eAAe,aAAa,gBACzC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,SAAS,YAAY,YAAY,OAAO;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,mBAAmB,aAAa,oBAC7C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,OAAO,aAAa,WAAW,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,kBAAkB,aAAa,mBAC5C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,YAAY,WAAW,YAAY;AAAA,IAC1D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,gBACxC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,OAAO,SAAS,WAAW,YAAY,MAAM;AAAA,MAClE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,0BAA0B;AAAA,QACvD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,QACxD;AAAA,QACA,OAAO,CAAC,KAAK;AAAA;AAAA,IAEjB;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,mBAAmB,aAAa;AAAA,MAC/C,UAAU,CAAC,UAAU,cAAc,QAAQ,WAAW,aAAa;AAAA,IACrE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBAAsB,aAAa;AAAA,MAClD,UAAU,CAAC,UAAU,SAAS,UAAU,YAAY,OAAO;AAAA,IAC7D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,aAAa,KAAK,SAAS,WAAW,YAAY;AAAA,MACtE,UAAU,CAAC,UAAU,OAAO,SAAS,WAAW,YAAY,cAAc;AAAA,MAC1E,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,QAAQ,SAAS,MAAM,4BAA4B;AAAA,QACzD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,QACxD;AAAA,QACA,OAAO,CAAC,KAAK;AAAA;AAAA,IAEjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,mBAAmB,aAAa,oBAC7C,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC/D,UAAU,CAAC,UAAU,YAAY,QAAQ,QAAQ,QAAQ,cAAc;AAAA,IACzE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,eACxC,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC/D,UAAU,CAAC,UAAU,OAAO,WAAW,YAAY,cAAc;AAAA,IACnE;AAAA,EACF;AAAA,EAKa,kBAAwC;AAAA,IACnD,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,CAAC,aAAa;AAAA,MAEpB,OACE,aAAa,oBACb,aAAa,qBACb,aAAa,oBACb,SAAS,SAAS,YAAY,KAC9B,SAAS,SAAS,cAAc;AAAA;AAAA,IAGpC,aAAa;AAAA,EACf;AAAA;;;ICjOM,mBAkIO;AAAA;AAAA,EAlIP,oBAAsC;AAAA,IAI1C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,UAAU,WAAW,UAAU;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,UAAU,YAAY,UAAU,SAAS,OAAO;AAAA,IACvE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,UAAU,eACzB,cAAc,SAAS,cAAc,WACrC,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS,MAC/D,CAAC,SAAS,SAAS,cAAc,KACjC,aAAa,eACb,CAAC,SAAS,WAAW,GAAG;AAAA,MAC1B,UAAU,CAAC,UAAU,YAAY,WAAW,SAAS,YAAY,QAAQ;AAAA,MACzE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,wBAAwB;AAAA,QACrD,IAAI,OAAO;AAAA,UACT,MAAM,OAAO,MAAM,GAAG,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,UAC9D,IAAI,QAAQ,CAAC,CAAC,UAAU,QAAQ,OAAO,EAAE,SAAS,IAAI,GAAG;AAAA,YACvD,OAAO,CAAC,KAAK,YAAY,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,QAAQ,UAAU,OAAO,aAAa,MAAM;AAAA,IACnE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,qBAAqB,KACvC,SAAS,WAAW,oBAAoB;AAAA,MAC1C,UAAU,CAAC,UAAU,aAAa,SAAS,KAAK;AAAA,IAClD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,QAAQ,kBAAkB,SAAS,OAAO;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,QAAQ,UAAU,aAAa,OAAO;AAAA,IAC7D;AAAA,EACF;AAAA,EAKa,kBAAwC;AAAA,IACnD,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,CAAC,aAAa;AAAA,MAEpB,OACE,aAAa,iBACb,SAAS,WAAW,SAAS,KAC7B,SAAS,SAAS,UAAU;AAAA;AAAA,IAGhC,aAAa;AAAA,EACf;AAAA;;;AChIO,SAAS,0BAA0B,GAAG;AAAA,EAC3C,OAAO,mBAAmB,QAAQ,CAAC,MAAM,EAAE,WAAW;AAAA;AAAA,IAT3C;AAAA;AAAA,EAPb;AAAA,EACA;AAAA,EA0BA;AAAA,EACA;AAAA,EArBa,qBAA6C;AAAA,IACxD;AAAA,IACA;AAAA,EACF;AAAA;;;ACDA;AAiBA,SAAS,iBAAiB,GAAqB;AAAA,EAC7C,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,2BAA2B;AAAA,EAChC;AAAA;AAqFK,SAAS,cAAc,GAAqB;AAAA,EACjD,OAAO;AAAA,IACL,GAAG,kBAAkB;AAAA,IACrB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA;AASK,SAAS,qBAAqB,CAAC,UAA4B;AAAA,EAChE,MAAM,cAAc,eAAe;AAAA,EACnC,MAAM,WAAgB,eAAS,QAAQ;AAAA,EACvC,MAAM,YAAiB,cAAQ,QAAQ;AAAA,EACvC,MAAM,WAAW,IAAI;AAAA,EAErB,WAAW,cAAc,aAAa;AAAA,IACpC,IAAI;AAAA,MACF,IAAI,WAAW,MAAM,UAAU,UAAU,SAAS,GAAG;AAAA,QAEnD,WAAW,WAAW,WAAW,UAAU;AAAA,UACzC,SAAS,IAAI,QAAQ,YAAY,CAAC;AAAA,QACpC;AAAA,QAGA,IAAI,WAAW,iBAAiB;AAAA,UAC9B,MAAM,aAAa,WAAW,gBAAgB,QAAQ;AAAA,UACtD,WAAW,MAAM,YAAY;AAAA,YAC3B,IAAI,MAAM,GAAG,SAAS,GAAG;AAAA,cACvB,SAAS,IAAI,GAAG,YAAY,CAAC;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AAAA,IA1HtB,2BAwCA;AAAA;AAAA,EAlEN;AAAA,EACA;AAAA,EACA;AAAA,EAyLA;AAAA,EACA;AAAA,EACA;AAAA,EAnKM,4BAA8C;AAAA,IAClD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,SAAS,SAAS,OAAO;AAAA,MACxD,UAAU,CAAC,SAAS,gBAAgB,cAAc,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,SAAS,WAAW,KAAK,aAAa;AAAA,MACjD,UAAU,CAAC,SAAS,eAAe,cAAc,YAAY;AAAA,MAC7D,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,qBAAqB;AAAA,QAClD,IAAI,OAAO;AAAA,UACT,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,QAChC;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC9D,UAAU,CAAC,SAAS,aAAa;AAAA,IACnC;AAAA,EACF;AAAA,EAKM,sBAAwC;AAAA,IAC5C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,QAAQ;AAAA,MAC5B,UAAU,CAAC,QAAQ,QAAQ,WAAW;AAAA,MACtC,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,wBAAwB;AAAA,QACrD,IAAI,OAAO;AAAA,UACT,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,QAChC;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,aAAa,KAC/B,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,SAAS,KAC3B,SAAS,WAAW,YAAY,KAChC,SAAS,WAAW,OAAO,KAC3B,SAAS,WAAW,QAAQ;AAAA,MAC9B,UAAU,CAAC,QAAQ,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA;;;ACjHA;AAoJO,SAAS,cAAc,CAC5B,UACA,WACA,aACmB;AAAA,EAEnB,MAAM,iBAAiB,SAAS,QAAQ,OAAO,GAAG;AAAA,EAClD,MAAM,WAAW,eAAe,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EACrE,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM;AAAA,EAClD,MAAM,MAAW,cAAQ,QAAQ;AAAA,EAGjC,MAAM,UAAU,mBAAmB,gBAAgB,SAAS;AAAA,EAG5D,MAAM,WAAW,sBAAsB,QAAQ;AAAA,EAG/C,MAAM,QAAQ,YAAY,UAAU,QAAQ;AAAA,EAG5C,MAAM,SAAS,aAAa,QAAQ;AAAA,EAGpC,MAAM,QAAQ,YAAY,UAAU,SAAS,KAAK;AAAA,EAGlD,IAAI;AAAA,EACJ,IAAI,aAAa;AAAA,IACf,YAAY,gBAAgB,WAAW;AAAA,EACzC;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,SAAS;AAAA,IACzB,cAAc,SAAS,MAAM,GAAG,EAAE;AAAA,EACpC;AAAA;AAMF,SAAS,WAAW,CAAC,UAAoB,UAAsC;AAAA,EAE7E,MAAM,gBAAgB,SAAS,YAAY;AAAA,EAC3C,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,IAC9D,WAAW,WAAW,UAAU;AAAA,MAC9B,IAAI,cAAc,SAAS,OAAO,GAAG;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAGA,SAAS,IAAI,SAAS,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC7C,MAAM,UAAU,SAAS,GAAG,YAAY;AAAA,IACxC,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,MAC9D,IAAI,SAAS,SAAS,OAAO,GAAG;AAAA,QAC9B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAMF,SAAS,YAAY,CAAC,UAAwC;AAAA,EAE5D,MAAM,eAAe,IAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,OAAO,cAAc,EAAE,KAAK;AAAA,EACxC,CAAC;AAAA,EAED,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,eAAe,QAAQ,YAAY;AAAA,IACzC,IAAI,aAAa,IAAI,YAAY;AAAA,MAAG;AAAA,IAGpC,IAAI,gBAAgB,SAAS,YAAY,GAAG;AAAA,MAC1C,OAAO;AAAA,IACT;AAAA,IAGA,WAAW,UAAU,iBAAiB;AAAA,MACpC,IAAI,aAAa,WAAW,MAAM,KAAK,aAAa,SAAS,MAAM,GAAG;AAAA,QACpE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAMF,SAAS,WAAW,CAClB,UACA,SACA,OACO;AAAA,EAEP,MAAM,eAAe,oBAAoB,QAAQ,IAAI;AAAA,EACrD,IAAI,iBAAiB,WAAW;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,OAAO;AAAA,IACT,QAAQ;AAAA,WACD;AAAA,WACA;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA;AAAA,EAEb;AAAA,EAGA,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,eAAe,QAAQ,YAAY;AAAA,IACzC,IAAI,CAAC,UAAU,OAAO,SAAS,EAAE,SAAS,YAAY,GAAG;AAAA,MACvD,OAAO;AAAA,IACT;AAAA,IACA,IAAI,CAAC,UAAU,OAAO,YAAY,IAAI,EAAE,SAAS,YAAY,GAAG;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,IAAI,CAAC,UAAU,UAAU,OAAO,MAAM,EAAE,SAAS,YAAY,GAAG;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,eAAe,CAAC,SAAqC;AAAA,EAC5D,YAAY,WAAW,eAAe,OAAO,QAAQ,oBAAoB,GAAG;AAAA,IAC1E,WAAW,aAAa,YAAY;AAAA,MAClC,IACE,QAAQ,SAAS,SAAS,WAAW,KACrC,QAAQ,SAAS,SAAS,WAAW,KACrC,QAAQ,SAAS,YAAY,WAAW,KACxC,QAAQ,SAAS,YAAY,WAAW,GACxC;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAMK,SAAS,uBAAuB,CAAC,OAAoC;AAAA,EAC1E,MAAM,WAAqB,CAAC;AAAA,EAG5B,MAAM,WAAgB,eAAS,MAAM,QAAQ;AAAA,EAC7C,MAAM,qBAAqB,SAAS,QAAQ,YAAY,EAAE;AAAA,EAE1D,MAAM,gBAAgB,mBACnB,MAAM,OAAO,EACb,QAAQ,CAAC,SAAS,KAAK,MAAM,WAAW,CAAC,EACzC,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,EAChC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,EACnC,SAAS,KAAK,GAAG,aAAa;AAAA,EAE9B,SAAS,KAAK,mBAAmB,YAAY,CAAC;AAAA,EAG9C,IAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AAAA,IACvD,SAAS,KAAK,MAAM,QAAQ,KAAK,YAAY,CAAC;AAAA,EAChD;AAAA,EAGA,IAAI,MAAM,UAAU,WAAW;AAAA,IAC7B,SAAS,KAAK,MAAM,KAAK;AAAA,EAC3B;AAAA,EAGA,IAAI,MAAM,OAAO;AAAA,IACf,SAAS,KAAK,MAAM,KAAK;AAAA,EAC3B;AAAA,EAGA,IAAI,MAAM,QAAQ;AAAA,IAChB,SAAS,KAAK,MAAM,MAAM;AAAA,EAC5B;AAAA,EAGA,IAAI,MAAM,aAAa,WAAW;AAAA,IAChC,SAAS,KAAK,MAAM,QAAQ;AAAA,EAC9B;AAAA,EAGA,IAAI,MAAM,WAAW;AAAA,IACnB,SAAS,KAAK,MAAM,SAAS;AAAA,EAC/B;AAAA,EAGA,MAAM,eAAe,IAAI,IAAI,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,EACpD,WAAW,WAAW,MAAM,cAAc;AAAA,IACxC,IAAI,CAAC,aAAa,IAAI,QAAQ,YAAY,CAAC,KAAK,QAAQ,SAAS,GAAG;AAAA,MAClE,SAAS,KAAK,QAAQ,YAAY,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EAGA,MAAM,qBAAqB,sBAAsB,MAAM,QAAQ;AAAA,EAC/D,SAAS,KAAK,GAAG,kBAAkB;AAAA,EAEnC,OAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAAA;AAAA,IApXxB,gBAkCA,iBA0DA,sBAcA;AAAA;AAAA,EAhHN;AAAA,EACA;AAAA,EAKM,iBAA2C;AAAA,IAC/C,YAAY,CAAC,cAAc,OAAO,UAAU,SAAS,SAAS;AAAA,IAC9D,SAAS,CAAC,WAAW,SAAS,WAAW,YAAY,SAAS;AAAA,IAC9D,YAAY,CAAC,cAAc,QAAQ,OAAO,SAAS,aAAa;AAAA,IAChE,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,QAAQ,SAAS,UAAU,WAAW,UAAU,KAAK;AAAA,IAC5D,QAAQ,CAAC,UAAU,iBAAiB,UAAU;AAAA,IAC9C,YAAY,CAAC,cAAc,aAAa;AAAA,IACxC,QAAQ,CAAC,QAAQ;AAAA,IACjB,gBAAgB,CAAC,kBAAkB,OAAO;AAAA,IAC1C,aAAa,CAAC,eAAe,KAAK;AAAA,IAClC,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,QAAQ,SAAS,QAAQ,SAAS,aAAa,KAAK;AAAA,EAC7D;AAAA,EAKM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAKM,uBAAiD;AAAA,IACrD,QAAQ,CAAC,QAAQ,OAAO;AAAA,IACxB,SAAS,CAAC,SAAS;AAAA,IACnB,SAAS,CAAC,SAAS;AAAA,IACnB,OAAO,CAAC,OAAO;AAAA,IACf,KAAK,CAAC,KAAK;AAAA,IACX,SAAS,CAAC,WAAW;AAAA,IACrB,QAAQ,CAAC,UAAU;AAAA,IACnB,KAAK,CAAC,KAAK;AAAA,EACb;AAAA,EAKM,wBAAgD;AAAA,IACpD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA;;;AC/IA;AACA;AAAA;AAmBO,MAAM,mBAAmB;AAAA,EACtB;AAAA,EACA,YAAqC;AAAA,EACrC,QAAwC,IAAI;AAAA,EAC5C,SAA8B,CAAC;AAAA,EAEvC,WAAW,CAAC,SAAiB;AAAA,IAC3B,KAAK,UAAU;AAAA;AAAA,OAMX,WAAU,GAAkB;AAAA,IAChC,KAAK,YAAY,MAAM,uBAAuB,KAAK,OAAO;AAAA,IAG1D,IAAI;AAAA,MACF,MAAM,aAAkB,WAAK,KAAK,SAAS,YAAY,aAAa;AAAA,MACpE,MAAM,gBAAgB,MAAS,aAAS,YAAY,OAAO;AAAA,MAC3D,MAAM,SAAS,KAAK,MAAM,aAAa;AAAA,MACvC,KAAK,SAAS,OAAO,iBAAiB,CAAC;AAAA,MACvC,MAAM;AAAA;AAAA,EAQV,YAAY,GAA4B;AAAA,IACtC,OAAO,KAAK;AAAA;AAAA,EAMd,OAAO,CAAC,UAAkB,SAAqC;AAAA,IAC7D,IAAI,CAAC,KAAK,WAAW;AAAA,MACnB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,QAAQ,eAAe,UAAU,KAAK,WAAW,OAAO;AAAA,IAG9D,KAAK,eAAe,KAAK;AAAA,IAEzB,KAAK,MAAM,IAAI,UAAU,KAAK;AAAA,IAC9B,OAAO;AAAA;AAAA,EAMT,OAAO,CAAC,UAAiD;AAAA,IACvD,OAAO,KAAK,MAAM,IAAI,QAAQ;AAAA;AAAA,EAMhC,WAAW,GAAwB;AAAA,IACjC,OAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA;AAAA,EAM/B,cAAc,CAAC,OAAgC;AAAA,IACrD,IAAI,CAAC,KAAK,OAAO;AAAA,MAAU;AAAA,IAG3B,YAAY,aAAa,cAAc,OAAO,QAAQ,KAAK,OAAO,QAAQ,GAAG;AAAA,MAC3E,IAAI,MAAM,SAAS,WAAW,cAAc,GAAG,KAAK,MAAM,QAAQ,SAAS,aAAa;AAAA,QACtF,IAAI,UAAU,OAAO;AAAA,UACnB,MAAM,QAAQ,UAAU;AAAA,QAC1B;AAAA,QACA,IAAI,UAAU,WAAW;AAAA,UACvB,MAAM,YAAY,UAAU;AAAA,QAC9B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,OAMI,KAAI,CAAC,QAA+B;AAAA,IACxC,MAAM,WAAgB,WAAK,cAAc,KAAK,SAAS,MAAM,GAAG,eAAe;AAAA,IAC/E,MAAS,UAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAG5C,MAAM,cAAmB,WAAK,UAAU,eAAe;AAAA,IACvD,MAAS,cACP,aACA,KAAK,UACH;AAAA,MACE,SAAS;AAAA,MACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,WAAW,KAAK;AAAA,IAClB,GACA,MACA,CACF,CACF;AAAA,IAGA,YAAY,UAAU,UAAU,KAAK,OAAO;AAAA,MAC1C,MAAM,gBAAqB,WACzB,UACA,SACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,MAAS,UAAW,cAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/D,MAAS,cAAU,eAAe,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,IAClE;AAAA,IAEA,QAAQ,IACN,wCAAwC,KAAK,MAAM,YACrD;AAAA;AAAA,OAMI,KAAI,CAAC,QAA+B;AAAA,IACxC,MAAM,WAAgB,WAAK,cAAc,KAAK,SAAS,MAAM,GAAG,eAAe;AAAA,IAE/E,IAAI;AAAA,MAEF,MAAM,cAAmB,WAAK,UAAU,eAAe;AAAA,MACvD,MAAM,iBAAiB,MAAS,aAAS,aAAa,OAAO;AAAA,MAC7D,MAAM,cAAc,KAAK,MAAM,cAAc;AAAA,MAC7C,KAAK,YAAY,YAAY;AAAA,MAG7B,MAAM,KAAK,mBAAwB,WAAK,UAAU,OAAO,GAAG,EAAE;AAAA,MAC9D,MAAM;AAAA,MAEN,KAAK,YAAY;AAAA,MACjB,KAAK,MAAM,MAAM;AAAA;AAAA;AAAA,OAOP,mBAAkB,CAAC,UAAkB,QAA+B;AAAA,IAChF,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,MAElE,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,YAAiB,WAAK,UAAU,MAAM,IAAI;AAAA,QAChD,MAAM,eAAe,SAAS,GAAG,UAAU,MAAM,SAAS,MAAM;AAAA,QAEhE,IAAI,MAAM,YAAY,GAAG;AAAA,UACvB,MAAM,KAAK,mBAAmB,WAAW,YAAY;AAAA,QACvD,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UACvC,MAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AAAA,UACpD,MAAM,QAA2B,KAAK,MAAM,OAAO;AAAA,UACnD,KAAK,MAAM,IAAI,MAAM,UAAU,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAQV,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,YAAY;AAAA;AAErB;AAAA;AAAA,EA7LA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA;;;ACuJO,SAAS,cAAc,CAAC,SAAoC;AAAA,EACjE,MAAM,UAA6B,CAAC;AAAA,EACpC,MAAM,cAAc,IAAI;AAAA,EAGxB,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAEhC,aAAa,MAAM,SAAS,cAAc,iBAAiB;AAAA,IAEzD,QAAQ,YAAY;AAAA,IAEpB,IAAI;AAAA,IACJ,QAAQ,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AAAA,MAC/C,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,YAAY,GAAG,QAAQ;AAAA,MAG7B,IAAI,YAAY,IAAI,SAAS;AAAA,QAAG;AAAA,MAChC,YAAY,IAAI,SAAS;AAAA,MAGzB,MAAM,cAAc,QAAQ,UAAU,GAAG,MAAM,KAAK;AAAA,MACpD,MAAM,OAAO,YAAY,MAAM;AAAA,CAAI,EAAE;AAAA,MAErC,QAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA;AASxC,SAAS,iBAAiB,CAAC,SAAsC;AAAA,EACtE,MAAM,WAAW,IAAI;AAAA,EAErB,WAAW,UAAU,SAAS;AAAA,IAE5B,SAAS,IAAI,OAAO,KAAK,YAAY,CAAC;AAAA,IAGtC,MAAM,QAAQ,OAAO,KAClB,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,yBAAyB,OAAO,EACxC,YAAY,EACZ,MAAM,KAAK;AAAA,IAEd,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,KAAK,SAAS,GAAG;AAAA,QACnB,SAAS,IAAI,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AAAA,IAhNtB;AAAA;AAAA,oBAID;AAAA,IAEH;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;;;;;;;ACtJA;AACA;AAAA;AA2DO,MAAM,WAAkC;AAAA,EACpC,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EAEX,cAA6C,IAAI;AAAA,EACjD,YAA8B;AAAA,EAC9B,UAAkB;AAAA,OAEpB,WAAU,CAAC,SAAsC;AAAA,OAOjD,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAC3B,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,UAAU,eAAe,OAAO;AAAA,IACtC,MAAM,iBAAiB,kBAAkB,OAAO;AAAA,IAGhD,MAAM,gBAAgB,SAAS,OAAO;AAAA,IAGtC,MAAM,QAAQ,IAAI,mBAAmB,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,QAAQ,wBAAwB,KAAK,IAAI,CAAC;AAAA,IAEhE,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,CAAC,CAAC;AAAA,IAGtF,MAAM,SAAS,KAAK,aAAa,UAAU,SAAS,OAAO;AAAA,IAG3D,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAG7C,KAAK,YAAY,IAAI,UAAU;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,IAGD,MAAM,aAA6B;AAAA,MACjC;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAMM,YAAY,CAClB,UACA,SACA,SACS;AAAA,IACT,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAChC,MAAM,SAAkB,CAAC;AAAA,IAGzB,SACM,QAAQ,EACZ,QAAQ,MAAM,QACd,SAAS,kBAAkB,eAC3B;AAAA,MACA,MAAM,MAAM,KAAK,IAAI,QAAQ,iBAAiB,MAAM,MAAM;AAAA,MAC1D,MAAM,aAAa,MAAM,MAAM,OAAO,GAAG;AAAA,MACzC,MAAM,eAAe,WAAW,KAAK;AAAA,CAAI;AAAA,MAGzC,MAAM,eAAe,QAAQ,OAC3B,CAAC,MAAM,EAAE,QAAQ,QAAQ,KAAK,EAAE,QAAQ,GAC1C;AAAA,MAGA,IAAI,YAAuB;AAAA,MAC3B,IAAI;AAAA,MACJ,IAAI,aAAa;AAAA,MAEjB,IAAI,aAAa,SAAS,GAAG;AAAA,QAC3B,MAAM,gBAAgB,aAAa;AAAA,QACnC,YAAY,KAAK,sBAAsB,cAAc,IAAI;AAAA,QACzD,YAAY,cAAc;AAAA,QAC1B,aAAa,cAAc;AAAA,MAC7B;AAAA,MAEA,MAAM,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,MAE5C,OAAO,KAAK;AAAA,QACV,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,QAAQ;AAAA,QACnB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,MAGD,IAAI,OAAO,MAAM;AAAA,QAAQ;AAAA,IAC3B;AAAA,IAEA,OAAO;AAAA;AAAA,EAMD,qBAAqB,CAAC,YAA+B;AAAA,IAC3D,QAAQ;AAAA,WACD;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA;AAAA,QAEP,OAAO;AAAA;AAAA;AAAA,OAOP,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,UAAe,WACnB,cAAc,IAAI,SAAS,MAAM,GACjC,SACA,MACF;AAAA,IAGA,MAAS,UAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAG3C,KAAK,YAAY,IAAI;AAAA,IACrB,YAAY,UAAU,UAAU,KAAK,aAAa;AAAA,MAChD,KAAK,UAAU,YAAY,UAAU,MAAM,MAAM;AAAA,IACnD;AAAA,IAGA,MAAM,kBAAkB;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,OAAO,OAAO,YAAY,KAAK,WAAW;AAAA,MAC1C,UAAU,KAAK,UAAU,UAAU;AAAA,IACrC;AAAA,IAEA,MAAS,cACF,WAAK,SAAS,cAAc,GACjC,KAAK,UAAU,iBAAiB,MAAM,CAAC,CACzC;AAAA,IAEA,QAAQ,IACN,oCAAoC,KAAK,YAAY,YACvD;AAAA;AAAA,OAMI,OAAM,CACV,OACA,KACA,SACyB;AAAA,IACzB,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,OAAO,SAAS,QAAQ;AAAA,IAC9B,MAAM,WAAW,SAAS,YAAY;AAAA,IAGtC,IAAI,KAAK,YAAY,SAAS,GAAG;AAAA,MAC/B,MAAM,KAAK,gBAAgB,IAAI,SAAS,MAAM;AAAA,IAChD;AAAA,IAEA,IAAI,CAAC,KAAK,aAAa,KAAK,YAAY,SAAS,GAAG;AAAA,MAClD,OAAO,CAAC;AAAA,IACV;AAAA,IAGA,MAAM,cAAc,SAAS,KAAK;AAAA,IAGlC,MAAM,cAAc,KAAK,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACzD,MAAM,aAAa,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAAA,IAGlE,MAAM,gBAAgB,KAAK,kBAAkB,WAAW;AAAA,IAGxD,MAAM,UAA0B,CAAC;AAAA,IAEjC,WAAW,YAAY,KAAK,YAAY,KAAK,GAAG;AAAA,MAC9C,MAAM,QAAQ,KAAK,YAAY,IAAI,QAAQ;AAAA,MAC3C,MAAM,YAAY,WAAW,IAAI,QAAQ,KAAK;AAAA,MAC9C,MAAM,cAAc,cAAc,IAAI,QAAQ,KAAK;AAAA,MAGnD,IAAI,cAAc,KAAK,gBAAgB;AAAA,QAAG;AAAA,MAG1C,MAAM,gBAAgB,MAAM,eAAe,SAAS,IAAI,MAAM;AAAA,MAE9D,IAAI,iBAAiB,UAAU;AAAA,QAE7B,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,QAClD,IAAI,CAAC;AAAA,UAAW;AAAA,QAGhB,MAAM,YAAY,KAAK,cACrB,UAAU,QACV,aACA,MAAM,OACR;AAAA,QAEA,QAAQ,KAAK;AAAA,UACX;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP,WAAW,eAAe,SAAS;AAAA,YACnC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;AAAA;AAAA,EAMxD,iBAAiB,CAAC,aAA4C;AAAA,IACpE,MAAM,UAAU,IAAI;AAAA,IAEpB,YAAY,UAAU,UAAU,KAAK,aAAa;AAAA,MAChD,IAAI,aAAa;AAAA,MAEjB,WAAW,UAAU,MAAM,SAAS;AAAA,QAClC,MAAM,aAAa,OAAO,KAAK,YAAY;AAAA,QAC3C,MAAM,cAAc,kBAAkB,CAAC,MAAM,CAAC;AAAA,QAE9C,WAAW,SAAS,aAAa;AAAA,UAE/B,IAAI,eAAe,OAAO;AAAA,YACxB,cAAc,OAAO,aAAa,IAAM;AAAA,UAC1C,EAEK,SAAI,WAAW,SAAS,KAAK,KAAK,MAAM,SAAS,UAAU,GAAG;AAAA,YACjE,cAAc,OAAO,aAAa,MAAM;AAAA,UAC1C,EAEK,SAAI,YAAY,KAAK,CAAC,MAAM,MAAM,KAAK,GAAG;AAAA,YAC7C,cAAc,OAAO,aAAa,MAAM;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,aAAa,GAAG;AAAA,QAElB,QAAQ,IAAI,UAAU,KAAK,IAAI,GAAG,aAAa,YAAY,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAMD,aAAa,CACnB,QACA,aACA,SACO;AAAA,IACP,IAAI,YAAY,OAAO;AAAA,IACvB,IAAI,YAAY;AAAA,IAEhB,WAAW,SAAS,QAAQ;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,MAAM,eAAe,MAAM,QAAQ,YAAY;AAAA,MAG/C,WAAW,SAAS,aAAa;AAAA,QAC/B,IAAI,aAAa,SAAS,KAAK,GAAG;AAAA,UAChC,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,MAAM;AAAA,QACd,MAAM,YAAY,MAAM,KAAK,YAAY;AAAA,QACzC,WAAW,SAAS,aAAa;AAAA,UAC/B,IAAI,UAAU,SAAS,KAAK,GAAG;AAAA,YAC7B,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,YAAY;AAAA,QACpB,SAAS;AAAA,MACX;AAAA,MAEA,IAAI,QAAQ,WAAW;AAAA,QACrB,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAMK,gBAAe,CAAC,SAAiB,QAA4B;AAAA,IACzE,MAAM,UAAe,WAAK,cAAc,SAAS,MAAM,GAAG,SAAS,MAAM;AAAA,IACzE,MAAM,cAAmB,WAAK,SAAS,cAAc;AAAA,IAErD,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,aAAS,aAAa,OAAO;AAAA,MACtD,MAAM,OAAO,KAAK,MAAM,OAAO;AAAA,MAG/B,KAAK,cAAc,IAAI,IAAI,OAAO,QAAQ,KAAK,KAAK,CAAC;AAAA,MAGrD,IAAI,KAAK,UAAU;AAAA,QACjB,KAAK,YAAY,UAAU,YAAY,KAAK,QAAQ;AAAA,MACtD;AAAA,MACA,OAAO,OAAO;AAAA,MAEd,KAAK,cAAc,IAAI;AAAA,MACvB,KAAK,YAAY;AAAA;AAAA;AAAA,OAIf,QAAO,GAAkB;AAAA,IAC7B,KAAK,YAAY,MAAM;AAAA,IACvB,KAAK,YAAY;AAAA;AAErB;AAAA,IAhZM,oBAAoB,KAGpB,gBAAgB,IAGhB,kBAAkB,IAGlB,gBAAgB;AAAA;AAAA,EAlBtB;AAAA,EACA;AAAA,EACA;AAAA;;;ACrBO,SAAS,gBAAgB,CAAC,GAAa,GAAqB;AAAA,EACjE,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,IACzB,MAAM,IAAI,MAAM,2BAA2B,EAAE,aAAa,EAAE,QAAQ;AAAA,EACtE;AAAA,EAEA,IAAI,aAAa;AAAA,EACjB,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ;AAAA,EAEZ,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IACjC,cAAc,EAAE,KAAK,EAAE;AAAA,IACvB,SAAS,EAAE,KAAK,EAAE;AAAA,IAClB,SAAS,EAAE,KAAK,EAAE;AAAA,EACpB;AAAA,EAEA,MAAM,YAAY,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA,EAEpD,IAAI,cAAc;AAAA,IAAG,OAAO;AAAA,EAE5B,OAAO,aAAa;AAAA;;;AC3BtB;AAyCO,SAAS,SAAS,CAAC,SAAiB,UAAiC;AAAA,EAC1E,MAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAGnD,IAAI,CAAC,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG;AAAA,IAC9E,OAAO,gBAAgB,SAAS,QAAQ;AAAA,EAC1C;AAAA,EAGA,OAAO,iBAAiB,OAAO;AAAA;AASjC,SAAS,eAAe,CAAC,SAAiB,UAAiC;AAAA,EACzE,MAAM,SAAwB,CAAC;AAAA,EAC/B,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAGhC,MAAM,aAAgB,oBACpB,UACA,SACG,gBAAa,QAChB,MACA,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,MAAM,IAC9C,cAAW,MACX,cAAW,EACpB;AAAA,EAKA,SAAS,cAAc,CAAC,MAAuD;AAAA,IAC7E,MAAM,QAAQ,WAAW,8BAA8B,KAAK,SAAS,CAAC;AAAA,IACtE,MAAM,MAAM,WAAW,8BAA8B,KAAK,OAAO,CAAC;AAAA,IAClE,OAAO;AAAA,MACL,WAAW,MAAM,OAAO;AAAA,MACxB,SAAS,IAAI,OAAO;AAAA,IACtB;AAAA;AAAA,EAMF,SAAS,WAAW,CAAC,MAAuB;AAAA,IAC1C,OAAO,KAAK,QAAQ,UAAU;AAAA;AAAA,EAMhC,SAAS,UAAU,CAAC,MAAwB;AAAA,IAC1C,IAAI,CAAI,oBAAiB,IAAI;AAAA,MAAG,OAAO;AAAA,IACvC,MAAM,YAAe,gBAAa,IAAI;AAAA,IACtC,OAAO,WAAW,KAAK,OAAK,EAAE,SAAY,cAAW,aAAa,KAAK;AAAA;AAAA,EAMzE,SAAS,QAAQ,CAAC,MAAmC;AAAA,IACnD,MAAM,aAAgB,2BAAwB,IAAI;AAAA,IAClD,IAAI,WAAW,WAAW;AAAA,MAAG;AAAA,IAE7B,OAAO,WACJ,IAAI,SAAO,IAAI,QAAQ,UAAU,CAAC,EAClC,KAAK;AAAA,CAAI;AAAA;AAAA,EAMd,SAAS,eAAe,CAAC,MAAmC;AAAA,IAC1D,IAAO,yBAAsB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC/C,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAO,uBAAoB,IAAI,KAAQ,gBAAa,KAAK,IAAI,GAAG;AAAA,MAC9D,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAO,yBAAsB,IAAI,KAAQ,gBAAa,KAAK,IAAI,GAAG;AAAA,MAChE,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA;AAAA;AAAA,EAMF,SAAS,KAAK,CAAC,MAAqB;AAAA,IAClC,QAAQ,WAAW,YAAY,eAAe,IAAI;AAAA,IAGlD,IAAO,yBAAsB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC/C,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,uBAAoB,IAAI,GAAG;AAAA,MAChC,WAAW,QAAQ,KAAK,gBAAgB,cAAc;AAAA,QACpD,IAAI,KAAK,gBACD,mBAAgB,KAAK,WAAW,KAAQ,wBAAqB,KAAK,WAAW,IAAI;AAAA,UACvF,MAAM,OAAU,gBAAa,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAAA,UAC3D,OAAO,KAAK;AAAA,YACV,SAAS,YAAY,IAAI;AAAA,YACzB;AAAA,YACA;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA,YAAY,WAAW,IAAI;AAAA,YAC3B,OAAO,SAAS,IAAI;AAAA,UACtB,CAAC;AAAA,UACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAO,sBAAmB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC5C,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,0BAAuB,IAAI,GAAG;AAAA,MACnC,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,0BAAuB,IAAI,GAAG;AAAA,MACnC,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,qBAAkB,IAAI,GAAG;AAAA,MAC9B,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,uBAAoB,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,MACpD,WAAW,QAAQ,KAAK,gBAAgB,cAAc;AAAA,QAEpD,IAAI,KAAK,gBACD,mBAAgB,KAAK,WAAW,KAAQ,wBAAqB,KAAK,WAAW,IAAI;AAAA,UACvF;AAAA,QACF;AAAA,QACA,MAAM,OAAU,gBAAa,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAAA,QAC3D,OAAO,KAAK;AAAA,UACV,SAAS,YAAY,IAAI;AAAA,UACzB;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY;AAAA,UACZ,OAAO,SAAS,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,IAGG,gBAAa,MAAM,KAAK;AAAA;AAAA,EAI1B,gBAAa,YAAY,KAAK;AAAA,EAGjC,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,OAAO,iBAAiB,OAAO;AAAA,EACjC;AAAA,EAEA,OAAO;AAAA;AAST,SAAS,gBAAgB,CAAC,SAAgC;AAAA,EACxD,MAAM,SAAwB,CAAC;AAAA,EAC/B,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAChC,MAAM,aAAa;AAAA,EACnB,MAAM,UAAU;AAAA,EAGhB,IAAI,MAAM,UAAU,YAAY;AAAA,IAC9B,OAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,QACf,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAGA,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK,aAAa,SAAS;AAAA,IAC3D,MAAM,SAAS,KAAK,IAAI,IAAI,YAAY,MAAM,MAAM;AAAA,IACpD,OAAO,KAAK;AAAA,MACV,SAAS,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA,MACzC,WAAW,IAAI;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,IAED,IAAI,UAAU,MAAM;AAAA,MAAQ;AAAA,EAC9B;AAAA,EAEA,OAAO;AAAA;AAUF,SAAS,eAAe,CAAC,UAAkB,WAAmB,SAAyB;AAAA,EAC5F,MAAM,WAAW,SAAS,QAAQ,UAAU,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,EACnE,OAAO,GAAG,YAAY,aAAa;AAAA;AAAA;;;;EC7SrC;AAAA;;;ACiCO,SAAS,eAAe,CAC7B,SACA,MACA,cAAsB,IACZ;AAAA,EACV,MAAM,WAAW,IAAI;AAAA,EAGrB,IAAI,MAAM;AAAA,IACR,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA,IAG/B,MAAM,QAAQ,KAAK,MAAM,WAAW,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC;AAAA,IAC9D,MAAM,QAAQ,OAAK,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,EACpD;AAAA,EAGA,MAAM,kBAAkB;AAAA,EACxB,IAAI;AAAA,EAEJ,QAAQ,QAAQ,gBAAgB,KAAK,OAAO,OAAO,MAAM;AAAA,IACvD,MAAM,OAAO,MAAM,GAAG,YAAY;AAAA,IAGlC,IAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,MACjD,SAAS,IAAI,IAAI;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ,EAAE,MAAM,GAAG,WAAW;AAAA;AAMlD,SAAS,eAAe,CAAC,KAAuB;AAAA,EAC9C,OAAO,IAEJ,QAAQ,mBAAmB,OAAO,EAElC,QAAQ,SAAS,GAAG,EACpB,MAAM,KAAK,EACX,IAAI,OAAK,EAAE,YAAY,CAAC,EACxB,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA;AActB,SAAS,mBAAmB,CAAC,UAA4B;AAAA,EAC9D,MAAM,WAAW,IAAI;AAAA,EAGrB,MAAM,iBAAiB,SAAS,QAAQ,YAAY,EAAE;AAAA,EACtD,MAAM,WAAW,eAAe,MAAM,OAAO;AAAA,EAE7C,WAAW,WAAW,UAAU;AAAA,IAC9B,IAAI,QAAQ,SAAS;AAAA,MAAG;AAAA,IAGxB,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAClC,IAAI,CAAC,gBAAgB,IAAI,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,MACnD,SAAS,IAAI,KAAK;AAAA,IACpB;AAAA,IAGA,MAAM,QAAQ,gBAAgB,OAAO;AAAA,IACrC,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,QACjD,SAAS,IAAI,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AA8BrB,SAAS,gBAAgB,CAAC,UAA+B;AAAA,EAC9D,MAAM,iBAAiB,SAAS,QAAQ,YAAY,EAAE;AAAA,EACtD,MAAM,cAAc,eAAe,MAAM,OAAO;AAAA,EAChD,MAAM,WAAW,YAAY,YAAY,SAAS;AAAA,EAClD,MAAM,cAAc,YAAY,MAAM,GAAG,EAAE;AAAA,EAG3C,MAAM,WAAW,oBAAoB,QAAQ;AAAA,EAG7C,IAAI;AAAA,EACJ,MAAM,WAAW,CAAC,GAAG,aAAa,QAAQ,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG;AAAA,EAC9E,MAAM,gBAAgB,SAAS,YAAY;AAAA,EAE3C,YAAY,WAAW,aAAa,OAAO,QAAQ,eAAc,GAAG;AAAA,IAClE,WAAW,WAAW,UAAU;AAAA,MAE9B,IAAI,cAAc,SAAS,OAAO,GAAG;AAAA,QACnC,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MAEA,IAAI,YAAY,KAAK,OAAK,EAAE,YAAY,MAAM,OAAO,GAAG;AAAA,QACtD,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MAAO;AAAA,EACb;AAAA,EAKA,IAAI;AAAA,EACJ,MAAM,kBAAkB,IAAI,IAAI,OAAO,OAAO,eAAc,EAAE,KAAK,CAAC;AAAA,EAGpE,MAAM,mBAAmB,CAAC,GAAG,WAAW,EAAE,QAAQ;AAAA,EAClD,WAAW,WAAW,kBAAkB;AAAA,IACtC,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAElC,IAAI,CAAC,OAAO,OAAO,OAAO,YAAY,SAAS,EAAE,SAAS,KAAK;AAAA,MAAG;AAAA,IAElE,IAAI,gBAAgB,IAAI,KAAK;AAAA,MAAG;AAAA,IAEhC,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAUK,SAAS,6BAA6B,CAAC,aAAkC;AAAA,EAC9E,MAAM,QAAkB,CAAC;AAAA,EAEzB,IAAI,YAAY,QAAQ;AAAA,IACtB,MAAM,KAAK,YAAY,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,YAAY,OAAO;AAAA,IACrB,MAAM,KAAK,YAAY,KAAK;AAAA,EAC9B;AAAA,EAGA,MAAM,sBAAsB,YAAY,SACrC,MAAM,EAAE,EACR,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAAA,EAE/E,IAAI,oBAAoB,SAAS,GAAG;AAAA,IAClC,MAAM,KAAK,GAAG,oBAAoB,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA,EAC7D;AAAA,EAEA,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAG/B,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,EACjC,OAAO,IAAI,OAAO,KAAK,GAAG;AAAA;AAAA,IAnPf,iBAkBA;AAAA;AAAA,EAlBA,kBAAkB,IAAI,IAAI;AAAA,IAErC;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAAY;AAAA,IAAS;AAAA,IAAa;AAAA,IAAQ;AAAA,IACjE;AAAA,IAAU;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAa;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAO;AAAA,IAC3D;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAO;AAAA,IAAS;AAAA,IACvD;AAAA,IAAS;AAAA,IAAU;AAAA,IAAc;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IACzD;AAAA,IAAU;AAAA,IAAU;AAAA,IAAW;AAAA,IAAO;AAAA,IAAW;AAAA,IAAS;AAAA,IAC1D;AAAA,IAAU;AAAA,IAAW;AAAA,IAAa;AAAA,IAAU;AAAA,IAAY;AAAA,IACxD;AAAA,IAAc;AAAA,IAAW;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAEhD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,EAC3D,CAAC;AAAA,EAMY,kBAA2C;AAAA,IACtD,YAAc,CAAC,cAAc,eAAe,WAAW,YAAY,SAAS,UAAU,KAAK;AAAA,IAC3F,SAAW,CAAC,WAAW,YAAY,WAAW,YAAY,aAAa;AAAA,IACvE,YAAc,CAAC,cAAc,gBAAgB,QAAQ,SAAS,OAAO,SAAS,SAAS;AAAA,IACvF,OAAS,CAAC,SAAS,UAAU,UAAU,YAAY,UAAU,SAAS;AAAA,IACtE,MAAQ,CAAC,QAAQ,SAAS,WAAW,aAAa,UAAU,WAAW,UAAU,QAAQ;AAAA,IACzF,QAAU,CAAC,UAAU,WAAW,iBAAiB,UAAU;AAAA,IAC3D,YAAc,CAAC,cAAc,eAAe,eAAe,cAAc;AAAA,IACzE,QAAU,CAAC,UAAU,QAAQ,UAAU;AAAA,IACvC,gBAAkB,CAAC,kBAAkB,SAAS,YAAY,UAAU;AAAA,IACpE,cAAgB,CAAC,gBAAgB,QAAQ,SAAS,aAAa,cAAc,IAAI;AAAA,IACjF,MAAQ,CAAC,QAAQ,SAAS,QAAQ,SAAS,aAAa,UAAU;AAAA,EACpE;AAAA;;;AC7BA;AACA;AAAA;AAUO,MAAM,cAAc;AAAA,EACjB,OAAiC;AAAA,EACjC,gBAA0C,IAAI;AAAA,EAC9C,YAA8B;AAAA,EAC9B;AAAA,EACA;AAAA,EAER,WAAW,CAAC,UAAkB,UAAkB;AAAA,IAC9C,KAAK,eAAoB,WAAK,UAAU,SAAS,UAAU,UAAU;AAAA,IACrE,KAAK,WAAW;AAAA;AAAA,OAMZ,WAAU,GAAkB;AAAA,IAChC,IAAI;AAAA,MACF,MAAM,KAAK,KAAK;AAAA,MAChB,MAAM;AAAA,MAEN,KAAK,OAAO;AAAA,QACV,SAAS;AAAA,QACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,QACpC,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,UAAU;AAAA,UACR,cAAc;AAAA,UACd,qBAAqB,CAAC;AAAA,UACtB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,KAAK,YAAY,IAAI;AAAA;AAAA;AAAA,EAOzB,OAAO,CAAC,SAA4B;AAAA,IAClC,KAAK,cAAc,IAAI,QAAQ,UAAU,OAAO;AAAA;AAAA,EAMlD,UAAU,CAAC,UAA2B;AAAA,IACpC,OAAO,KAAK,cAAc,OAAO,QAAQ;AAAA;AAAA,EAM3C,cAAc,GAAS;AAAA,IACrB,KAAK,YAAY,IAAI;AAAA,IAGrB,YAAY,UAAU,YAAY,KAAK,eAAe;AAAA,MACpD,MAAM,UAAU;AAAA,QACd,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,GAAG,oBAAoB,QAAQ;AAAA,MACjC,EAAE,KAAK,GAAG;AAAA,MAEV,KAAK,UAAU,aAAa,CAAC,EAAE,IAAI,UAAU,QAAQ,CAAC,CAAC;AAAA,IACzD;AAAA,IAGA,IAAI,KAAK,MAAM;AAAA,MACb,KAAK,KAAK,YAAY,KAAK,cAAc;AAAA,MACzC,KAAK,KAAK,SAAS,YAAY,KAAK,cAAc;AAAA,IACpD;AAAA;AAAA,EAMF,cAAc,CAAC,OAAe,gBAAwB,IAAc;AAAA,IAClE,IAAI,CAAC,KAAK,WAAW;AAAA,MACnB,OAAO,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA,IAC7C;AAAA,IAEA,MAAM,UAAU,KAAK,UAAU,OAAO,OAAO,aAAa;AAAA,IAC1D,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA;AAAA,EAMhC,WAAW,GAAa;AAAA,IACtB,OAAO,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA;AAAA,EAM7C,cAAc,CAAC,UAA2C;AAAA,IACxD,OAAO,KAAK,cAAc,IAAI,QAAQ;AAAA;AAAA,OAMlC,KAAI,GAAkB;AAAA,IAC1B,IAAI,CAAC,KAAK;AAAA,MAAM,MAAM,IAAI,MAAM,uBAAuB;AAAA,IAGvD,KAAK,KAAK,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,IAC/C,KAAK,KAAK,YAAY,KAAK,cAAc;AAAA,IAGzC,MAAS,UAAM,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IAGrD,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,IAC1D,MAAS,cAAU,UAAU,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,IAG/D,YAAY,UAAU,YAAY,KAAK,eAAe;AAAA,MACpD,MAAM,cAAc,KAAK,mBAAmB,QAAQ;AAAA,MACpD,MAAS,UAAW,cAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7D,MAAS,cAAU,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IAClE;AAAA;AAAA,OAMI,KAAI,GAAkB;AAAA,IAE1B,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,IAC1D,MAAM,cAAc,MAAS,aAAS,UAAU,OAAO;AAAA,IACvD,KAAK,OAAO,KAAK,MAAM,WAAW;AAAA,IAGlC,KAAK,cAAc,MAAM;AAAA,IACzB,MAAM,KAAK,2BAA2B,KAAK,YAAY;AAAA,IAGvD,KAAK,eAAe;AAAA;AAAA,OAMR,2BAA0B,CAAC,KAA4B;AAAA,IACnE,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,MAE7D,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,WAAgB,WAAK,KAAK,MAAM,IAAI;AAAA,QAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,UACvB,MAAM,KAAK,2BAA2B,QAAQ;AAAA,QAChD,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,KAAK,MAAM,SAAS,cAAc;AAAA,UACtE,IAAI;AAAA,YACF,MAAM,UAAU,MAAS,aAAS,UAAU,OAAO;AAAA,YACnD,MAAM,UAAU,KAAK,MAAM,OAAO;AAAA,YAClC,IAAI,QAAQ,UAAU;AAAA,cACpB,KAAK,cAAc,IAAI,QAAQ,UAAU,OAAO;AAAA,YAClD;AAAA,YACA,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAQF,kBAAkB,CAAC,UAA0B;AAAA,IACnD,MAAM,WAAW,SAAS,QAAQ,YAAY,OAAO;AAAA,IACrD,OAAY,WAAK,KAAK,cAAc,QAAQ;AAAA;AAAA,OAMxC,kBAAiB,CAAC,UAAiC;AAAA,IACvD,IAAI;AAAA,MACF,MAAS,WAAO,KAAK,mBAAmB,QAAQ,CAAC;AAAA,MACjD,MAAM;AAAA,IAGR,KAAK,cAAc,OAAO,QAAQ;AAAA;AAAA,OAM9B,OAAM,GAAqB;AAAA,IAC/B,IAAI;AAAA,MACF,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,MAC1D,MAAS,WAAO,QAAQ;AAAA,MACxB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,MAOP,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,EAM5B,KAAK,GAAS;AAAA,IACZ,KAAK,cAAc,MAAM;AAAA,IACzB,IAAI,KAAK,MAAM;AAAA,MACb,KAAK,KAAK,YAAY;AAAA,MACtB,KAAK,KAAK,WAAW;AAAA,QACnB,cAAc;AAAA,QACd,qBAAqB,CAAC;AAAA,QACtB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,KAAK,YAAY,IAAI;AAAA;AAEzB;AAAA;AAAA,EAzOA;AAAA;;;;ECTA;AAAA,EACA;AAAA;;;;;;;;;ACIA;AAAA;AAqDO,MAAM,iBAAwC;AAAA,EAC1C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EAEX,kBAA0C;AAAA,EAC1C,gBAAsC;AAAA,EACtC,mBAA6C,IAAI;AAAA,EACjD,UAAkB;AAAA,OAEpB,WAAU,CAAC,QAAqC;AAAA,IAEpD,KAAK,kBAAkB,6BAA6B,MAAM;AAAA,IAG1D,oBAAoB,KAAK,eAAe;AAAA,IAGxC,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAE3B,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,eAAe,UAAU,SAAS,QAAQ;AAAA,IAEhD,IAAI,aAAa,WAAW,GAAG;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,cAAc,iBAAiB,QAAQ;AAAA,IAC7C,MAAM,aAAa,8BAA8B,WAAW;AAAA,IAI5D,MAAM,gBAAgB,aAAa,IAAI,CAAC,MAAM;AAAA,MAE5C,MAAM,aAAa,EAAE,OAAO,GAAG,EAAE,WAAW;AAAA,MAC5C,OAAO,GAAG,cAAc,aAAa,EAAE;AAAA,KACxC;AAAA,IACD,MAAM,aAAa,MAAM,cAAc,aAAa;AAAA,IAGpD,MAAM,SAAkB,aAAa,IAAI,CAAC,QAAQ;AAAA,MAChD,IAAI,gBAAgB,UAAU,GAAG,WAAW,GAAG,OAAO;AAAA,MACtD,SAAS,GAAG;AAAA,MACZ,WAAW,GAAG;AAAA,MACd,SAAS,GAAG;AAAA,MACZ,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,MACT,YAAY,GAAG;AAAA,MACf,OAAO,GAAG;AAAA,IACZ,EAAE;AAAA,IAGF,MAAM,aAAa,KAAK,kBAAkB,SAAS,QAAQ;AAAA,IAE3D,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,mBAAmB;AAAA,IAEzC,MAAM,aAAiC;AAAA,MACrC;AAAA,MACA,gBAAgB,cAAc;AAAA,IAChC;AAAA,IAGA,MAAM,aAAa,CAAC,GAAG,IAAI,IAAI,aAAa,IAAI,QAAM,GAAG,IAAI,CAAC,CAAC;AAAA,IAC/D,MAAM,UAAU,aACb,OAAO,QAAM,GAAG,cAAc,GAAG,IAAI,EACrC,IAAI,QAAM,GAAG,IAAK;AAAA,IAGrB,MAAM,cAAc,IAAI;AAAA,IACxB,WAAW,MAAM,cAAc;AAAA,MAC7B,MAAM,WAAW,gBAAgB,GAAG,SAAS,GAAG,IAAI;AAAA,MACpD,SAAS,QAAQ,OAAK,YAAY,IAAI,CAAC,CAAC;AAAA,IAC1C;AAAA,IAEA,YAAY,SAAS,QAAQ,OAAK,YAAY,IAAI,CAAC,CAAC;AAAA,IAEpD,MAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,YAAY,OAAO;AAAA,MACnB;AAAA,MACA,UAAU,MAAM,KAAK,WAAW;AAAA,MAChC;AAAA,MACA,cAAc,MAAM;AAAA,MAEpB,aAAa;AAAA,QACX,UAAU,YAAY;AAAA,QACtB,OAAO,YAAY;AAAA,QACnB,QAAQ,YAAY;AAAA,QACpB,OAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAAA,IAGA,KAAK,iBAAiB,IAAI,UAAU,WAAW;AAAA,IAE/C,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAMI,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IAGtD,KAAK,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IACxD,MAAM,KAAK,cAAc,WAAW;AAAA,IAGpC,YAAY,UAAU,YAAY,KAAK,kBAAkB;AAAA,MACvD,KAAK,cAAc,QAAQ,OAAO;AAAA,IACpC;AAAA,IAGA,KAAK,cAAc,eAAe;AAAA,IAGlC,MAAM,KAAK,cAAc,KAAK;AAAA,IAE9B,QAAQ,IAAI,+BAA+B,KAAK,iBAAiB,qBAAqB;AAAA,IAGtF,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAexB,OAAM,CACV,OACA,KACA,UAAyB,CAAC,GACD;AAAA,IACzB,QAAQ,OAAO,gBAAe,WAAW,oBAAmB,iBAAiB;AAAA,IAG7E,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IACtD,MAAM,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IAEzD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,cAAc,WAAW;AAAA,MAG/B,MAAM,gBAAgB,OAAO;AAAA,MAC7B,iBAAiB,cAAc,eAAe,OAAO,aAAa;AAAA,MAGlE,IAAI,eAAe,WAAW,GAAG;AAAA,QAC/B,iBAAiB,cAAc,YAAY;AAAA,MAC7C;AAAA,MACA,MAAM;AAAA,MAEN,iBAAiB,MAAM,IAAI,iBAAiB;AAAA;AAAA,IAI9C,IAAI,gBAAgB,aAAa,SAAS,GAAG;AAAA,MAC3C,iBAAiB,eAAe,OAAO,cAAY;AAAA,QACjD,OAAO,aAAa,KAAK,aAAW;AAAA,UAClC,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,YAC5B,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,YAC3B,OAAO,SAAS,SAAS,GAAG;AAAA,UAC9B;AAAA,UACA,OAAO,SAAS,SAAS,OAAO;AAAA,SACjC;AAAA,OACF;AAAA,IACH;AAAA,IAGA,MAAM,iBAAiB,MAAM,aAAa,KAAK;AAAA,IAG/C,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,gBAID,CAAC;AAAA,IAEN,WAAW,YAAY,gBAAgB;AAAA,MACrC,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,MAClD,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,aAAa,UAAU;AAAA,MAC7B,IAAI,CAAC,YAAY;AAAA,QAAY;AAAA,MAE7B,SAAS,IAAI,EAAG,IAAI,UAAU,OAAO,QAAQ,KAAK;AAAA,QAChD,MAAM,QAAQ,UAAU,OAAO;AAAA,QAC/B,MAAM,YAAY,WAAW,WAAW;AAAA,QAExC,IAAI,CAAC;AAAA,UAAW;AAAA,QAEhB,cAAc,KAAK;AAAA,UACjB,UAAU,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAGD,UAAU,aAAa,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACpD,MAAM,aAAa,IAAI;AAAA,IAEvB,WAAW,UAAU,aAAa;AAAA,MAChC,WAAW,IAAI,OAAO,IAAI,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,IAC3D;AAAA,IAGA,MAAM,aAAa,MAAM,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,IAG5E,MAAM,aAAa,IAAI;AAAA,IACvB,WAAW,YAAY,gBAAgB;AAAA,MACrC,MAAM,UAAU,cAAc,eAAe,QAAQ;AAAA,MACrD,IAAI,SAAS,aAAa;AAAA,QACxB,IAAI,QAAQ;AAAA,QACZ,MAAM,OAAM,QAAQ;AAAA,QAGpB,IAAI,KAAI,UAAU,WAAW,KAAK,OAAK,KAAI,OAAQ,SAAS,CAAC,KAAK,EAAE,SAAS,KAAI,MAAO,CAAC,GAAG;AAAA,UAC1F,SAAS;AAAA,QACX;AAAA,QAGA,IAAI,KAAI,SAAS,WAAW,KAAK,OAAK,KAAI,MAAO,SAAS,CAAC,KAAK,EAAE,SAAS,KAAI,KAAM,CAAC,GAAG;AAAA,UACvF,SAAS;AAAA,QACX;AAAA,QAGA,MAAM,eAAe,KAAI,SAAS,KAAK,SACrC,WAAW,KAAK,OAAK,IAAI,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,YAAY,CAAC,CAAC,CACrF;AAAA,QACA,IAAI,cAAc;AAAA,UAChB,SAAS;AAAA,QACX;AAAA,QAEA,WAAW,IAAI,UAAU,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,IAGA,MAAM,UAA0B,CAAC;AAAA,IAEjC,aAAa,UAAU,OAAO,eAAe,eAAe;AAAA,MAC1D,MAAM,gBAAgB,iBAAiB,gBAAgB,SAAS;AAAA,MAChE,MAAM,YAAY,WAAW,IAAI,MAAM,EAAE,KAAK;AAAA,MAC9C,MAAM,YAAY,WAAW,IAAI,QAAQ,KAAK;AAAA,MAG9C,MAAM,cAAe,kBAAkB,gBAAkB,cAAc,YAAa;AAAA,MAEpF,IAAI,eAAe,YAAY,YAAY,KAAK;AAAA,QAC9C,QAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAGA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAAA,EAGtB,iBAAiB,CAAC,SAAiB,UAA4B;AAAA,IACrE,MAAM,aAAuB,CAAC;AAAA,IAG9B,MAAM,cAAc;AAAA,IACpB,MAAM,eAAe;AAAA,IAErB,IAAI;AAAA,IACJ,QAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AAAA,MACnD,MAAM,aAAa,MAAM;AAAA,MACzB,IAAI,WAAW,WAAW,GAAG,GAAG;AAAA,QAC9B,MAAM,MAAW,eAAQ,QAAQ;AAAA,QACjC,MAAM,WAAgB,iBAAe,YAAK,KAAK,UAAU,CAAC;AAAA,QAC1D,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,QAAQ,QAAQ,aAAa,KAAK,OAAO,OAAO,MAAM;AAAA,MACpD,MAAM,aAAa,MAAM;AAAA,MACzB,IAAI,WAAW,WAAW,GAAG,GAAG;AAAA,QAC9B,MAAM,MAAW,eAAQ,QAAQ;AAAA,QACjC,MAAM,WAAgB,iBAAe,YAAK,KAAK,UAAU,CAAC;AAAA,QAC1D,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAEX;AAAA,IApWa,qBAAoB,MAGpB,iBAAgB,IAGvB,kBAAkB,KAGlB,cAAc,KAad,6BAA6B;AAAA;AAAA,EAvCnC;AAAA,EAQA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA;;;AClCA,MAAM,mBAA6C;AAAA,EACzC,UAAU,IAAI;AAAA,EAEtB,QAAQ,CAAC,QAA2B;AAAA,IAClC,IAAI,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;AAAA,MAC/B,QAAQ,KAAK,WAAW,OAAO,2CAA2C;AAAA,IAC5E;AAAA,IACA,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAAA;AAAA,EAGpC,GAAG,CAAC,IAAqC;AAAA,IACvC,OAAO,KAAK,QAAQ,IAAI,EAAE;AAAA;AAAA,EAG5B,IAAI,GAAkB;AAAA,IACpB,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA;AAAA,EAGzC,UAAU,CAAC,QAA+B;AAAA,IACxC,MAAM,aAAa,IAAI,IACrB,OAAO,QACJ,OAAO,OAAK,EAAE,OAAO,EACrB,IAAI,OAAK,EAAE,EAAE,CAClB;AAAA,IAEA,OAAO,KAAK,KAAK,EAAE,OAAO,OAAK,WAAW,IAAI,EAAE,EAAE,CAAC;AAAA;AAEvD;AAMA,eAAsB,sBAAsB,GAAkB;AAAA,EAE5D,QAAQ,4BAAe;AAAA,EACvB,QAAQ,wCAAqB;AAAA,EAG7B,SAAS,SAAS,IAAI,WAAY;AAAA,EAGlC,SAAS,SAAS,IAAI,iBAAkB;AAAA;AAAA,IAZ7B;AAAA;AAAA,aAA2B,IAAI;AAAA;;;ACtB5C;AACA;AAkCA,eAAsB,cAAc,CAClC,SACA,UAAwB,CAAC,GACH;AAAA,EACtB;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,EAGJ,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,gBAAgB,iBAAiB,OAAO;AAAA,EAG9C,MAAM,kBAAkB,IAAI,IAAI,OAAO,UAAU;AAAA,EAGjD,MAAM,iBAAiB;AAAA,IACrB,GAAG,OAAO,YAAY,IAAI,OAAK,MAAM,MAAM;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AAAA,EAKA,SAAS,eAAe,CAAC,UAA2B;AAAA,IAClD,MAAM,MAAW,eAAQ,QAAQ;AAAA,IACjC,OAAO,gBAAgB,IAAI,GAAG;AAAA;AAAA,EAIhC,IAAI,YAAY;AAAA,EAChB,IAAI,aAAa;AAAA,EACjB,IAAI,iBAAiB,IAAI;AAAA,EACzB,IAAI,gBAAsD;AAAA,EAC1D,IAAI,UAA4B;AAAA,EAKhC,eAAe,qBAAqB,GAAkB;AAAA,IACpD,IAAI,CAAC,aAAa,cAAc,eAAe,SAAS,GAAG;AAAA,MACzD;AAAA,IACF;AAAA,IAEA,aAAa;AAAA,IACb,MAAM,UAAU,IAAI,IAAI,cAAc;AAAA,IACtC,eAAe,MAAM;AAAA,IAErB,IAAI;AAAA,MAEF,MAAM,eAAyB,CAAC;AAAA,MAChC,MAAM,gBAA0B,CAAC;AAAA,MAEjC,YAAY,UAAU,UAAU,SAAS;AAAA,QACvC,IAAI,UAAU,UAAU;AAAA,UACtB,cAAc,KAAK,QAAQ;AAAA,QAC7B,EAAO;AAAA,UACL,aAAa,KAAK,QAAQ;AAAA;AAAA,MAE9B;AAAA,MAGA,IAAI,cAAc,SAAS,GAAG;AAAA,QAC5B,IAAI,SAAS;AAAA,UACX,QAAQ,IAAI;AAAA,sBAAyB,cAAc,2BAA2B;AAAA,QAChF;AAAA,QACA,MAAM,aAAa,SAAS,EAAE,SAAS,MAAM,CAAC;AAAA,MAChD;AAAA,MAGA,IAAI,aAAa,SAAS,GAAG;AAAA,QAC3B,IAAI,cAAc;AAAA,UAChB,aAAa,YAAY;AAAA,QAC3B;AAAA,QAEA,IAAI,SAAS;AAAA,UACX,QAAQ,IAAI;AAAA,mBAAsB,aAAa,2BAA2B;AAAA,QAC5E;AAAA,QAEA,MAAM,UAAU,MAAM,eAAe,SAAS;AAAA,UAC5C;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,QAED,IAAI,iBAAiB;AAAA,UACnB,gBAAgB,OAAO;AAAA,QACzB;AAAA,QAGA,WAAW,UAAU,SAAS;AAAA,UAC5B,IAAI,OAAO,UAAU,KAAK,OAAO,SAAS,GAAG;AAAA,YAC3C,QAAQ,IAAI,WAAW,OAAO,aAAa,OAAO,oBAAoB,OAAO,eAAe;AAAA,UAC9F;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACpE,QAAQ,MAAM,kCAAkC,IAAI,OAAO;AAAA,MAC3D,IAAI,SAAS;AAAA,QACX,QAAQ,GAAG;AAAA,MACb;AAAA,cACA;AAAA,MACA,aAAa;AAAA,MAGb,IAAI,eAAe,OAAO,GAAG;AAAA,QAC3B,mBAAmB;AAAA,MACrB;AAAA;AAAA;AAAA,EAOJ,SAAS,kBAAkB,GAAS;AAAA,IAClC,IAAI,eAAe;AAAA,MACjB,aAAa,aAAa;AAAA,IAC5B;AAAA,IAGA,IAAI,eAAe,QAAQ,gBAAgB;AAAA,MACzC,sBAAsB;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,gBAAgB,WAAW,MAAM;AAAA,MAC/B,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,OACrB,UAAU;AAAA;AAAA,EAMf,SAAS,eAAe,CAAC,OAAoC,UAAwB;AAAA,IACnF,IAAI,CAAC;AAAA,MAAW;AAAA,IAGhB,MAAM,eAAoB,gBAAS,SAAS,QAAQ;AAAA,IAIpD,IAAI,CAAC,gBAAgB,QAAQ,GAAG;AAAA,MAC9B;AAAA,IACF;AAAA,IAGA,WAAW,cAAc,OAAO,aAAa;AAAA,MAC3C,IAAI,aAAa,WAAW,UAAU,KAAK,aAAa,SAAS,IAAI,aAAa,GAAG;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,aAAa,OAAO,YAAY;AAAA,IAClC;AAAA,IAEA,IAAI,SAAS;AAAA,MACX,MAAM,SAAS,UAAU,QAAQ,MAAM,UAAU,WAAW,MAAM;AAAA,MAClE,QAAQ,IAAI,WAAW,UAAU,cAAc;AAAA,IACjD;AAAA,IAGA,eAAe,IAAI,cAAc,KAAK;AAAA,IACtC,mBAAmB;AAAA;AAAA,EAKrB,UAAU,MAAM,SAAS;AAAA,IACvB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,kBAAkB;AAAA,MAChB,oBAAoB;AAAA,MACpB,cAAc;AAAA,IAChB;AAAA,IAEA,YAAY;AAAA,IACZ,QAAQ;AAAA,IAER,OAAO;AAAA,EACT,CAAC;AAAA,EAID,QAAQ,GAAG,OAAO,CAAC,aAAa,gBAAgB,OAAO,QAAQ,CAAC;AAAA,EAChE,QAAQ,GAAG,UAAU,CAAC,aAAa,gBAAgB,UAAU,QAAQ,CAAC;AAAA,EACtE,QAAQ,GAAG,UAAU,CAAC,aAAa,gBAAgB,UAAU,QAAQ,CAAC;AAAA,EAEtE,QAAQ,GAAG,SAAS,CAAC,UAAmB;AAAA,IACtC,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACpE,QAAQ,MAAM,0BAA0B,GAAG;AAAA,IAC3C,IAAI,SAAS;AAAA,MACX,QAAQ,GAAG;AAAA,IACb;AAAA,GACD;AAAA,EAGD,MAAM,IAAI,QAAc,CAAC,aAAY;AAAA,IACnC,QAAS,GAAG,SAAS,MAAM;AAAA,MACzB,SAAQ;AAAA,KACT;AAAA,GACF;AAAA,EAGD,OAAO;AAAA,IACL,MAAM,YAAY;AAAA,MAChB,YAAY;AAAA,MAEZ,IAAI,eAAe;AAAA,QACjB,aAAa,aAAa;AAAA,QAC1B,gBAAgB;AAAA,MAClB;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,MAAM,QAAQ,MAAM;AAAA,QACpB,UAAU;AAAA,MACZ;AAAA;AAAA,IAEF,WAAW,MAAM;AAAA,EACnB;AAAA;AAAA,IArQI,sBAAsB,KAGtB,iBAAiB;AAAA;AAAA,EARvB;AAAA,EAEA;AAAA;;;;;;;;;;ACdA;AACA;AACA;AAkEA,eAAsB,cAAc,CAAC,SAAiB,UAAwB,CAAC,GAA2B;AAAA,EACxG,MAAM,UAAU,QAAQ,WAAW;AAAA,EAGnC,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,WAAW,iBAAiB,OAAO;AAAA,EACzC,QAAQ,IAAI,uBAAuB,SAAS;AAAA,EAC5C,QAAQ,IAAI,mBAAmB,SAAS,UAAU;AAAA,EAGlD,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,gBAAgB,IAAI,mBAAmB,OAAO;AAAA,EACpD,MAAM,cAAc,WAAW;AAAA,EAC/B,IAAI,SAAS;AAAA,IACX,MAAM,YAAY,cAAc,aAAa;AAAA,IAC7C,IAAI,WAAW,YAAY;AAAA,MACzB,QAAQ,IAAI,0BAA0B,UAAU,SAAS,iBAAiB;AAAA,IAC5E;AAAA,EACF;AAAA,EAGA,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,SAAS,WAAW,MAAM;AAAA,EAEjD,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,QAAQ,IAAI,+CAA+C;AAAA,IAC3D,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,QAAQ,IAAI,oBAAoB,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG;AAAA,EAG5E,MAAM,QAAQ,MAAM,UAAU,SAAS,MAAM;AAAA,EAC7C,QAAQ,IAAI,SAAS,MAAM,uBAAuB;AAAA,EAGlD,MAAM,UAAyB,CAAC;AAAA,EAEhC,WAAW,UAAU,gBAAgB;AAAA,IACnC,QAAQ,IAAI;AAAA,GAAM,OAAO,4BAA4B;AAAA,IAGrD,MAAM,eAAe,gBAAgB,QAAQ,OAAO,EAAE;AAAA,IACtD,IAAI,OAAO,cAAc,cAAc;AAAA,MAErC,MAAM,sBAAsB,KAAK,aAAa;AAAA,MAC9C,IAAI,QAAQ,SAAS,OAAO,OAAO,uBAAuB;AAAA,QACxD,oBAAoB,UAAU;AAAA,aACzB,oBAAoB;AAAA,UACvB,gBAAgB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,MAAM,OAAO,WAAW,mBAAmB;AAAA,IAC7C;AAAA,IAEA,MAAM,SAAS,MAAM,gBAAgB,SAAS,OAAO,QAAQ,QAAQ,SAAS,aAAa;AAAA,IAC3F,QAAQ,KAAK,MAAM;AAAA,IAGnB,IAAI,OAAO,UAAU;AAAA,MACnB,QAAQ,IAAI,IAAI,OAAO,qCAAqC;AAAA,MAC5D,MAAM,MAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,UAAU,OAAO,aAAqB;AAAA,UACpC,MAAM,WAAgB,kBAAW,QAAQ,IAAI,WAAgB,YAAK,SAAS,QAAQ;AAAA,UACnF,OAAU,aAAS,UAAU,OAAO;AAAA;AAAA,QAEtC,cAAc,OAAO,aAAqB;AAAA,UACxC,MAAM,WAAgB,kBAAW,QAAQ,IAAI,WAAgB,YAAK,SAAS,QAAQ;AAAA,UACnF,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,UACpC,OAAO,EAAE,cAAc,MAAM,MAAM,YAAY,EAAE;AAAA;AAAA,MAErD;AAAA,MACA,MAAM,OAAO,SAAS,GAAG;AAAA,IAC3B;AAAA,IAEA,QAAQ,IAAI,IAAI,OAAO,mBAAmB,OAAO,oBAAoB,OAAO,oBAAoB,OAAO,eAAe;AAAA,EACxH;AAAA,EAGA,MAAM,cAAc,KAAK,MAAM;AAAA,EAG/B,MAAM,qBAAqB,SAAS,gBAAgB,MAAM;AAAA,EAE1D,OAAO;AAAA;AAMT,eAAe,eAAe,CAC5B,SACA,OACA,QACA,QACA,SACA,eACsB;AAAA,EACtB,MAAM,SAAsB;AAAA,IAC1B,UAAU,OAAO;AAAA,IACjB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EAGA,MAAM,WAAW,MAAM,mBAAmB,SAAS,OAAO,IAAI,MAAM;AAAA,EAGpE,MAAM,MAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,UAAU,OAAO,aAAqB;AAAA,MACpC,MAAM,WAAgB,kBAAW,QAAQ,IAAI,WAAgB,YAAK,SAAS,QAAQ;AAAA,MACnF,OAAU,aAAS,UAAU,OAAO;AAAA;AAAA,IAEtC,cAAc,OAAO,aAAqB;AAAA,MACxC,MAAM,WAAgB,kBAAW,QAAQ,IAAI,WAAgB,YAAK,SAAS,QAAQ;AAAA,MACnF,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,MACpC,OAAO,EAAE,cAAc,MAAM,MAAM,YAAY,EAAE;AAAA;AAAA,IAEnD,kBAAkB,CAAC,aAAqB,cAAc,QAAQ,QAAQ;AAAA,EACxE;AAAA,EAGA,WAAW,YAAY,OAAO;AAAA,IAC5B,MAAM,eAAoB,gBAAS,SAAS,QAAQ;AAAA,IAEpD,IAAI;AAAA,MACF,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,MACpC,MAAM,eAAe,MAAM,MAAM,YAAY;AAAA,MAG7C,MAAM,gBAAgB,SAAS,MAAM;AAAA,MACrC,IAAI,iBAAiB,cAAc,iBAAiB,cAAc;AAAA,QAChE,IAAI,SAAS;AAAA,UACX,QAAQ,IAAI,aAAa,0BAA0B;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MAGA,MAAM,UAAU,MAAS,aAAS,UAAU,OAAO;AAAA,MAGnD,cAAc,QAAQ,cAAc,OAAO;AAAA,MAE3C,IAAI,SAAS;AAAA,QACX,QAAQ,IAAI,gBAAgB,iBAAiB;AAAA,MAC/C;AAAA,MACA,MAAM,YAAY,MAAM,OAAO,UAAU,cAAc,SAAS,GAAG;AAAA,MAEnE,IAAI,CAAC,WAAW;AAAA,QACd,IAAI,SAAS;AAAA,UACX,QAAQ,IAAI,aAAa,0BAA0B;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MAGA,MAAM,eAAe,SAAS,OAAO,IAAI,cAAc,WAAW,MAAM;AAAA,MAGxE,SAAS,MAAM,gBAAgB;AAAA,QAC7B;AAAA,QACA,YAAY,UAAU,OAAO;AAAA,MAC/B;AAAA,MAEA,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,oBAAoB,iBAAiB,KAAK;AAAA,MACxD,OAAO;AAAA;AAAA,EAEX;AAAA,EAGA,SAAS,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,EAC9C,MAAM,oBAAoB,SAAS,OAAO,IAAI,UAAU,MAAM;AAAA,EAE9D,OAAO;AAAA;AAGT,eAAe,SAAS,CAAC,SAAiB,QAAmC;AAAA,EAC3E,MAAM,WAAW,OAAO,WAAW,IAAI,CAAC,QAAQ,OAAO,KAAK;AAAA,EAC5D,MAAM,iBAAiB,OAAO,YAAY,IAAI,CAAC,MAAM,MAAM,MAAM;AAAA,EAEjE,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,UAAU,MAAM,KAAK,SAAS;AAAA,MAClC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,MAAM,KAAK,GAAG,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA;AAG3B,eAAe,kBAAkB,CAC/B,SACA,UACA,QACyB;AAAA,EACzB,MAAM,eAAe,sBAAsB,SAAS,UAAU,MAAM;AAAA,EAEpE,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,aAAS,cAAc,OAAO;AAAA,IACvD,OAAO,KAAK,MAAM,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,OAAO,CAAC;AAAA,IACV;AAAA;AAAA;AAIJ,eAAe,mBAAmB,CAChC,SACA,UACA,UACA,QACe;AAAA,EACf,MAAM,eAAe,sBAAsB,SAAS,UAAU,MAAM;AAAA,EACpE,MAAS,UAAW,eAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9D,MAAS,cAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAGpE,eAAe,cAAc,CAC3B,SACA,UACA,UACA,WACA,QACe;AAAA,EACf,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAC9D,MAAM,gBAAqB,YAAK,WAAW,SAAS,QAAQ,YAAY,OAAO,CAAC;AAAA,EAEhF,MAAS,UAAW,eAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/D,MAAS,cAAU,eAAe,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA;AAGtE,eAAe,oBAAoB,CACjC,SACA,SACA,QACe;AAAA,EACf,MAAM,eAAe,sBAAsB,SAAS,MAAM;AAAA,EAE1D,MAAM,WAA2B;AAAA,IAC/B,SAAS,OAAO;AAAA,IAChB,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,IACpC,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EAClC;AAAA,EAEA,MAAS,UAAW,eAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9D,MAAS,cAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AASpE,eAAsB,YAAY,CAChC,SACA,UAAiC,CAAC,GACR;AAAA,EAC1B,MAAM,UAAU,QAAQ,WAAW;AAAA,EAGnC,UAAe,eAAQ,OAAO;AAAA,EAE9B,QAAQ,IAAI,yBAAyB,SAAS;AAAA,EAG9C,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,SAAS,WAAW,MAAM;AAAA,EAEjD,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,QAAQ,IAAI,qBAAqB;AAAA,IACjC,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,UAA2B,CAAC;AAAA,EAElC,WAAW,UAAU,gBAAgB;AAAA,IACnC,QAAQ,IAAI;AAAA,GAAM,OAAO,qCAAqC;AAAA,IAE9D,MAAM,SAAS,MAAM,mBAAmB,SAAS,OAAO,IAAI,QAAQ,OAAO;AAAA,IAC3E,QAAQ,KAAK,MAAM;AAAA,IAEnB,QAAQ,IAAI,IAAI,OAAO,iBAAiB,OAAO,+BAA+B,OAAO,oBAAoB;AAAA,EAC3G;AAAA,EAEA,OAAO;AAAA;AAMT,eAAe,kBAAkB,CAC/B,SACA,UACA,QACA,SACwB;AAAA,EACxB,MAAM,SAAwB;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EAGA,MAAM,WAAW,MAAM,mBAAmB,SAAS,UAAU,MAAM;AAAA,EACnE,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAE9D,MAAM,gBAA0B,CAAC;AAAA,EACjC,MAAM,eAAwC,CAAC;AAAA,EAG/C,YAAY,UAAU,UAAU,OAAO,QAAQ,SAAS,KAAK,GAAG;AAAA,IAC9D,MAAM,WAAgB,YAAK,SAAS,QAAQ;AAAA,IAE5C,IAAI;AAAA,MACF,MAAS,WAAO,QAAQ;AAAA,MAExB,aAAa,YAAY;AAAA,MACzB,OAAO;AAAA,MACP,MAAM;AAAA,MAEN,cAAc,KAAK,QAAQ;AAAA,MAC3B,OAAO;AAAA,MAEP,IAAI,SAAS;AAAA,QACX,QAAQ,IAAI,2BAA2B,UAAU;AAAA,MACnD;AAAA;AAAA,EAEJ;AAAA,EAGA,WAAW,YAAY,eAAe;AAAA,IACpC,MAAM,gBAAqB,YAAK,WAAW,SAAS,QAAQ,YAAY,OAAO,CAAC;AAAA,IAChF,IAAI;AAAA,MACF,MAAS,WAAO,aAAa;AAAA,MAC7B,MAAM;AAAA,EAGV;AAAA,EAGA,SAAS,QAAQ;AAAA,EACjB,SAAS,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,EAC9C,MAAM,oBAAoB,SAAS,UAAU,UAAU,MAAM;AAAA,EAG7D,MAAM,wBAAwB,SAAS;AAAA,EAEvC,OAAO;AAAA;AAMT,eAAe,uBAAuB,CAAC,KAA+B;AAAA,EACpE,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAG7D,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,MAAM,SAAc,YAAK,KAAK,MAAM,IAAI;AAAA,QACxC,MAAM,wBAAwB,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IAGA,MAAM,mBAAmB,MAAS,YAAQ,GAAG;AAAA,IAG7C,IAAI,iBAAiB,WAAW,GAAG;AAAA,MACjC,MAAS,UAAM,GAAG;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AASX,eAAsB,cAAc,CAAC,SAAuC;AAAA,EAE1E,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,WAAW,iBAAiB,OAAO;AAAA,EACzC,MAAM,WAAW,SAAS;AAAA,EAE1B,MAAM,SAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EAGA,IAAI;AAAA,IACF,MAAS,WAAO,QAAQ;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAIT,IAAI;AAAA,IACF,MAAM,qBAAqB,sBAAsB,SAAS,MAAM;AAAA,IAChE,MAAM,UAAU,MAAS,aAAS,oBAAoB,OAAO;AAAA,IAC7D,MAAM,iBAAiC,KAAK,MAAM,OAAO;AAAA,IAEzD,OAAO,SAAS;AAAA,IAChB,OAAO,cAAc,eAAe;AAAA,IAGpC,WAAW,YAAY,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,mBAAmB,SAAS,UAAU,MAAM;AAAA,QACnE,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK,EAAE;AAAA,QAE9C,OAAO,QAAQ,KAAK;AAAA,UAClB,IAAI;AAAA,UACJ;AAAA,UACA,aAAa,SAAS;AAAA,QACxB,CAAC;AAAA,QAED,OAAO,cAAc;AAAA,QACrB,MAAM;AAAA,IAGV;AAAA,IACA,MAAM;AAAA,IAEN,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAa,YAAK,UAAU,OAAO,CAAC;AAAA,MAC7D,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,OAAO,SAAS;AAAA,QAEhB,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YACF,MAAM,WAAW,MAAM,mBAAmB,SAAS,OAAO,MAAM;AAAA,YAChE,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK,EAAE;AAAA,YAE9C,OAAO,QAAQ,KAAK;AAAA,cAClB,IAAI;AAAA,cACJ;AAAA,cACA,aAAa,SAAS;AAAA,YACxB,CAAC;AAAA,YAED,OAAO,cAAc;AAAA,YACrB,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAKV,OAAO;AAAA;AAAA;AAAA,EAxiBT;AAAA,EASA;AAAA,EAEA;AAAA,EAiiBA;AAAA;;;;;;;;ACvjBA;AACA;AAqBA,eAAsB,MAAM,CAC1B,SACA,OACA,UAAyB,CAAC,GACD;AAAA,EAEzB,UAAe,eAAQ,OAAO;AAAA,EAE9B,QAAQ,IAAI,mBAAmB,QAAQ;AAAA,EAGvC,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,MAAM,mBAAmB,SAAS,MAAM;AAAA,EAE/D,IAAI,CAAC,kBAAkB,eAAe,QAAQ,WAAW,GAAG;AAAA,IAC1D,QAAQ,IAAI,4CAA4C;AAAA,IACxD,OAAO,CAAC;AAAA,EACV;AAAA,EAGA,MAAM,kBAAiC,CAAC;AAAA,EAExC,WAAW,YAAY,eAAe,SAAS;AAAA,IAC7C,MAAM,SAAS,SAAS,IAAI,QAAQ;AAAA,IACpC,MAAM,eAAe,gBAAgB,QAAQ,QAAQ;AAAA,IAErD,IAAI,UAAU,cAAc,SAAS;AAAA,MAEnC,IAAI,OAAO,YAAY;AAAA,QACrB,MAAM,OAAO,WAAW,YAAY;AAAA,MACtC;AAAA,MACA,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB,WAAW,GAAG;AAAA,IAChC,QAAQ,IAAI,wCAAwC;AAAA,IACpD,OAAO,CAAC;AAAA,EACV;AAAA,EAGA,MAAM,aAA6B,CAAC;AAAA,EAEpC,WAAW,UAAU,iBAAiB;AAAA,IACpC,MAAM,MAAM,oBAAoB,SAAS,OAAO,IAAI,MAAM;AAAA,IAC1D,MAAM,gBAAgB,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO;AAAA,IAC7D,WAAW,KAAK,GAAG,aAAa;AAAA,EAClC;AAAA,EAGA,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EAG3C,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAC7B,OAAO,WAAW,MAAM,GAAG,IAAI;AAAA;AAMjC,SAAS,mBAAmB,CAC1B,SACA,UACA,QACe;AAAA,EACf,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAE9D,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA,eAAe,OAAO,aAAgD;AAAA,MAGpE,MAAM,eAAe,YAAY,KAAK,QAAQ;AAAA,MAC9C,MAAM,gBAAgB,eACb,YAAK,WAAW,SAAS,QAAQ,YAAY,OAAO,CAAC,IACrD,YAAK,WAAW,WAAW,OAAO;AAAA,MAE3C,IAAI;AAAA,QACF,MAAM,UAAU,MAAS,aAAS,eAAe,OAAO;AAAA,QACxD,OAAO,KAAK,MAAM,OAAO;AAAA,QACzB,MAAM;AAAA,QACN,OAAO;AAAA;AAAA;AAAA,IAIX,kBAAkB,YAA+B;AAAA,MAC/C,MAAM,QAAkB,CAAC;AAAA,MACzB,MAAM,kBAAkB,WAAW,OAAO,SAAS;AAAA,MAGnD,OAAO,MACJ,OAAO,OAAK,EAAE,SAAS,OAAO,KAAK,CAAC,EAAE,SAAS,eAAe,CAAC,EAC/D,IAAI,OAAK;AAAA,QACR,MAAM,YAAgB,gBAAS,WAAW,CAAC;AAAA,QAE3C,OAAO,UAAS,QAAQ,WAAW,EAAE;AAAA,OACtC;AAAA;AAAA,EAEP;AAAA;AAGF,eAAe,iBAAiB,CAAC,KAAa,OAAiB,UAAiC;AAAA,EAC9F,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAE7D,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,WAAgB,YAAK,KAAK,MAAM,IAAI;AAAA,MAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,MAAM,kBAAkB,UAAU,OAAO,QAAQ;AAAA,MACnD,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,QACzB,MAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM;AAAA;AAKV,eAAe,kBAAkB,CAAC,SAAiB,QAAgD;AAAA,EACjG,MAAM,eAAe,sBAAsB,SAAS,MAAM;AAAA,EAE1D,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,aAAS,cAAc,OAAO;AAAA,IACvD,OAAO,KAAK,MAAM,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AASJ,SAAS,mBAAmB,CAAC,SAAiC;AAAA,EACnE,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA,EAE9B,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,IACvC,MAAM,SAAS,QAAQ;AAAA,IACvB,QAAQ,UAAU;AAAA,IAGlB,MAAM,WAAW,GAAG,OAAO,YAAY,MAAM,aAAa,MAAM;AAAA,IAChE,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,UAAU;AAAA,IAEnD,UAAU,GAAG,IAAI,MAAM,WAAW;AAAA;AAAA,IAClC,UAAU,cAAc,OAAO,QAAQ,KAAK,QAAQ,CAAC,cAAc,MAAM;AAAA,IAGzE,IAAI,MAAM,YAAY;AAAA,MACpB,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA;AAAA,IAGV,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC;AAAA,IAClD,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,cAAc,KAAK,UAAU,GAAG,EAAE;AAAA,MACxC,UAAU,SAAS,cAAc,KAAK,SAAS,KAAK,QAAQ;AAAA;AAAA,IAC9D;AAAA,IAEA,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,OAAO;AAAA;AAAA;AAAA,EA3LT;AAAA,EAMA;AAAA;;;AChBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,UAAU,gBAAI;AAEpB,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK;AAGrB,IAAI,YAAY,eAAe,YAAY,MAAM;AAAA,EAC/C,QAAQ,IAAI,YAAY,SAAS;AAAA,EACjC,QAAQ,KAAK,CAAC;AAChB;AAKA,SAAS,aAAa,CAAC,MAAoB;AAAA,EACzC,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAAA,EAC5C,MAAM,WAAW,KAAK,MAAM,SAAS,IAAI;AAAA,EACzC,MAAM,WAAW,KAAK,MAAM,WAAW,EAAE;AAAA,EACzC,MAAM,YAAY,KAAK,MAAM,WAAW,EAAE;AAAA,EAC1C,MAAM,WAAW,KAAK,MAAM,YAAY,EAAE;AAAA,EAE1C,IAAI,WAAW;AAAA,IAAI,OAAO;AAAA,EAC1B,IAAI,WAAW;AAAA,IAAI,OAAO,GAAG;AAAA,EAC7B,IAAI,YAAY;AAAA,IAAI,OAAO,GAAG;AAAA,EAC9B,IAAI,WAAW;AAAA,IAAG,OAAO,GAAG;AAAA,EAG5B,OAAO,KAAK,mBAAmB;AAAA;AA8BjC,SAAS,UAAU,CAAC,OAA6B;AAAA,EAC/C,MAAM,QAAqB;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW,CAAC;AAAA,EACd;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,MAAK,QAAQ,KAAK;AAAA,IACpC,MAAM,MAAM,MAAK;AAAA,IAEjB,IAAI,QAAQ,YAAY,QAAQ,MAAM;AAAA,MACpC,MAAM,OAAO;AAAA,IACf,EAAO,SAAI,QAAQ,eAAe,QAAQ,MAAM;AAAA,MAC9C,MAAM,UAAU;AAAA,IAClB,EAAO,SAAI,QAAQ,aAAa,QAAQ,MAAM;AAAA,MAC5C,MAAM,QAAQ;AAAA,IAChB,EAAO,SAAI,QAAQ,aAAa,QAAQ,MAAM;AAAA,MAC5C,MAAM,YAAY,MAAK,EAAE;AAAA,MACzB,IAAI,aAAa,aAAa,kBAAkB;AAAA,QAC9C,MAAM,QAAQ;AAAA,MAChB,EAAO;AAAA,QACL,QAAQ,MAAM,kBAAkB,WAAW;AAAA,QAC3C,QAAQ,MACN,qBAAqB,OAAO,KAAK,gBAAgB,EAAE,KAAK,IAAI,GAC9D;AAAA,QACA,QAAQ,KAAK,CAAC;AAAA;AAAA,IAElB,EAAO,SAAI,QAAQ,WAAW,QAAQ,MAAM;AAAA,MAC1C,MAAM,IAAI,SAAS,MAAK,EAAE,IAAI,EAAE;AAAA,MAChC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG;AAAA,QACtB,MAAM,OAAO;AAAA,MACf;AAAA,IACF,EAAO,SAAI,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MAChD,MAAM,QAAQ,WAAW,MAAK,EAAE,EAAE;AAAA,MAClC,IAAI,CAAC,MAAM,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG;AAAA,QAC7C,MAAM,WAAW;AAAA,MACnB,EAAO;AAAA,QACL,QAAQ,MACN,sBAAsB,MAAK,uCAC7B;AAAA,QACA,QAAQ,KAAK,CAAC;AAAA;AAAA,IAElB,EAAO,SAAI,QAAQ,YAAY,QAAQ,MAAM;AAAA,MAC3C,MAAM,OAAO,MAAK,EAAE;AAAA,MACpB,IAAI,MAAM;AAAA,QAER,MAAM,WAAW,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,MAC1D,EAAO;AAAA,QACL,QAAQ,MAAM,sDAAsD;AAAA,QACpE,QAAQ,KAAK,CAAC;AAAA;AAAA,IAElB,EAAO,SAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AAAA,MAC/B,MAAM,UAAU,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,eAAe,IAAI,GAAG;AAAA,EACpB,MAAM,QAAQ,WAAW,KAAK,MAAM,CAAC,CAAC;AAAA,EAEtC,QAAQ;AAAA,SACD,SAAS;AAAA,MACZ,IAAI,MAAM,MAAM;AAAA,QACd,MAAM,SAAS,OAAO,KAAK,gBAAgB,EAAE,KAAK,IAAI;AAAA,QACtD,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAahB;AAAA;AAAA,eAEW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO1B;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAEA,QAAQ,iCAAgB,oCAAmB;AAAA,MAG3C,QAAQ,IAAI,iBAAiB;AAAA,MAC7B,QAAQ,IAAI;AAAA,CAAoB;AAAA,MAChC,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,gBAAe,QAAQ,IAAI,GAAG;AAAA,UAClD,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,QACD,QAAQ,IAAI;AAAA,iBAAoB;AAAA,QAChC,QAAQ,IAAI,UAAU;AAAA,QACtB,WAAW,UAAU,SAAS;AAAA,UAC5B,QAAQ,IACN,KAAK,OAAO,aAAa,OAAO,oBAAoB,OAAO,oBAAoB,OAAO,eACxF;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM,0BAA0B,KAAK;AAAA,QAC7C,QAAQ,KAAK,CAAC;AAAA;AAAA,MAIhB,IAAI,MAAM,OAAO;AAAA,QACf,QAAQ,IAAI;AAAA,4CAA8C;AAAA,QAC1D,QAAQ,IAAI,+CAA8C;AAAA,QAC1D,QAAQ,IAAI;AAAA,CAA8C;AAAA,QAE1D,IAAI;AAAA,UACF,MAAM,UAAU,MAAM,gBAAe,QAAQ,IAAI,GAAG;AAAA,YAClD,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,cAAc,CAAC,OAAO,aAAa;AAAA,cACjC,IAAI,MAAM,SAAS;AAAA,gBACjB,MAAM,SACJ,UAAU,QAAQ,MAAK,UAAU,WAAW,MAAM;AAAA,gBACpD,QAAQ,IAAI,KAAK,UAAU,UAAU;AAAA,cACvC;AAAA;AAAA,UAEJ,CAAC;AAAA,UAGD,MAAM,WAAW,YAAY;AAAA,YAC3B,QAAQ,IAAI;AAAA;AAAA,oBAAyB;AAAA,YACrC,MAAM,QAAQ,KAAK;AAAA,YACnB,QAAQ,IAAI,OAAO;AAAA,YACnB,QAAQ,KAAK,CAAC;AAAA;AAAA,UAGhB,QAAQ,GAAG,UAAU,QAAQ;AAAA,UAC7B,QAAQ,GAAG,WAAW,QAAQ;AAAA,UAG9B,MAAM,IAAI,QAAQ,MAAM,EAAE;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,QAAQ,MAAM,2BAA2B,KAAK;AAAA,UAC9C,QAAQ,KAAK,CAAC;AAAA;AAAA,MAElB;AAAA,MACA;AAAA,IACF;AAAA,SAEK,SAAS;AAAA,MACZ,IAAI,MAAM,MAAM;AAAA,QACd,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqBnB;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAEA,QAAQ,iBAAQ,8CAAwB;AAAA,MACxC,QAAQ,iCAAgB,oCAAmB;AAAA,MAC3C,MAAM,QAAQ,MAAM,UAAU;AAAA,MAE9B,IAAI,CAAC,OAAO;AAAA,QACV,QAAQ,MAAM,qCAAqC;AAAA,QACnD,QAAQ,MAAM,kDAAkD;AAAA,QAChE,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAEA,IAAI;AAAA,QAEF,MAAM,SAAS,MAAM,gBAAe,QAAQ,IAAI,CAAC;AAAA,QAEjD,IAAI,CAAC,OAAO,QAAQ;AAAA,UAClB,QAAQ,IAAI;AAAA,CAA+C;AAAA,UAC3D,QAAQ,IAAI,iBAAiB;AAAA,UAC7B,QAAQ,IAAI;AAAA,CAAoB;AAAA,UAEhC,MAAM,eAAe,MAAM,gBAAe,QAAQ,IAAI,GAAG;AAAA,YACvD,OAAO,MAAM;AAAA,YACb,SAAS;AAAA,UACX,CAAC;AAAA,UAED,QAAQ,IAAI;AAAA,iBAAoB;AAAA,UAChC,QAAQ,IAAI,UAAU;AAAA,UACtB,WAAW,UAAU,cAAc;AAAA,YACjC,QAAQ,IACN,KAAK,OAAO,aAAa,OAAO,oBAAoB,OAAO,oBAAoB,OAAO,eACxF;AAAA,UACF;AAAA,UACA,QAAQ,IAAI,EAAE;AAAA,QAChB;AAAA,QAEA,QAAQ,IAAI,gBAAgB;AAAA,QAC5B,QAAQ,IAAI;AAAA,CAAkB;AAAA,QAG9B,MAAM,eAAe,MAAM,WACvB,CAAC,KAAK,MAAM,UAAU,IACtB;AAAA,QAEJ,MAAM,UAAU,MAAM,QAAO,QAAQ,IAAI,GAAG,OAAO;AAAA,UACjD,MAAM,MAAM,QAAQ;AAAA,UACpB,UAAU,MAAM;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,IAAI,qBAAoB,OAAO,CAAC;AAAA,QACxC,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM,wBAAwB,KAAK;AAAA,QAC3C,QAAQ,KAAK,CAAC;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA,SAEK,WAAW;AAAA,MACd,IAAI,MAAM,MAAM;AAAA,QACd,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAiBnB;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAEA,QAAQ,gCAAiB;AAAA,MACzB,QAAQ,IAAI,iBAAiB;AAAA,MAC7B,QAAQ,IAAI;AAAA,CAAmB;AAAA,MAC/B,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,cAAa,QAAQ,IAAI,GAAG;AAAA,UAChD,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,QACD,QAAQ,IAAI;AAAA,gBAAmB;AAAA,QAC/B,QAAQ,IAAI,UAAU;AAAA,QACtB,WAAW,UAAU,SAAS;AAAA,UAC5B,QAAQ,IACN,KAAK,OAAO,aAAa,OAAO,oBAAoB,OAAO,WAC7D;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM,yBAAyB,KAAK;AAAA,QAC5C,QAAQ,KAAK,CAAC;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA,SAEK,UAAU;AAAA,MACb,IAAI,MAAM,MAAM;AAAA,QACd,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgBnB;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAEA,QAAQ,oCAAmB;AAAA,MAC3B,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,gBAAe,QAAQ,IAAI,CAAC;AAAA,QAEjD,IAAI,CAAC,OAAO,QAAQ;AAAA,UAClB,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOP,OAAO;AAAA;AAAA;AAAA,CAGrB;AAAA,QACO,EAAO;AAAA,UACL,MAAM,OAAO,OAAO,cAAc,IAAI,KAAK,OAAO,WAAW,IAAI;AAAA,UACjE,MAAM,UAAU,OAAO,cAAc,IAAI,IAAI;AAAA,UAE7C,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAOR,OAAO,WAAW,SAAS,EAAE,OAAO,EAAE,cAAc;AAAA,cACpD,OAAO;AAAA,CACpB;AAAA,UACS,IAAI,OAAO,QAAQ,SAAS,GAAG;AAAA,YAC7B,QAAQ,IAAI,YAAY;AAAA,YACxB,WAAW,OAAO,OAAO,SAAS;AAAA,cAChC,QAAQ,IAAI,UAAS,IAAI,OAAO,IAAI,kBAAkB;AAAA,YACxD;AAAA,YACA,QAAQ,IAAI,EAAE;AAAA,UAChB;AAAA;AAAA,QAEF,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM,yBAAyB,KAAK;AAAA,QAC5C,QAAQ,KAAK,CAAC;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA;AAAA,MAGE,QAAQ,IAAI;AAAA,WACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAsBV;AAAA,MACK,IAAI,WAAW,YAAY,YAAY,YAAY,MAAM;AAAA,QACvD,QAAQ,MAAM,oBAAoB,SAAS;AAAA,QAC3C,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA;AAAA;AAIN,KAAK;",
|
|
37
|
+
"debugId": "03A02811A6080C5964756E2164756E21",
|
|
32
38
|
"names": []
|
|
33
39
|
}
|