raggrep 0.14.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -3
- package/dist/app/search/index.d.ts +16 -0
- package/dist/cli/main.js +940 -435
- package/dist/cli/main.js.map +26 -20
- package/dist/domain/entities/index.d.ts +1 -1
- package/dist/domain/entities/searchResult.d.ts +54 -0
- package/dist/domain/ports/filesystem.d.ts +3 -1
- package/dist/domain/services/chunkContext.d.ts +76 -0
- package/dist/domain/services/index.d.ts +2 -0
- package/dist/domain/services/simpleSearch.d.ts +75 -0
- package/dist/domain/usecases/exactSearch.d.ts +53 -0
- package/dist/domain/usecases/index.d.ts +1 -0
- package/dist/index.d.ts +38 -3
- package/dist/index.js +894 -407
- package/dist/index.js.map +24 -20
- package/dist/types.d.ts +1 -1
- package/package.json +2 -1
- package/dist/domain/services/bm25.test.d.ts +0 -4
- package/dist/domain/services/configValidator.test.d.ts +0 -1
- package/dist/domain/services/conventions/conventions.test.d.ts +0 -4
- package/dist/domain/services/introspection.test.d.ts +0 -4
- package/dist/domain/services/jsonPathExtractor.test.d.ts +0 -4
- package/dist/domain/services/lexicon.test.d.ts +0 -6
- package/dist/domain/services/literalExtractor.test.d.ts +0 -6
- package/dist/domain/services/phraseMatch.test.d.ts +0 -4
- package/dist/domain/services/queryLiteralParser.test.d.ts +0 -7
- package/dist/infrastructure/embeddings/embeddings.test.d.ts +0 -4
- package/dist/infrastructure/parsing/parsing.test.d.ts +0 -10
- package/dist/modules/core/symbols.test.d.ts +0 -4
- package/dist/modules/language/go/index.test.d.ts +0 -1
- package/dist/modules/language/rust/index.test.d.ts +0 -1
- package/dist/modules/language/typescript/parseCode.test.d.ts +0 -4
- package/dist/tests/integration.test.d.ts +0 -9
- package/dist/tests/ranking.test.d.ts +0 -12
- package/dist/tests/simulation-phrase-matching.test.d.ts +0 -14
- package/dist/tests/simulation-vocabulary.test.d.ts +0 -17
- package/dist/tests/vocabulary-scoring.test.d.ts +0 -16
- package/dist/tests/vocabulary.test.d.ts +0 -10
package/dist/index.js.map
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/domain/entities/searchResult.ts", "../src/domain/entities/config.ts", "../src/domain/entities/lexicon.ts", "../src/domain/entities/index.ts", "../src/infrastructure/config/configLoader.ts", "../src/infrastructure/config/index.ts", "../src/domain/services/bm25.ts", "../src/domain/services/conventions/entryPoints.ts", "../src/domain/services/conventions/configFiles.ts", "../src/domain/services/conventions/frameworks/nextjs.ts", "../src/domain/services/conventions/frameworks/convex.ts", "../src/domain/services/conventions/frameworks/index.ts", "../src/domain/services/conventions/index.ts", "../src/domain/services/introspection.ts", "../src/modules/core/symbols.ts", "../src/modules/core/index.ts", "../src/infrastructure/embeddings/transformersEmbedding.ts", "../src/infrastructure/embeddings/index.ts", "../src/domain/services/keywords.ts", "../src/domain/services/similarity.ts", "../src/domain/services/queryIntent.ts", "../src/domain/services/chunking.ts", "../src/domain/services/queryLiteralParser.ts", "../src/domain/services/literalExtractor.ts", "../src/domain/services/literalScorer.ts", "../src/domain/services/lexicon.ts", "../src/domain/services/jsonPathExtractor.ts", "../src/domain/services/phraseMatch.ts", "../src/domain/services/index.ts", "../src/modules/language/typescript/parseCode.ts", "../src/infrastructure/storage/fileIndexStorage.ts", "../src/infrastructure/storage/symbolicIndex.ts", "../src/infrastructure/storage/literalIndex.ts", "../src/infrastructure/storage/index.ts", "../src/modules/language/typescript/index.ts", "../src/infrastructure/parsing/typescriptParser.ts", "../src/infrastructure/parsing/grammarManager.ts", "../src/infrastructure/parsing/treeSitterParser.ts", "../src/infrastructure/parsing/parserFactory.ts", "../src/infrastructure/parsing/index.ts", "../src/modules/language/python/index.ts", "../src/modules/language/go/index.ts", "../src/modules/language/rust/index.ts", "../src/modules/data/json/index.ts", "../src/modules/docs/markdown/index.ts", "../node_modules/
|
|
3
|
+
"sources": ["../src/domain/entities/searchResult.ts", "../src/domain/entities/config.ts", "../src/domain/entities/lexicon.ts", "../src/domain/entities/index.ts", "../src/infrastructure/config/configLoader.ts", "../src/infrastructure/config/index.ts", "../src/domain/services/bm25.ts", "../src/domain/services/conventions/entryPoints.ts", "../src/domain/services/conventions/configFiles.ts", "../src/domain/services/conventions/frameworks/nextjs.ts", "../src/domain/services/conventions/frameworks/convex.ts", "../src/domain/services/conventions/frameworks/index.ts", "../src/domain/services/conventions/index.ts", "../src/domain/services/introspection.ts", "../src/modules/core/symbols.ts", "../src/modules/core/index.ts", "../src/infrastructure/embeddings/transformersEmbedding.ts", "../src/infrastructure/embeddings/index.ts", "../src/domain/services/keywords.ts", "../src/domain/services/similarity.ts", "../src/domain/services/queryIntent.ts", "../src/domain/services/chunking.ts", "../src/domain/services/queryLiteralParser.ts", "../src/domain/services/literalExtractor.ts", "../src/domain/services/literalScorer.ts", "../src/domain/services/lexicon.ts", "../src/domain/services/jsonPathExtractor.ts", "../src/domain/services/phraseMatch.ts", "../src/domain/services/simpleSearch.ts", "../src/domain/services/chunkContext.ts", "../src/domain/services/index.ts", "../src/modules/language/typescript/parseCode.ts", "../src/infrastructure/storage/fileIndexStorage.ts", "../src/infrastructure/storage/symbolicIndex.ts", "../src/infrastructure/storage/literalIndex.ts", "../src/infrastructure/storage/index.ts", "../src/modules/language/typescript/index.ts", "../src/infrastructure/parsing/typescriptParser.ts", "../src/infrastructure/parsing/grammarManager.ts", "../src/infrastructure/parsing/treeSitterParser.ts", "../src/infrastructure/parsing/parserFactory.ts", "../src/infrastructure/parsing/index.ts", "../src/modules/language/python/index.ts", "../src/modules/language/go/index.ts", "../src/modules/language/rust/index.ts", "../src/modules/data/json/index.ts", "../src/modules/docs/markdown/index.ts", "../node_modules/fdir/dist/index.mjs", "../src/app/indexer/index.ts", "../src/modules/registry.ts", "../src/infrastructure/introspection/IntrospectionIndex.ts", "../src/infrastructure/introspection/projectDetector.ts", "../src/infrastructure/logger/loggers.ts", "../src/infrastructure/logger/progressManager.ts", "../src/infrastructure/logger/multiModuleProgressManager.ts", "../src/app/indexer/watcher.ts", "../src/app/search/index.ts", "../node_modules/@isaacs/balanced-match/dist/esm/index.js", "../node_modules/@isaacs/brace-expansion/dist/esm/index.js", "../node_modules/minimatch/dist/esm/assert-valid-pattern.js", "../node_modules/minimatch/dist/esm/brace-expressions.js", "../node_modules/minimatch/dist/esm/unescape.js", "../node_modules/minimatch/dist/esm/ast.js", "../node_modules/minimatch/dist/esm/escape.js", "../node_modules/minimatch/dist/esm/index.js", "../src/types.ts", "../src/domain/usecases/exactSearch.ts", "../src/infrastructure/filesystem/nodeFileSystem.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * SearchResult Entity\n *\n * Represents a single result from a search query.\n */\n\nimport type { Chunk } from \"./chunk\";\n\n/**\n * Contribution from the core index.\n */\nexport interface CoreContribution {\n /** Symbol name match score (0-1) */\n symbolMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from a language-specific index.\n */\nexport interface LanguageContribution {\n /** Semantic embedding similarity (0-1) */\n semanticMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from introspection boosting.\n */\nexport interface IntrospectionContribution {\n /** Boost from domain match */\n domainBoost: number;\n /** Boost from layer match */\n layerBoost: number;\n /** Boost from scope match */\n scopeBoost: number;\n /** Boost from path segment match */\n pathBoost: number;\n}\n\n/**\n * Tracks which indexes contributed to a search result's score.\n * Used for learning and tuning.\n */\nexport interface SearchContributions {\n /** Core index contribution */\n core?: CoreContribution;\n /** Language-specific index contribution (keyed by module ID) */\n language?: Record<string, LanguageContribution>;\n /** Introspection boost contribution */\n introspection?: IntrospectionContribution;\n}\n\n/**\n * A search result with relevance score and source information.\n */\nexport interface SearchResult {\n /** Path to the file containing the result */\n filepath: string;\n\n /** The matching chunk */\n chunk: Chunk;\n\n /** Final relevance score (0-1, higher is better) */\n score: number;\n\n /** ID of the module that produced this result */\n moduleId: string;\n\n /** Contribution tracking for learning */\n contributions?: SearchContributions;\n\n /** Additional context from the search (e.g., semantic vs keyword scores) */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options for search operations.\n */\nexport interface SearchOptions {\n /** Maximum number of results to return (default: 10) */\n topK?: number;\n\n /** Minimum similarity score threshold 0-1 (default: 0.15) */\n minScore?: number;\n\n /** Filter to specific file patterns (e.g., ['*.ts', '*.tsx']) */\n filePatterns?: string[];\n\n /**\n * Filter results by path prefix or glob pattern.\n *\n * Supports two modes:\n * - Path prefix: 'src/auth' matches all files in src/auth/\n * - Glob pattern: '*.ts' matches all TypeScript files, '*.md' matches markdown\n *\n * Examples:\n * - ['src/auth'] - files in src/auth/\n * - ['*.ts'] - all TypeScript files\n * - ['*.md'] - all Markdown files\n * - ['src/**\\/*.test.ts'] - test files in src/\n */\n pathFilter?: string[];\n\n /**\n * Ensure the index is fresh before searching (default: true).\n *\n * When true, the search will automatically:\n * - Create the index if it doesn't exist\n * - Re-index any modified files\n * - Remove entries for deleted files\n *\n * Set to false if you've already ensured freshness or want explicit control.\n */\n ensureFresh?: boolean;\n}\n\n/**\n * Default search options.\n */\nexport const DEFAULT_SEARCH_OPTIONS: Required<SearchOptions> = {\n topK: 10,\n minScore: 0.15,\n filePatterns: [],\n pathFilter: [],\n ensureFresh: true,\n};\n",
|
|
5
|
+
"/**\n * SearchResult Entity\n *\n * Represents a single result from a search query.\n */\n\nimport type { Chunk } from \"./chunk\";\n\n/**\n * Contribution from the core index.\n */\nexport interface CoreContribution {\n /** Symbol name match score (0-1) */\n symbolMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from a language-specific index.\n */\nexport interface LanguageContribution {\n /** Semantic embedding similarity (0-1) */\n semanticMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from introspection boosting.\n */\nexport interface IntrospectionContribution {\n /** Boost from domain match */\n domainBoost: number;\n /** Boost from layer match */\n layerBoost: number;\n /** Boost from scope match */\n scopeBoost: number;\n /** Boost from path segment match */\n pathBoost: number;\n}\n\n/**\n * Tracks which indexes contributed to a search result's score.\n * Used for learning and tuning.\n */\nexport interface SearchContributions {\n /** Core index contribution */\n core?: CoreContribution;\n /** Language-specific index contribution (keyed by module ID) */\n language?: Record<string, LanguageContribution>;\n /** Introspection boost contribution */\n introspection?: IntrospectionContribution;\n}\n\n/**\n * A search result with relevance score and source information.\n */\nexport interface SearchResult {\n /** Path to the file containing the result */\n filepath: string;\n\n /** The matching chunk */\n chunk: Chunk;\n\n /** Final relevance score (0-1, higher is better) */\n score: number;\n\n /** ID of the module that produced this result */\n moduleId: string;\n\n /** Contribution tracking for learning */\n contributions?: SearchContributions;\n\n /** Additional context from the search (e.g., semantic vs keyword scores) */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options for search operations.\n */\nexport interface SearchOptions {\n /** Maximum number of results to return (default: 10) */\n topK?: number;\n\n /** Minimum similarity score threshold 0-1 (default: 0.15) */\n minScore?: number;\n\n /** Filter to specific file patterns (e.g., ['*.ts', '*.tsx']) */\n filePatterns?: string[];\n\n /**\n * Filter results by path prefix or glob pattern.\n *\n * Supports two modes:\n * - Path prefix: 'src/auth' matches all files in src/auth/\n * - Glob pattern: '*.ts' matches all TypeScript files, '*.md' matches markdown\n *\n * Examples:\n * - ['src/auth'] - files in src/auth/\n * - ['*.ts'] - all TypeScript files\n * - ['*.md'] - all Markdown files\n * - ['src/**\\/*.test.ts'] - test files in src/\n */\n pathFilter?: string[];\n\n /**\n * Ensure the index is fresh before searching (default: true).\n *\n * When true, the search will automatically:\n * - Create the index if it doesn't exist\n * - Re-index any modified files\n * - Remove entries for deleted files\n *\n * Set to false if you've already ensured freshness or want explicit control.\n */\n ensureFresh?: boolean;\n}\n\n/**\n * Default search options.\n */\nexport const DEFAULT_SEARCH_OPTIONS: Required<SearchOptions> = {\n topK: 10,\n minScore: 0.15,\n filePatterns: [],\n pathFilter: [],\n ensureFresh: true,\n};\n\n// ============================================================================\n// Exact Match Results (Literal Search Track)\n// ============================================================================\n\n/**\n * A single exact match occurrence in a file.\n * Represents a grep-like match with surrounding context.\n */\nexport interface ExactMatchOccurrence {\n /** Line number where the match was found (1-indexed) */\n line: number;\n\n /** Column where the match starts (0-indexed) */\n column: number;\n\n /** The full line containing the match */\n lineContent: string;\n\n /** Line before the match (if available) */\n contextBefore?: string;\n\n /** Line after the match (if available) */\n contextAfter?: string;\n}\n\n/**\n * Exact matches found in a single file.\n */\nexport interface ExactMatchFile {\n /** Path to the file */\n filepath: string;\n\n /** All occurrences of the literal in this file */\n occurrences: ExactMatchOccurrence[];\n\n /** Total number of matches in this file */\n matchCount: number;\n}\n\n/**\n * Result of exact/literal search across the codebase.\n * This is separate from semantic search results.\n */\nexport interface ExactMatchResults {\n /** The literal that was searched for */\n query: string;\n\n /** Files containing exact matches, sorted by match count */\n files: ExactMatchFile[];\n\n /** Total number of matches across all files */\n totalMatches: number;\n\n /** Total number of files with matches */\n totalFiles: number;\n\n /** Whether results were truncated (more matches exist) */\n truncated: boolean;\n}\n\n/**\n * Combined search results with both semantic and exact match tracks.\n */\nexport interface HybridSearchResults {\n /** Semantic/BM25 search results (existing behavior) */\n results: SearchResult[];\n\n /** Exact match results for literal queries (optional) */\n exactMatches?: ExactMatchResults;\n\n /** Whether exact matches influenced the semantic result ranking */\n fusionApplied: boolean;\n}\n",
|
|
6
6
|
"/**\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 // System files\n \".DS_Store\",\n \"Thumbs.db\",\n\n // Environment files\n \".env\",\n \".env.local\",\n \".env.development.local\",\n \".env.test.local\",\n \".env.production.local\",\n\n // Lock files\n \"*.lock\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"pnpm-lock.yaml\",\n \"Cargo.lock\",\n \"poetry.lock\",\n \"Gemfile.lock\",\n \"go.sum\",\n\n // Minified/compiled bundles\n \"*.min.js\",\n \"*.min.css\",\n];\n\n/**\n * Default file extensions to index.\n *\n * Note: Each module filters for its own supported extensions.\n * - language/typescript: .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts\n * - data/json: .json\n * - docs/markdown: .md\n * - core: all remaining extensions\n */\nexport const DEFAULT_EXTENSIONS = [\n // TypeScript/JavaScript (language/typescript module)\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n // JSON (data/json module)\n \".json\",\n // Markdown (docs/markdown module)\n \".md\",\n // Other languages (core module)\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n // Config & data (core module)\n \".yaml\",\n \".yml\",\n \".toml\",\n // Database (core module)\n \".sql\",\n // Other documentation (core module)\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 id: \"language/python\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"language/go\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"language/rust\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"data/json\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"docs/markdown\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n ],\n };\n}\n",
|
|
7
7
|
"/**\n * Lexicon Types\n *\n * Type definitions for Structured Semantic Expansion (SSE).\n * SSE improves search recall by expanding query terms with domain-specific synonyms.\n *\n * This is a pure domain entity with no external dependencies.\n */\n\n/**\n * Correlation grade for synonyms.\n * Determines how much weight a synonym contributes to scoring.\n *\n * - strong: Near-equivalent concepts (function ↔ method)\n * - moderate: Related but distinct (function ↔ handler)\n * - weak: Loosely associated (auth ↔ security)\n */\nexport type SynonymGrade = \"strong\" | \"moderate\" | \"weak\";\n\n/**\n * A single synonym with its correlation grade.\n */\nexport interface Synonym {\n /** The synonym term */\n term: string;\n\n /** Correlation strength with the parent term */\n grade: SynonymGrade;\n}\n\n/**\n * A synonym entry in the lexicon.\n */\nexport interface SynonymEntry {\n /** The canonical term */\n term: string;\n\n /** Synonyms with their correlation grades */\n synonyms: Synonym[];\n\n /** Optional context restriction (e.g., \"typescript\", \"database\") */\n context?: string;\n}\n\n/**\n * The lexicon containing all synonym mappings.\n */\nexport interface Lexicon {\n /** Version for compatibility checking */\n version: string;\n\n /** All synonym entries */\n entries: SynonymEntry[];\n\n /** Optional module-specific overrides */\n moduleOverrides?: Record<string, SynonymEntry[]>;\n}\n\n/**\n * An expanded term with weight information.\n */\nexport interface ExpandedTerm {\n /** The term (original or synonym) */\n term: string;\n\n /** Weight for scoring (1.0 for original, lower for synonyms) */\n weight: number;\n\n /** How this term was derived */\n source: \"original\" | \"strong\" | \"moderate\" | \"weak\";\n\n /** The original term this was expanded from (if synonym) */\n expandedFrom?: string;\n}\n\n/**\n * Result of expanding a query.\n */\nexport interface ExpandedQuery {\n /** Original query string */\n originalQuery: string;\n\n /** Original query terms (tokenized) */\n originalTerms: string[];\n\n /** All terms including expansions with weights */\n expandedTerms: ExpandedTerm[];\n\n /** Query string with expansions (for embedding) */\n expandedQueryString: string;\n\n /** Whether any expansion occurred */\n wasExpanded: boolean;\n}\n\n/**\n * Options for query expansion.\n */\nexport interface ExpansionOptions {\n /** Maximum expansion depth (passes). Default: 1 */\n maxDepth?: number;\n\n /** Include weak synonyms. Default: true */\n includeWeak?: boolean;\n\n /** Maximum total terms after expansion. Default: 20 */\n maxTerms?: number;\n\n /** Minimum term length to expand. Default: 2 */\n minTermLength?: number;\n\n /** Context filter (only use entries matching this context) */\n context?: string;\n}\n\n/**\n * Default expansion options.\n */\nexport const DEFAULT_EXPANSION_OPTIONS: Required<\n Omit<ExpansionOptions, \"context\">\n> = {\n maxDepth: 1,\n includeWeak: true,\n maxTerms: 20,\n minTermLength: 2,\n};\n\n/**\n * Weights applied to synonyms by grade.\n */\nexport const EXPANSION_WEIGHTS: Record<SynonymGrade, number> = {\n strong: 0.9,\n moderate: 0.6,\n weak: 0.3,\n};\n",
|
|
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\n// Introspection - File metadata for context-aware search\nexport type {\n FileIntrospection,\n ProjectStructure,\n Project,\n ProjectType,\n Scope,\n IntrospectionConfig,\n} from \"./introspection\";\n\n// Conventions - File pattern recognition\nexport type {\n FileConvention,\n ConventionCategory,\n FrameworkConventions,\n ConventionMatch,\n} from \"./conventions\";\n\n// Literal - Types for literal boosting\nexport type {\n LiteralType,\n LiteralMatchType,\n LiteralConfidence,\n LiteralDetectionMethod,\n ExtractedLiteral,\n DetectedLiteral,\n QueryLiteralParseResult,\n LiteralMatch,\n LiteralIndexEntry,\n LiteralIndexData,\n} from \"./literal\";\nexport { LITERAL_SCORING } from \"./literal\";\n\n// Lexicon - Types for structured semantic expansion\nexport type {\n SynonymGrade,\n Synonym,\n SynonymEntry,\n Lexicon,\n ExpandedTerm,\n ExpandedQuery,\n ExpansionOptions,\n} from \"./lexicon\";\nexport { DEFAULT_EXPANSION_OPTIONS, EXPANSION_WEIGHTS } from \"./lexicon\";\n",
|
|
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 // Exact match types\n ExactMatchOccurrence,\n ExactMatchFile,\n ExactMatchResults,\n HybridSearchResults,\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\n// Introspection - File metadata for context-aware search\nexport type {\n FileIntrospection,\n ProjectStructure,\n Project,\n ProjectType,\n Scope,\n IntrospectionConfig,\n} from \"./introspection\";\n\n// Conventions - File pattern recognition\nexport type {\n FileConvention,\n ConventionCategory,\n FrameworkConventions,\n ConventionMatch,\n} from \"./conventions\";\n\n// Literal - Types for literal boosting\nexport type {\n LiteralType,\n LiteralMatchType,\n LiteralConfidence,\n LiteralDetectionMethod,\n ExtractedLiteral,\n DetectedLiteral,\n QueryLiteralParseResult,\n LiteralMatch,\n LiteralIndexEntry,\n LiteralIndexData,\n} from \"./literal\";\nexport { LITERAL_SCORING } from \"./literal\";\n\n// Lexicon - Types for structured semantic expansion\nexport type {\n SynonymGrade,\n Synonym,\n SynonymEntry,\n Lexicon,\n ExpandedTerm,\n ExpandedQuery,\n ExpansionOptions,\n} from \"./lexicon\";\nexport { DEFAULT_EXPANSION_OPTIONS, EXPANSION_WEIGHTS } from \"./lexicon\";\n",
|
|
9
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 \"nomic-embed-text-v1.5\": \"nomic-ai/nomic-embed-text-v1.5\",\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\n .createHash(\"sha256\")\n .update(inputPath)\n .digest(\"hex\")\n .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) || \"bge-small-en-v1.5\";\n\n // Validate model name\n if (!(modelName in EMBEDDING_MODELS)) {\n console.warn(\n `Unknown embedding model: ${modelName}, falling back to bge-small-en-v1.5`\n );\n return { model: \"bge-small-en-v1.5\" };\n }\n\n return {\n model: modelName as EmbeddingModelName,\n // Default to NO progress logs unless explicitly enabled\n showProgress: options.showProgress === true,\n };\n}\n",
|
|
10
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 * Remove a document from the index.\n * Updates document frequencies and average document length.\n *\n * @param id - Document identifier to remove\n * @returns true if document was removed, false if not found\n */\n removeDocument(id: string): boolean {\n const doc = this.documents.get(id);\n if (!doc) return false;\n\n const tokens = doc.tokens;\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 if (count <= 1) {\n this.documentFrequencies.delete(term);\n } else {\n this.documentFrequencies.set(term, count - 1);\n }\n }\n\n // Update average document length\n const totalLength = this.avgDocLength * this.totalDocs - tokens.length;\n this.totalDocs--;\n this.avgDocLength = this.totalDocs > 0 ? totalLength / this.totalDocs : 0;\n\n // Remove the document\n this.documents.delete(id);\n return true;\n }\n\n /**\n * Update a document in the index (remove + add).\n * More efficient than separate remove/add as it batches the operations.\n *\n * @param id - Document identifier\n * @param newTokens - New tokens for the document\n */\n updateDocument(id: string, newTokens: string[]): void {\n this.removeDocument(id);\n this.addDocument(id, newTokens);\n }\n\n /**\n * Check if a document exists in the index.\n *\n * @param id - Document identifier\n * @returns true if document exists\n */\n hasDocument(id: string): boolean {\n return this.documents.has(id);\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",
|
|
@@ -30,25 +30,25 @@
|
|
|
30
30
|
"/**\n * Lexicon Service\n *\n * Provides query expansion using domain-specific synonyms.\n * Part of Structured Semantic Expansion (SSE) for improved search recall.\n *\n * This is a pure domain service with no external dependencies.\n */\n\nimport type {\n Lexicon,\n SynonymEntry,\n Synonym,\n SynonymGrade,\n ExpandedTerm,\n ExpandedQuery,\n ExpansionOptions,\n} from \"../entities/lexicon\";\nimport {\n DEFAULT_EXPANSION_OPTIONS,\n EXPANSION_WEIGHTS,\n} from \"../entities/lexicon\";\n\n/**\n * Default lexicon for programming domain.\n *\n * Contains common synonyms for code-related terms.\n * Grades indicate correlation strength:\n * - strong: Near-equivalent (function ↔ method)\n * - moderate: Related but distinct (function ↔ handler)\n * - weak: Loosely associated (auth ↔ security)\n */\nexport const DEFAULT_LEXICON: Lexicon = {\n version: \"1.0.0\",\n entries: [\n // === Code Structure ===\n {\n term: \"function\",\n synonyms: [\n { term: \"method\", grade: \"strong\" },\n { term: \"func\", grade: \"strong\" },\n { term: \"handler\", grade: \"moderate\" },\n { term: \"callback\", grade: \"moderate\" },\n { term: \"procedure\", grade: \"weak\" },\n { term: \"routine\", grade: \"weak\" },\n ],\n },\n {\n term: \"method\",\n synonyms: [\n { term: \"function\", grade: \"strong\" },\n { term: \"func\", grade: \"strong\" },\n { term: \"handler\", grade: \"moderate\" },\n ],\n },\n {\n term: \"class\",\n synonyms: [\n { term: \"type\", grade: \"moderate\" },\n { term: \"interface\", grade: \"moderate\" },\n { term: \"struct\", grade: \"moderate\" },\n { term: \"model\", grade: \"weak\" },\n { term: \"entity\", grade: \"weak\" },\n ],\n },\n {\n term: \"interface\",\n synonyms: [\n { term: \"type\", grade: \"strong\" },\n { term: \"contract\", grade: \"moderate\" },\n { term: \"protocol\", grade: \"weak\" },\n ],\n },\n {\n term: \"type\",\n synonyms: [\n { term: \"interface\", grade: \"strong\" },\n { term: \"typedef\", grade: \"strong\" },\n { term: \"schema\", grade: \"moderate\" },\n ],\n },\n {\n term: \"variable\",\n synonyms: [\n { term: \"var\", grade: \"strong\" },\n { term: \"const\", grade: \"strong\" },\n { term: \"constant\", grade: \"strong\" },\n { term: \"property\", grade: \"moderate\" },\n { term: \"field\", grade: \"moderate\" },\n ],\n },\n {\n term: \"constant\",\n synonyms: [\n { term: \"const\", grade: \"strong\" },\n { term: \"variable\", grade: \"moderate\" },\n { term: \"config\", grade: \"weak\" },\n ],\n },\n\n // === Authentication & Security ===\n {\n term: \"auth\",\n synonyms: [\n { term: \"authentication\", grade: \"strong\" },\n { term: \"authorization\", grade: \"strong\" },\n { term: \"login\", grade: \"moderate\" },\n { term: \"signin\", grade: \"moderate\" },\n { term: \"session\", grade: \"weak\" },\n { term: \"security\", grade: \"weak\" },\n ],\n },\n {\n term: \"authentication\",\n synonyms: [\n { term: \"auth\", grade: \"strong\" },\n { term: \"login\", grade: \"moderate\" },\n { term: \"signin\", grade: \"moderate\" },\n { term: \"identity\", grade: \"weak\" },\n ],\n },\n {\n term: \"authorization\",\n synonyms: [\n { term: \"auth\", grade: \"strong\" },\n { term: \"permission\", grade: \"moderate\" },\n { term: \"access\", grade: \"moderate\" },\n { term: \"role\", grade: \"weak\" },\n ],\n },\n {\n term: \"login\",\n synonyms: [\n { term: \"signin\", grade: \"strong\" },\n { term: \"auth\", grade: \"moderate\" },\n { term: \"authenticate\", grade: \"moderate\" },\n ],\n },\n {\n term: \"logout\",\n synonyms: [\n { term: \"signout\", grade: \"strong\" },\n { term: \"logoff\", grade: \"strong\" },\n ],\n },\n {\n term: \"password\",\n synonyms: [\n { term: \"pwd\", grade: \"strong\" },\n { term: \"pass\", grade: \"strong\" },\n { term: \"credential\", grade: \"moderate\" },\n { term: \"secret\", grade: \"weak\" },\n ],\n },\n {\n term: \"token\",\n synonyms: [\n { term: \"jwt\", grade: \"strong\" },\n { term: \"bearer\", grade: \"moderate\" },\n { term: \"credential\", grade: \"weak\" },\n ],\n },\n\n // === Data & Storage ===\n {\n term: \"database\",\n synonyms: [\n { term: \"db\", grade: \"strong\" },\n { term: \"datastore\", grade: \"strong\" },\n { term: \"storage\", grade: \"moderate\" },\n { term: \"repository\", grade: \"weak\" },\n ],\n },\n {\n term: \"query\",\n synonyms: [\n { term: \"select\", grade: \"moderate\" },\n { term: \"find\", grade: \"moderate\" },\n { term: \"fetch\", grade: \"moderate\" },\n { term: \"search\", grade: \"weak\" },\n ],\n },\n {\n term: \"insert\",\n synonyms: [\n { term: \"create\", grade: \"strong\" },\n { term: \"add\", grade: \"strong\" },\n { term: \"save\", grade: \"moderate\" },\n { term: \"store\", grade: \"moderate\" },\n ],\n },\n {\n term: \"update\",\n synonyms: [\n { term: \"modify\", grade: \"strong\" },\n { term: \"edit\", grade: \"strong\" },\n { term: \"patch\", grade: \"moderate\" },\n { term: \"change\", grade: \"moderate\" },\n ],\n },\n {\n term: \"delete\",\n synonyms: [\n { term: \"remove\", grade: \"strong\" },\n { term: \"destroy\", grade: \"strong\" },\n { term: \"drop\", grade: \"moderate\" },\n { term: \"erase\", grade: \"weak\" },\n ],\n },\n {\n term: \"cache\",\n synonyms: [\n { term: \"redis\", grade: \"moderate\" },\n { term: \"memcache\", grade: \"moderate\" },\n { term: \"store\", grade: \"weak\" },\n { term: \"buffer\", grade: \"weak\" },\n ],\n },\n\n // === API & HTTP ===\n {\n term: \"api\",\n synonyms: [\n { term: \"endpoint\", grade: \"strong\" },\n { term: \"route\", grade: \"moderate\" },\n { term: \"rest\", grade: \"moderate\" },\n { term: \"service\", grade: \"weak\" },\n ],\n },\n {\n term: \"endpoint\",\n synonyms: [\n { term: \"api\", grade: \"strong\" },\n { term: \"route\", grade: \"strong\" },\n { term: \"path\", grade: \"moderate\" },\n ],\n },\n {\n term: \"request\",\n synonyms: [\n { term: \"req\", grade: \"strong\" },\n { term: \"call\", grade: \"moderate\" },\n { term: \"fetch\", grade: \"moderate\" },\n ],\n },\n {\n term: \"response\",\n synonyms: [\n { term: \"res\", grade: \"strong\" },\n { term: \"reply\", grade: \"moderate\" },\n { term: \"result\", grade: \"weak\" },\n ],\n },\n {\n term: \"middleware\",\n synonyms: [\n { term: \"interceptor\", grade: \"moderate\" },\n { term: \"filter\", grade: \"moderate\" },\n { term: \"handler\", grade: \"weak\" },\n ],\n },\n\n // === Error Handling ===\n {\n term: \"error\",\n synonyms: [\n { term: \"exception\", grade: \"strong\" },\n { term: \"err\", grade: \"strong\" },\n { term: \"failure\", grade: \"moderate\" },\n { term: \"fault\", grade: \"weak\" },\n ],\n },\n {\n term: \"exception\",\n synonyms: [\n { term: \"error\", grade: \"strong\" },\n { term: \"throw\", grade: \"moderate\" },\n { term: \"catch\", grade: \"moderate\" },\n ],\n },\n {\n term: \"validate\",\n synonyms: [\n { term: \"verify\", grade: \"strong\" },\n { term: \"check\", grade: \"strong\" },\n { term: \"assert\", grade: \"moderate\" },\n { term: \"ensure\", grade: \"moderate\" },\n ],\n },\n\n // === Configuration ===\n {\n term: \"config\",\n synonyms: [\n { term: \"configuration\", grade: \"strong\" },\n { term: \"settings\", grade: \"strong\" },\n { term: \"options\", grade: \"moderate\" },\n { term: \"env\", grade: \"weak\" },\n { term: \"environment\", grade: \"weak\" },\n ],\n },\n {\n term: \"environment\",\n synonyms: [\n { term: \"env\", grade: \"strong\" },\n { term: \"config\", grade: \"moderate\" },\n { term: \"settings\", grade: \"weak\" },\n ],\n },\n\n // === Testing ===\n {\n term: \"test\",\n synonyms: [\n { term: \"spec\", grade: \"strong\" },\n { term: \"unittest\", grade: \"strong\" },\n { term: \"check\", grade: \"moderate\" },\n { term: \"verify\", grade: \"weak\" },\n ],\n },\n {\n term: \"mock\",\n synonyms: [\n { term: \"stub\", grade: \"strong\" },\n { term: \"fake\", grade: \"strong\" },\n { term: \"spy\", grade: \"moderate\" },\n { term: \"double\", grade: \"weak\" },\n ],\n },\n\n // === Async & Events ===\n {\n term: \"async\",\n synonyms: [\n { term: \"asynchronous\", grade: \"strong\" },\n { term: \"await\", grade: \"moderate\" },\n { term: \"promise\", grade: \"moderate\" },\n ],\n },\n {\n term: \"callback\",\n synonyms: [\n { term: \"handler\", grade: \"strong\" },\n { term: \"listener\", grade: \"moderate\" },\n { term: \"hook\", grade: \"moderate\" },\n ],\n },\n {\n term: \"event\",\n synonyms: [\n { term: \"emit\", grade: \"moderate\" },\n { term: \"trigger\", grade: \"moderate\" },\n { term: \"signal\", grade: \"weak\" },\n { term: \"message\", grade: \"weak\" },\n ],\n },\n\n // === Utilities ===\n {\n term: \"util\",\n synonyms: [\n { term: \"utility\", grade: \"strong\" },\n { term: \"utils\", grade: \"strong\" },\n { term: \"helper\", grade: \"strong\" },\n { term: \"common\", grade: \"weak\" },\n ],\n },\n {\n term: \"helper\",\n synonyms: [\n { term: \"util\", grade: \"strong\" },\n { term: \"utility\", grade: \"strong\" },\n { term: \"support\", grade: \"weak\" },\n ],\n },\n {\n term: \"parse\",\n synonyms: [\n { term: \"decode\", grade: \"moderate\" },\n { term: \"deserialize\", grade: \"moderate\" },\n { term: \"extract\", grade: \"weak\" },\n ],\n },\n {\n term: \"serialize\",\n synonyms: [\n { term: \"encode\", grade: \"moderate\" },\n { term: \"stringify\", grade: \"moderate\" },\n { term: \"convert\", grade: \"weak\" },\n ],\n },\n\n // === Common Verbs ===\n {\n term: \"get\",\n synonyms: [\n { term: \"fetch\", grade: \"strong\" },\n { term: \"retrieve\", grade: \"strong\" },\n { term: \"find\", grade: \"moderate\" },\n { term: \"load\", grade: \"moderate\" },\n ],\n },\n {\n term: \"set\",\n synonyms: [\n { term: \"assign\", grade: \"strong\" },\n { term: \"store\", grade: \"moderate\" },\n { term: \"save\", grade: \"moderate\" },\n ],\n },\n {\n term: \"find\",\n synonyms: [\n { term: \"search\", grade: \"strong\" },\n { term: \"locate\", grade: \"strong\" },\n { term: \"lookup\", grade: \"moderate\" },\n { term: \"get\", grade: \"moderate\" },\n ],\n },\n {\n term: \"create\",\n synonyms: [\n { term: \"make\", grade: \"strong\" },\n { term: \"build\", grade: \"strong\" },\n { term: \"new\", grade: \"moderate\" },\n { term: \"generate\", grade: \"moderate\" },\n ],\n },\n {\n term: \"send\",\n synonyms: [\n { term: \"emit\", grade: \"moderate\" },\n { term: \"dispatch\", grade: \"moderate\" },\n { term: \"post\", grade: \"moderate\" },\n { term: \"transmit\", grade: \"weak\" },\n ],\n },\n {\n term: \"receive\",\n synonyms: [\n { term: \"accept\", grade: \"moderate\" },\n { term: \"handle\", grade: \"moderate\" },\n { term: \"process\", grade: \"weak\" },\n ],\n },\n ],\n};\n\n/**\n * Build a lookup map from a lexicon for fast term lookup.\n */\nfunction buildLookupMap(lexicon: Lexicon): Map<string, SynonymEntry> {\n const map = new Map<string, SynonymEntry>();\n for (const entry of lexicon.entries) {\n map.set(entry.term.toLowerCase(), entry);\n }\n return map;\n}\n\n// Pre-built lookup map for default lexicon\nconst defaultLookupMap = buildLookupMap(DEFAULT_LEXICON);\n\n/**\n * Get synonyms for a term from the lexicon.\n *\n * @param term - The term to look up\n * @param lexicon - The lexicon to use (defaults to DEFAULT_LEXICON)\n * @returns Array of synonyms with grades, or empty array if not found\n */\nexport function getSynonyms(\n term: string,\n lexicon: Lexicon = DEFAULT_LEXICON\n): Synonym[] {\n const lookupMap =\n lexicon === DEFAULT_LEXICON ? defaultLookupMap : buildLookupMap(lexicon);\n const entry = lookupMap.get(term.toLowerCase());\n return entry ? entry.synonyms : [];\n}\n\n/**\n * Tokenize a query into terms.\n * Splits on whitespace and removes common stop words.\n */\nfunction tokenizeQuery(query: string): string[] {\n const stopWords = new Set([\n \"the\",\n \"a\",\n \"an\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"been\",\n \"being\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"will\",\n \"would\",\n \"could\",\n \"should\",\n \"may\",\n \"might\",\n \"must\",\n \"shall\",\n \"can\",\n \"need\",\n \"dare\",\n \"ought\",\n \"used\",\n \"to\",\n \"of\",\n \"in\",\n \"for\",\n \"on\",\n \"with\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"into\",\n \"through\",\n \"during\",\n \"before\",\n \"after\",\n \"above\",\n \"below\",\n \"between\",\n \"under\",\n \"again\",\n \"further\",\n \"then\",\n \"once\",\n \"here\",\n \"there\",\n \"when\",\n \"where\",\n \"why\",\n \"how\",\n \"all\",\n \"each\",\n \"few\",\n \"more\",\n \"most\",\n \"other\",\n \"some\",\n \"such\",\n \"no\",\n \"nor\",\n \"not\",\n \"only\",\n \"own\",\n \"same\",\n \"so\",\n \"than\",\n \"too\",\n \"very\",\n \"just\",\n \"and\",\n \"but\",\n \"if\",\n \"or\",\n \"because\",\n \"until\",\n \"while\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"what\",\n \"which\",\n \"who\",\n \"whom\",\n \"i\",\n \"me\",\n \"my\",\n \"we\",\n \"our\",\n \"you\",\n \"your\",\n \"he\",\n \"him\",\n \"his\",\n \"she\",\n \"her\",\n \"it\",\n \"its\",\n \"they\",\n \"them\",\n \"their\",\n ]);\n\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter((term) => term.length > 0 && !stopWords.has(term));\n}\n\n/**\n * Expand a query using the lexicon.\n *\n * @param query - The original query string\n * @param lexicon - The lexicon to use (defaults to DEFAULT_LEXICON)\n * @param options - Expansion options\n * @returns Expanded query with weights\n */\nexport function expandQuery(\n query: string,\n lexicon: Lexicon = DEFAULT_LEXICON,\n options: ExpansionOptions = {}\n): ExpandedQuery {\n const opts = { ...DEFAULT_EXPANSION_OPTIONS, ...options };\n const originalTerms = tokenizeQuery(query);\n const expandedTerms: ExpandedTerm[] = [];\n const seenTerms = new Set<string>();\n\n // Add original terms\n for (const term of originalTerms) {\n if (term.length >= opts.minTermLength && !seenTerms.has(term)) {\n expandedTerms.push({\n term,\n weight: 1.0,\n source: \"original\",\n });\n seenTerms.add(term);\n }\n }\n\n // Expand terms (single pass for now, depth > 1 not implemented)\n if (opts.maxDepth >= 1) {\n for (const term of originalTerms) {\n if (term.length < opts.minTermLength) continue;\n\n const synonyms = getSynonyms(term, lexicon);\n for (const syn of synonyms) {\n // Skip weak synonyms if not included\n if (syn.grade === \"weak\" && !opts.includeWeak) continue;\n\n // Skip if already seen\n const synLower = syn.term.toLowerCase();\n if (seenTerms.has(synLower)) continue;\n\n // Check max terms limit\n if (expandedTerms.length >= opts.maxTerms) break;\n\n expandedTerms.push({\n term: syn.term,\n weight: EXPANSION_WEIGHTS[syn.grade],\n source: syn.grade,\n expandedFrom: term,\n });\n seenTerms.add(synLower);\n }\n\n // Check max terms limit\n if (expandedTerms.length >= opts.maxTerms) break;\n }\n }\n\n // Build expanded query string\n // Format: \"original terms [synonym1] [synonym2] ...\"\n // Synonyms in brackets indicate they're expansions\n const originalPart = originalTerms.join(\" \");\n const synonymPart = expandedTerms\n .filter((t) => t.source !== \"original\")\n .map((t) => t.term)\n .join(\" \");\n\n const expandedQueryString = synonymPart\n ? `${originalPart} ${synonymPart}`\n : originalPart;\n\n return {\n originalQuery: query,\n originalTerms,\n expandedTerms,\n expandedQueryString,\n wasExpanded: expandedTerms.some((t) => t.source !== \"original\"),\n };\n}\n\n/**\n * Get expansion weights by grade (re-exported for convenience).\n */\nexport { EXPANSION_WEIGHTS };\n\n/**\n * Get default expansion options (re-exported for convenience).\n */\nexport { DEFAULT_EXPANSION_OPTIONS };\n",
|
|
31
31
|
"/**\n * JSON Path Extractor\n *\n * Extracts dot-notation key paths from JSON objects as literals.\n * Used for literal-based indexing of JSON files.\n *\n * @example\n * // user.json: { name: { first: \"john\" } }\n * extractJsonPaths({ name: { first: \"john\" } }, \"user\")\n * // Returns literals for: \"user.name\", \"user.name.first\"\n */\n\nimport type { ExtractedLiteral } from \"../entities/literal\";\n\n/**\n * Extract all key paths from a JSON object as literals.\n * Prefixes all paths with the filename (without extension).\n *\n * @param obj - Parsed JSON object\n * @param fileBasename - Filename without extension (e.g., \"user\" from \"user.json\")\n * @returns Array of literals representing all dot-notation paths\n */\nexport function extractJsonPaths(\n obj: unknown,\n fileBasename: string\n): ExtractedLiteral[] {\n const paths = extractPathsRecursive(obj, fileBasename);\n\n // Convert paths to literals\n return paths.map((path) => ({\n value: path,\n type: \"identifier\" as const,\n matchType: \"definition\" as const,\n }));\n}\n\n/**\n * Recursively extract all dot-notation paths from an object.\n *\n * @param obj - Current object/value being traversed\n * @param prefix - Current path prefix\n * @returns Array of full dot-notation paths\n */\nfunction extractPathsRecursive(obj: unknown, prefix: string): string[] {\n const paths: string[] = [];\n\n if (obj === null || obj === undefined) {\n return paths;\n }\n\n if (Array.isArray(obj)) {\n // For arrays, add indexed paths for each element\n obj.forEach((item, index) => {\n const indexedPrefix = `${prefix}[${index}]`;\n paths.push(indexedPrefix);\n\n // Recurse into array elements if they are objects\n if (item !== null && typeof item === \"object\") {\n paths.push(...extractPathsRecursive(item, indexedPrefix));\n }\n });\n } else if (typeof obj === \"object\") {\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullPath = `${prefix}.${key}`;\n paths.push(fullPath);\n\n // Recurse into nested objects and arrays\n if (value !== null && typeof value === \"object\") {\n paths.push(...extractPathsRecursive(value, fullPath));\n }\n }\n }\n\n return paths;\n}\n\n/**\n * Extract keywords from JSON for BM25 indexing.\n * Extracts both keys and string values.\n *\n * @param obj - Parsed JSON object\n * @returns Array of keywords for BM25 indexing\n */\nexport function extractJsonKeywords(obj: unknown): string[] {\n const keywords = new Set<string>();\n\n const extract = (value: unknown, parentKey?: string): void => {\n if (value === null || value === undefined) {\n return;\n }\n\n if (typeof value === \"string\") {\n // Split camelCase/PascalCase and add words\n const words = value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[\\s_\\-./]+/)\n .filter((w) => w.length > 2);\n words.forEach((w) => keywords.add(w));\n } else if (Array.isArray(value)) {\n value.forEach((item) => extract(item));\n } else if (typeof value === \"object\") {\n for (const [key, val] of Object.entries(\n value as Record<string, unknown>\n )) {\n // Add the key as a keyword\n keywords.add(key.toLowerCase());\n\n // Split camelCase keys\n const keyWords = key\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[\\s_\\-]+/)\n .filter((w) => w.length > 2);\n keyWords.forEach((w) => keywords.add(w));\n\n extract(val, key);\n }\n }\n };\n\n extract(obj);\n return Array.from(keywords);\n}\n",
|
|
32
32
|
"/**\n * Phrase Matching Service\n *\n * Pure functions for content-based phrase matching. This enables\n * exact phrase searches to find results even when semantic/BM25\n * scores are low.\n *\n * @module domain/services/phraseMatch\n */\n\n/**\n * Result of phrase matching analysis.\n */\nexport interface PhraseMatchResult {\n /** Whether the exact query phrase was found in content */\n exactMatch: boolean;\n /** Proportion of query tokens found in content (0-1) */\n coverage: number;\n /** Number of query tokens found in content */\n matchedTokenCount: number;\n /** Total number of tokens in query */\n totalTokenCount: number;\n /** Additive score boost based on match quality */\n boost: number;\n /** Whether this match is significant enough to bypass filters */\n isSignificant: boolean;\n}\n\n/**\n * Constants for phrase matching scoring.\n */\nexport const PHRASE_MATCH_CONSTANTS = {\n /** Major boost for exact phrase match */\n EXACT_PHRASE_BOOST: 0.5,\n /** Boost for high token coverage (80%+) */\n HIGH_COVERAGE_BOOST: 0.2,\n /** Boost for medium token coverage (60%+) */\n MEDIUM_COVERAGE_BOOST: 0.1,\n /** Coverage threshold for \"high\" classification */\n HIGH_COVERAGE_THRESHOLD: 0.8,\n /** Coverage threshold for \"medium\" classification */\n MEDIUM_COVERAGE_THRESHOLD: 0.6,\n /** Minimum query length to consider for exact matching */\n MIN_QUERY_LENGTH: 3,\n} as const;\n\n/**\n * Stop words to filter from query when calculating token coverage.\n * These are common words that don't contribute much to matching quality.\n */\nconst PHRASE_STOP_WORDS = new Set([\n // Articles\n \"a\",\n \"an\",\n \"the\",\n // Prepositions\n \"in\",\n \"on\",\n \"at\",\n \"to\",\n \"for\",\n \"of\",\n \"with\",\n \"by\",\n \"from\",\n \"as\",\n // Conjunctions\n \"and\",\n \"or\",\n \"but\",\n // Question words (keep for exact matching, filter for coverage)\n \"what\",\n \"where\",\n \"when\",\n \"how\",\n \"why\",\n \"which\",\n \"who\",\n // Common verbs\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"been\",\n \"being\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n // Pronouns\n \"i\",\n \"you\",\n \"he\",\n \"she\",\n \"it\",\n \"we\",\n \"they\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n]);\n\n/**\n * Tokenize a string into words for matching.\n * Normalizes to lowercase and filters out punctuation.\n *\n * @param text - Text to tokenize\n * @param filterStopWords - Whether to filter out stop words\n * @returns Array of normalized tokens\n */\nexport function tokenizeForMatching(\n text: string,\n filterStopWords = true\n): string[] {\n if (!text || text.trim() === \"\") {\n return [];\n }\n\n const tokens = text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \") // Replace punctuation with spaces\n .split(/\\s+/)\n .filter((t) => t.length > 1); // Filter single-character tokens\n\n if (filterStopWords) {\n return tokens.filter((t) => !PHRASE_STOP_WORDS.has(t));\n }\n\n return tokens;\n}\n\n/**\n * Calculate phrase match score for content against a query.\n *\n * This function checks:\n * 1. Exact phrase match (query substring in content)\n * 2. Token coverage (what % of query tokens appear in content)\n *\n * @param content - The chunk content to search in\n * @param query - The search query\n * @returns PhraseMatchResult with match details and boost\n *\n * @example\n * const result = calculatePhraseMatch(\n * \"This explains the authentication flow for new users\",\n * \"authentication flow for new users\"\n * );\n * // result.exactMatch = true\n * // result.boost = 0.5 (EXACT_PHRASE_BOOST)\n *\n * @example\n * const result = calculatePhraseMatch(\n * \"User authentication and session flow\",\n * \"authentication flow for users\"\n * );\n * // result.exactMatch = false\n * // result.coverage = 0.75 (3/4 tokens found)\n * // result.boost = 0.1 (MEDIUM_COVERAGE_BOOST)\n */\nexport function calculatePhraseMatch(\n content: string,\n query: string\n): PhraseMatchResult {\n // Handle empty inputs\n if (!content || !query || query.trim().length < PHRASE_MATCH_CONSTANTS.MIN_QUERY_LENGTH) {\n return {\n exactMatch: false,\n coverage: 0,\n matchedTokenCount: 0,\n totalTokenCount: 0,\n boost: 0,\n isSignificant: false,\n };\n }\n\n const contentLower = content.toLowerCase();\n const queryLower = query.toLowerCase().trim();\n\n // 1. Check for exact phrase match\n const exactMatch = contentLower.includes(queryLower);\n\n // 2. Calculate token coverage (filtering stop words for better accuracy)\n const queryTokens = tokenizeForMatching(query, true);\n const matchedTokens = queryTokens.filter((token) =>\n contentLower.includes(token)\n );\n const coverage =\n queryTokens.length > 0 ? matchedTokens.length / queryTokens.length : 0;\n\n // 3. Calculate boost based on match quality\n let boost = 0;\n if (exactMatch) {\n boost = PHRASE_MATCH_CONSTANTS.EXACT_PHRASE_BOOST;\n } else if (coverage >= PHRASE_MATCH_CONSTANTS.HIGH_COVERAGE_THRESHOLD) {\n boost = PHRASE_MATCH_CONSTANTS.HIGH_COVERAGE_BOOST;\n } else if (coverage >= PHRASE_MATCH_CONSTANTS.MEDIUM_COVERAGE_THRESHOLD) {\n boost = PHRASE_MATCH_CONSTANTS.MEDIUM_COVERAGE_BOOST;\n }\n\n // 4. Determine if match is significant enough to bypass filters\n const isSignificant =\n exactMatch || coverage >= PHRASE_MATCH_CONSTANTS.HIGH_COVERAGE_THRESHOLD;\n\n return {\n exactMatch,\n coverage,\n matchedTokenCount: matchedTokens.length,\n totalTokenCount: queryTokens.length,\n boost,\n isSignificant,\n };\n}\n\n/**\n * Quick check if content might contain the query phrase.\n * Useful for early filtering before full phrase matching.\n *\n * @param content - The chunk content\n * @param query - The search query\n * @returns true if exact phrase is found\n */\nexport function hasExactPhrase(content: string, query: string): boolean {\n if (!content || !query || query.trim().length < PHRASE_MATCH_CONSTANTS.MIN_QUERY_LENGTH) {\n return false;\n }\n return content.toLowerCase().includes(query.toLowerCase().trim());\n}\n\n/**\n * Calculate token coverage between content and query.\n * Faster than full phrase matching when only coverage is needed.\n *\n * @param content - The chunk content\n * @param query - The search query\n * @returns Coverage ratio (0-1)\n */\nexport function calculateTokenCoverage(content: string, query: string): number {\n if (!content || !query) {\n return 0;\n }\n\n const contentLower = content.toLowerCase();\n const queryTokens = tokenizeForMatching(query, true);\n\n if (queryTokens.length === 0) {\n return 0;\n }\n\n const matchedCount = queryTokens.filter((token) =>\n contentLower.includes(token)\n ).length;\n\n return matchedCount / queryTokens.length;\n}\n\n",
|
|
33
|
-
"/**\n *
|
|
33
|
+
"/**\n * Simple Search Service\n *\n * Provides grep-like exact text matching across files.\n * This is a pure domain service - no file I/O, just algorithms.\n *\n * Used for:\n * - Finding exact occurrences of identifiers (SCREAMING_SNAKE, camelCase)\n * - Providing a guaranteed \"exact match\" track separate from semantic search\n * - Context lines around matches (+/- 1 line)\n */\n\nimport type {\n ExactMatchOccurrence,\n ExactMatchFile,\n ExactMatchResults,\n} from \"../entities/searchResult\";\n\n/**\n * Patterns that indicate a query is a programming identifier\n * (should trigger simple search)\n */\nconst IDENTIFIER_PATTERNS = {\n // SCREAMING_SNAKE_CASE: AUTH_SERVICE_GRPC_URL\n screamingSnake: /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$/,\n\n // camelCase: getServiceUrl\n camelCase: /^[a-z][a-z0-9]*(?:[A-Z][a-zA-Z0-9]*)+$/,\n\n // PascalCase: ServiceRegistry\n pascalCase: /^[A-Z][a-z]+(?:[A-Z][a-z0-9]*)+$/,\n\n // snake_case: get_service_url\n snakeCase: /^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/,\n\n // kebab-case: get-service-url\n kebabCase: /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/,\n};\n\n/**\n * Check if a query string looks like a programming identifier.\n * These queries should trigger simple search in addition to semantic search.\n *\n * @param query - The search query\n * @returns true if the query looks like an identifier\n */\nexport function isIdentifierQuery(query: string): boolean {\n const trimmed = query.trim();\n\n // Check for explicit quoting (backticks or double quotes)\n if (\n (trimmed.startsWith(\"`\") && trimmed.endsWith(\"`\")) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))\n ) {\n return true;\n }\n\n // Check against identifier patterns\n for (const pattern of Object.values(IDENTIFIER_PATTERNS)) {\n if (pattern.test(trimmed)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Extract the literal to search for from a query.\n * Removes quoting if present.\n *\n * @param query - The search query\n * @returns The literal to search for\n */\nexport function extractSearchLiteral(query: string): string {\n const trimmed = query.trim();\n\n // Remove backticks\n if (trimmed.startsWith(\"`\") && trimmed.endsWith(\"`\")) {\n return trimmed.slice(1, -1);\n }\n\n // Remove double quotes\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n\n return trimmed;\n}\n\n/**\n * Find all occurrences of a literal in file content.\n *\n * @param content - The file content to search\n * @param literal - The exact string to find\n * @param options - Search options\n * @returns Array of match occurrences with context\n */\nexport function findOccurrences(\n content: string,\n literal: string,\n options: {\n /** Maximum occurrences to return per file */\n maxOccurrences?: number;\n /** Whether to do case-insensitive matching */\n caseInsensitive?: boolean;\n } = {}\n): ExactMatchOccurrence[] {\n const { maxOccurrences = 10, caseInsensitive = false } = options;\n const occurrences: ExactMatchOccurrence[] = [];\n\n const lines = content.split(\"\\n\");\n const searchContent = caseInsensitive ? content.toLowerCase() : content;\n const searchLiteral = caseInsensitive ? literal.toLowerCase() : literal;\n\n let currentIndex = 0;\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum];\n const searchLine = caseInsensitive ? line.toLowerCase() : line;\n\n let columnStart = 0;\n\n while (true) {\n const column = searchLine.indexOf(searchLiteral, columnStart);\n\n if (column === -1) break;\n\n occurrences.push({\n line: lineNum + 1, // 1-indexed\n column,\n lineContent: line,\n contextBefore: lineNum > 0 ? lines[lineNum - 1] : undefined,\n contextAfter:\n lineNum < lines.length - 1 ? lines[lineNum + 1] : undefined,\n });\n\n if (occurrences.length >= maxOccurrences) {\n return occurrences;\n }\n\n // Move past this match to find more on the same line\n columnStart = column + 1;\n }\n\n currentIndex += line.length + 1; // +1 for newline\n }\n\n return occurrences;\n}\n\n/**\n * Search multiple files for exact matches of a literal.\n *\n * @param files - Map of filepath to content\n * @param literal - The exact string to find\n * @param options - Search options\n * @returns Exact match results\n */\nexport function searchFiles(\n files: Map<string, string>,\n literal: string,\n options: {\n /** Maximum files to return */\n maxFiles?: number;\n /** Maximum occurrences per file */\n maxOccurrencesPerFile?: number;\n /** Case-insensitive matching */\n caseInsensitive?: boolean;\n } = {}\n): ExactMatchResults {\n const {\n maxFiles = 20,\n maxOccurrencesPerFile = 5,\n caseInsensitive = false,\n } = options;\n\n const matchingFiles: ExactMatchFile[] = [];\n let totalMatches = 0;\n let totalFilesWithMatches = 0;\n\n for (const [filepath, content] of files) {\n const occurrences = findOccurrences(content, literal, {\n maxOccurrences: maxOccurrencesPerFile,\n caseInsensitive,\n });\n\n if (occurrences.length > 0) {\n totalFilesWithMatches++;\n\n // Count actual matches (may be more than returned occurrences)\n const searchContent = caseInsensitive\n ? content.toLowerCase()\n : content;\n const searchLiteral = caseInsensitive\n ? literal.toLowerCase()\n : literal;\n let matchCount = 0;\n let index = 0;\n while ((index = searchContent.indexOf(searchLiteral, index)) !== -1) {\n matchCount++;\n index += 1;\n }\n\n totalMatches += matchCount;\n\n if (matchingFiles.length < maxFiles) {\n matchingFiles.push({\n filepath,\n occurrences,\n matchCount,\n });\n }\n }\n }\n\n // Sort by match count (most matches first)\n matchingFiles.sort((a, b) => b.matchCount - a.matchCount);\n\n return {\n query: literal,\n files: matchingFiles,\n totalMatches,\n totalFiles: totalFilesWithMatches,\n truncated: totalFilesWithMatches > maxFiles,\n };\n}\n\n/**\n * Extract all identifier-like literals from content.\n * Used during indexing to build a literal index for plain text files.\n *\n * @param content - File content to extract from\n * @returns Array of unique identifier literals found\n */\nexport function extractIdentifiersFromContent(content: string): string[] {\n const identifiers = new Set<string>();\n\n // SCREAMING_SNAKE_CASE\n const screamingMatches = content.matchAll(\n /\\b([A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+)\\b/g\n );\n for (const match of screamingMatches) {\n identifiers.add(match[1]);\n }\n\n // camelCase\n const camelMatches = content.matchAll(\n /\\b([a-z][a-z0-9]*(?:[A-Z][a-zA-Z0-9]*)+)\\b/g\n );\n for (const match of camelMatches) {\n identifiers.add(match[1]);\n }\n\n // PascalCase (but not single words that are just capitalized)\n const pascalMatches = content.matchAll(\n /\\b([A-Z][a-z]+(?:[A-Z][a-z0-9]*)+)\\b/g\n );\n for (const match of pascalMatches) {\n identifiers.add(match[1]);\n }\n\n // snake_case\n const snakeMatches = content.matchAll(\n /\\b([a-z][a-z0-9]*(?:_[a-z0-9]+)+)\\b/g\n );\n for (const match of snakeMatches) {\n identifiers.add(match[1]);\n }\n\n // kebab-case (but not in URLs or file paths)\n const kebabMatches = content.matchAll(\n /(?<![/:.])\\b([a-z][a-z0-9]*(?:-[a-z0-9]+)+)\\b(?![/:])/g\n );\n for (const match of kebabMatches) {\n identifiers.add(match[1]);\n }\n\n return Array.from(identifiers);\n}\n\n/**\n * Check if a file should be included in simple search based on its content.\n * Excludes binary files and very large files.\n *\n * @param content - File content\n * @param filepath - File path for extension checking\n * @returns true if file should be searchable\n */\nexport function isSearchableContent(content: string, filepath: string): boolean {\n // Skip very large files (> 1MB)\n if (content.length > 1024 * 1024) {\n return false;\n }\n\n // Check for binary content (null bytes)\n if (content.includes(\"\\0\")) {\n return false;\n }\n\n // Skip common binary extensions\n const binaryExtensions = [\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".ico\", \".webp\",\n \".pdf\", \".zip\", \".tar\", \".gz\", \".rar\",\n \".exe\", \".dll\", \".so\", \".dylib\",\n \".woff\", \".woff2\", \".ttf\", \".eot\",\n \".mp3\", \".mp4\", \".wav\", \".avi\",\n ];\n const ext = filepath.toLowerCase().slice(filepath.lastIndexOf(\".\"));\n if (binaryExtensions.includes(ext)) {\n return false;\n }\n\n return true;\n}\n\n",
|
|
34
|
+
"/**\n * Chunk Context Preparation Service\n * \n * Provides a unified utility for preparing chunk content with path context\n * for embedding. This ensures consistent behavior across all indexing modules.\n * \n * The path context helps embeddings understand the structural location of code,\n * improving search relevance for queries that reference file paths or domains.\n */\n\nimport * as path from 'path';\nimport { parsePathContext, formatPathContextForEmbedding, extractPathKeywords } from './keywords';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for preparing a chunk for embedding.\n */\nexport interface ChunkContextOptions {\n /** Relative file path (from project root) */\n filepath: string;\n \n /** The chunk content to embed */\n content: string;\n \n /** Optional name for the chunk (e.g., function name, heading) */\n name?: string;\n \n /** Optional documentation comment (e.g., JSDoc, docstring) */\n docComment?: string;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Segments that should be filtered from path context as they're too generic.\n */\nconst GENERIC_SEGMENTS = new Set([\n 'src',\n 'lib',\n 'app',\n 'index',\n 'dist',\n 'build',\n 'out',\n 'node_modules',\n]);\n\n/**\n * Minimum segment length to include in path context.\n */\nconst MIN_SEGMENT_LENGTH = 2;\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Prepare chunk content for embedding by injecting path context.\n * \n * This function should be used by ALL indexing modules to ensure consistent\n * path context injection. The path context is prepended to the content to\n * give the embedding model awareness of the file's location in the project.\n * \n * Format: `[domain layer segment1 segment2] [name:] [docComment] content`\n * \n * @param options - Chunk context options\n * @returns Content string ready for embedding\n * \n * @example\n * ```typescript\n * const embeddingContent = prepareChunkForEmbedding({\n * filepath: 'services/dynamodb/streams/handler.ts',\n * content: 'export function processStream() { ... }',\n * name: 'processStream',\n * });\n * // Returns: \"[dynamodb service streams] processStream: export function processStream() { ... }\"\n * ```\n */\nexport function prepareChunkForEmbedding(options: ChunkContextOptions): string {\n const { filepath, content, name, docComment } = options;\n \n // Parse path context from relative filepath\n const pathContext = parsePathContext(filepath);\n \n // Format path context for embedding (produces something like \"[domain layer segment1 segment2]\")\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n \n // Build the embedding content\n const parts: string[] = [];\n \n // 1. Add path context prefix\n if (pathPrefix) {\n parts.push(pathPrefix);\n }\n \n // 2. Add filename (without extension) for additional context\n const filename = path.basename(filepath);\n const filenameWithoutExt = filename.replace(/\\.[^.]+$/, '');\n if (filenameWithoutExt && filenameWithoutExt.length > MIN_SEGMENT_LENGTH) {\n // Don't duplicate if filename is already in path prefix\n const pathPrefixLower = pathPrefix.toLowerCase();\n if (!pathPrefixLower.includes(filenameWithoutExt.toLowerCase())) {\n parts.push(filenameWithoutExt);\n }\n }\n \n // 3. Add name/heading prefix if provided\n if (name) {\n parts.push(`${name}:`);\n }\n \n // 4. Add doc comment if provided\n if (docComment) {\n parts.push(docComment);\n }\n \n // 5. Add the actual content\n parts.push(content);\n \n return parts.join(' ');\n}\n\n/**\n * Extract path keywords for inclusion in FileSummary.\n * \n * This provides a deduplicated list of keywords extracted from the file path,\n * suitable for BM25 and other keyword-based search mechanisms.\n * \n * @param filepath - Relative file path\n * @returns Array of deduplicated lowercase keywords\n * \n * @example\n * ```typescript\n * const keywords = extractPathKeywordsForFileSummary('services/dynamodb/streams/handler.ts');\n * // Returns: ['services', 'dynamodb', 'streams', 'handler']\n * ```\n */\nexport function extractPathKeywordsForFileSummary(filepath: string): string[] {\n // Use the existing extractPathKeywords function\n const keywords = extractPathKeywords(filepath);\n \n // Filter out generic segments that don't add search value\n const filtered = keywords.filter(k => \n k.length >= MIN_SEGMENT_LENGTH && !GENERIC_SEGMENTS.has(k)\n );\n \n // Deduplicate and return\n return [...new Set(filtered)];\n}\n\n/**\n * Get path context data for inclusion in FileSummary.\n * \n * This returns the parsed path context that can be stored in FileSummary\n * for later use during search scoring.\n * \n * @param filepath - Relative file path\n * @returns Path context object\n */\nexport function getPathContextForFileSummary(filepath: string): {\n segments: string[];\n layer?: string;\n domain?: string;\n depth: number;\n} {\n const pathContext = parsePathContext(filepath);\n return {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n };\n}\n\n",
|
|
35
|
+
"/**\n * Domain Services\n *\n * Pure algorithms and business logic with no external dependencies.\n * These services operate only on domain entities and primitive data.\n */\n\n// BM25 keyword search\nexport {\n BM25Index,\n tokenize,\n normalizeScore,\n type BM25Document,\n type BM25Result,\n type BM25SerializedData,\n} from \"./bm25\";\n\n// Keyword extraction\nexport {\n extractKeywords,\n extractPathKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n COMMON_KEYWORDS,\n type PathContext,\n} from \"./keywords\";\n\n// Vector similarity\nexport { cosineSimilarity, euclideanDistance } from \"./similarity\";\n\n// Query intent detection\nexport {\n detectQueryIntent,\n extractQueryTerms,\n calculateFileTypeBoost,\n isSourceCodeFile,\n isDocFile,\n isDataFile,\n IMPLEMENTATION_TERMS,\n DOCUMENTATION_TERMS,\n SOURCE_CODE_EXTENSIONS,\n DOC_EXTENSIONS,\n DATA_EXTENSIONS,\n type QueryIntent,\n} from \"./queryIntent\";\n\n// Text chunking\nexport {\n createLineBasedChunks,\n createSingleChunk,\n generateChunkId,\n DEFAULT_CHUNK_SIZE,\n DEFAULT_OVERLAP,\n type TextChunk,\n type ChunkingOptions,\n} from \"./chunking\";\n\n// Literal boosting - Query parsing\nexport { parseQueryLiterals } from \"./queryLiteralParser\";\n\n// Literal boosting - Code extraction\nexport {\n extractLiterals,\n extractLiteralsWithReferences,\n extractVocabulary,\n extractQueryVocabulary,\n} from \"./literalExtractor\";\n\n// Literal boosting - Scoring\nexport {\n calculateLiteralMultiplier,\n calculateMaxMultiplier,\n calculateLiteralContribution,\n calculateVocabularyMatch,\n applyLiteralBoost,\n mergeWithLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n type LiteralScoreContribution,\n type VocabularyMatchResult,\n type MergeInput,\n type MergeOutput,\n} from \"./literalScorer\";\n\n// Structured Semantic Expansion - Query expansion with synonyms\nexport {\n getSynonyms,\n expandQuery,\n DEFAULT_LEXICON,\n EXPANSION_WEIGHTS,\n DEFAULT_EXPANSION_OPTIONS,\n} from \"./lexicon\";\n\n// JSON path extraction for literal indexing\nexport { extractJsonPaths, extractJsonKeywords } from \"./jsonPathExtractor\";\n\n// Introspection - File metadata extraction\nexport {\n introspectFile,\n findNearestReadme,\n introspectionToKeywords,\n detectScopeFromName,\n findProjectForFile,\n calculateIntrospectionBoost,\n type IntrospectFileOptions,\n} from \"./introspection\";\n\n// Configuration validation\nexport {\n validateConfig,\n formatValidationIssues,\n type ValidationIssue,\n type ValidationResult,\n} from \"./configValidator\";\n\n// Content phrase matching\nexport {\n calculatePhraseMatch,\n hasExactPhrase,\n calculateTokenCoverage,\n tokenizeForMatching,\n PHRASE_MATCH_CONSTANTS,\n type PhraseMatchResult,\n} from \"./phraseMatch\";\n\n// Simple search (grep-like exact matching)\nexport {\n isIdentifierQuery,\n extractSearchLiteral,\n findOccurrences,\n searchFiles,\n extractIdentifiersFromContent,\n isSearchableContent,\n} from \"./simpleSearch\";\n\n// Chunk context preparation (unified path context injection)\nexport {\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n type ChunkContextOptions,\n} from \"./chunkContext\";\n",
|
|
34
36
|
"/**\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 * This parser is specifically for TypeScript/JavaScript files.\n * For other file types, use the generic chunking in domain/services/chunking.\n */\n\nimport * as ts from \"typescript\";\nimport type { ChunkType } from \"../../../domain/entities\";\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 TypeScript/JavaScript code into semantic chunks.\n *\n * Uses the TypeScript Compiler API for accurate AST-based parsing.\n * Returns chunks for functions, classes, interfaces, types, enums, and exported variables.\n *\n * @param content - The source code content\n * @param filepath - The file path (used for JSX detection)\n * @returns Array of parsed chunks\n */\nexport function parseTypeScriptCode(\n content: string,\n filepath: string\n): ParsedChunk[] {\n return parseTypeScript(content, filepath);\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): {\n startLine: number;\n endLine: number;\n } {\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 (\n modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false\n );\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.map((doc) => doc.getText(sourceFile)).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 (\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\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: \"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 (\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\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, create a single file chunk\n // (This can happen for files with only top-level statements or imports)\n if (chunks.length === 0) {\n const lines = content.split(\"\\n\");\n return [\n {\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n },\n ];\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(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n",
|
|
35
37
|
"/**\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",
|
|
36
38
|
"/**\n * Symbolic Index Storage\n *\n * Manages the keyword-based index for fast file filtering.\n * Handles file I/O for persisting index data.\n *\n * Structure:\n * .raggrep/index/<module>/symbolic/\n * ├── _meta.json (BM25 statistics + serialized BM25 data)\n * └── <filepath>.json (per-file summaries)\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { BM25Index, tokenize } from \"../../domain/services/bm25\";\nimport { extractPathKeywords } from \"../../domain/services/keywords\";\nimport type { FileSummary, SymbolicIndexMeta } from \"../../domain/entities\";\n\n/**\n * Extended metadata that includes serialized BM25 index\n */\ninterface SymbolicIndexMetaWithBM25 extends SymbolicIndexMeta {\n /** Serialized BM25 index data for fast loading */\n bm25Serialized?: {\n documents: Record<string, string[]>;\n avgDocLength: number;\n documentFrequencies: Record<string, number>;\n totalDocs: number;\n };\n}\n\n/**\n * Symbolic Index Manager\n *\n * Manages the keyword-based index for fast file filtering.\n * Supports incremental updates to avoid full rebuilds.\n */\nexport class SymbolicIndex {\n private meta: SymbolicIndexMetaWithBM25 | null = null;\n private fileSummaries: Map<string, FileSummary> = new Map();\n private bm25Index: BM25Index | null = null;\n private symbolicPath: string;\n private moduleId: string;\n\n constructor(indexDir: string, moduleId: string) {\n this.symbolicPath = path.join(indexDir, \"index\", moduleId, \"symbolic\");\n this.moduleId = moduleId;\n }\n\n /**\n * Initialize or load the symbolic index\n */\n async initialize(): Promise<void> {\n try {\n await this.load();\n } catch {\n // Create empty metadata\n this.meta = {\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n moduleId: this.moduleId,\n fileCount: 0,\n bm25Data: {\n avgDocLength: 0,\n documentFrequencies: {},\n totalDocs: 0,\n },\n };\n this.bm25Index = new BM25Index();\n }\n }\n\n /**\n * Add or update a file summary (for batch operations, use with buildBM25Index)\n */\n addFile(summary: FileSummary): void {\n this.fileSummaries.set(summary.filepath, summary);\n }\n\n /**\n * Add or update a file summary with incremental BM25 update.\n * Use this for incremental indexing instead of addFile + buildBM25Index.\n */\n addFileIncremental(summary: FileSummary): void {\n const filepath = summary.filepath;\n const oldSummary = this.fileSummaries.get(filepath);\n\n // Update the summary\n this.fileSummaries.set(filepath, summary);\n\n // Update BM25 incrementally\n if (this.bm25Index) {\n // If file existed before, remove its old BM25 entry\n if (oldSummary) {\n this.bm25Index.removeDocument(filepath);\n }\n\n // Add the new entry\n const tokens = this.getTokensForSummary(filepath, summary);\n this.bm25Index.addDocument(filepath, tokens);\n }\n }\n\n /**\n * Remove a file from the index (for batch operations)\n */\n removeFile(filepath: string): boolean {\n return this.fileSummaries.delete(filepath);\n }\n\n /**\n * Remove a file from the index with incremental BM25 update.\n * Use this for incremental indexing.\n */\n removeFileIncremental(filepath: string): boolean {\n const existed = this.fileSummaries.delete(filepath);\n\n // Update BM25 incrementally\n if (existed && this.bm25Index) {\n this.bm25Index.removeDocument(filepath);\n }\n\n return existed;\n }\n\n /**\n * Get tokens for a file summary (for BM25 indexing)\n */\n private getTokensForSummary(filepath: string, summary: FileSummary): string[] {\n const content = [\n ...summary.keywords,\n ...summary.exports,\n ...extractPathKeywords(filepath),\n ].join(\" \");\n return tokenize(content);\n }\n\n /**\n * Build BM25 index from file summaries (full rebuild)\n */\n buildBM25Index(): void {\n this.bm25Index = new BM25Index();\n\n // Add each file's keywords as a document\n for (const [filepath, summary] of this.fileSummaries) {\n const tokens = this.getTokensForSummary(filepath, summary);\n this.bm25Index.addDocument(filepath, tokens);\n }\n\n // Update metadata\n if (this.meta) {\n this.meta.fileCount = this.fileSummaries.size;\n this.meta.bm25Data.totalDocs = this.fileSummaries.size;\n }\n }\n\n /**\n * Find candidate files using BM25 keyword search\n */\n findCandidates(query: string, maxCandidates: number = 20): string[] {\n if (!this.bm25Index) {\n return Array.from(this.fileSummaries.keys());\n }\n\n const results = this.bm25Index.search(query, maxCandidates);\n return results.map((r) => r.id);\n }\n\n /**\n * Get all file paths in the index\n */\n getAllFiles(): string[] {\n return Array.from(this.fileSummaries.keys());\n }\n\n /**\n * Get summary for a specific file\n */\n getFileSummary(filepath: string): FileSummary | undefined {\n return this.fileSummaries.get(filepath);\n }\n\n /**\n * Save the index to disk (per-file structure with BM25 serialization)\n */\n async save(): Promise<void> {\n if (!this.meta) throw new Error(\"Index not initialized\");\n\n // Update metadata\n this.meta.lastUpdated = new Date().toISOString();\n this.meta.fileCount = this.fileSummaries.size;\n\n // Serialize BM25 index for fast loading\n if (this.bm25Index) {\n this.meta.bm25Serialized = this.bm25Index.serialize();\n }\n\n // Ensure symbolic directory exists\n await fs.mkdir(this.symbolicPath, { recursive: true });\n\n // Save metadata (includes serialized BM25)\n const metaPath = path.join(this.symbolicPath, \"_meta.json\");\n await fs.writeFile(metaPath, JSON.stringify(this.meta, null, 2));\n\n // Save each file summary\n for (const [filepath, summary] of this.fileSummaries) {\n const summaryPath = this.getFileSummaryPath(filepath);\n await fs.mkdir(path.dirname(summaryPath), { recursive: true });\n await fs.writeFile(summaryPath, JSON.stringify(summary, null, 2));\n }\n }\n\n /**\n * Save only the updated file summaries (for incremental saves)\n * @param filepaths - List of filepaths that were updated\n */\n async saveIncremental(filepaths: string[]): Promise<void> {\n if (!this.meta) throw new Error(\"Index not initialized\");\n\n // Update metadata\n this.meta.lastUpdated = new Date().toISOString();\n this.meta.fileCount = this.fileSummaries.size;\n\n // Serialize BM25 index\n if (this.bm25Index) {\n this.meta.bm25Serialized = this.bm25Index.serialize();\n }\n\n // Ensure symbolic directory exists\n await fs.mkdir(this.symbolicPath, { recursive: true });\n\n // Save metadata (includes serialized BM25)\n const metaPath = path.join(this.symbolicPath, \"_meta.json\");\n await fs.writeFile(metaPath, JSON.stringify(this.meta, null, 2));\n\n // Save only the updated file summaries\n for (const filepath of filepaths) {\n const summary = this.fileSummaries.get(filepath);\n if (summary) {\n const summaryPath = this.getFileSummaryPath(filepath);\n await fs.mkdir(path.dirname(summaryPath), { recursive: true });\n await fs.writeFile(summaryPath, JSON.stringify(summary, null, 2));\n }\n }\n }\n\n /**\n * Load the index from disk\n */\n async load(): Promise<void> {\n // Load metadata\n const metaPath = path.join(this.symbolicPath, \"_meta.json\");\n const metaContent = await fs.readFile(metaPath, \"utf-8\");\n this.meta = JSON.parse(metaContent);\n\n // Load all file summaries by walking the symbolic directory\n this.fileSummaries.clear();\n await this.loadFileSummariesRecursive(this.symbolicPath);\n\n // Try to load BM25 from serialized data (fast path)\n if (this.meta?.bm25Serialized) {\n this.bm25Index = BM25Index.deserialize(this.meta.bm25Serialized);\n } else {\n // Fall back to rebuilding if no serialized data\n this.buildBM25Index();\n }\n }\n\n /**\n * Recursively load file summaries from the symbolic directory\n */\n private async loadFileSummariesRecursive(dir: 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 this.loadFileSummariesRecursive(fullPath);\n } else if (entry.name.endsWith(\".json\") && entry.name !== \"_meta.json\") {\n try {\n const content = await fs.readFile(fullPath, \"utf-8\");\n const summary = JSON.parse(content) as FileSummary;\n if (summary.filepath) {\n this.fileSummaries.set(summary.filepath, summary);\n }\n } catch {\n // Skip invalid files\n }\n }\n }\n } catch {\n // Directory doesn't exist yet\n }\n }\n\n /**\n * Get the path for a file summary\n */\n private getFileSummaryPath(filepath: string): string {\n const jsonPath = filepath.replace(/\\.[^.]+$/, \".json\");\n return path.join(this.symbolicPath, jsonPath);\n }\n\n /**\n * Delete a file summary from disk\n */\n async deleteFileSummary(filepath: string): Promise<void> {\n try {\n await fs.unlink(this.getFileSummaryPath(filepath));\n } catch {\n // Ignore if file doesn't exist\n }\n this.fileSummaries.delete(filepath);\n }\n\n /**\n * Check if the index exists on disk\n */\n async exists(): Promise<boolean> {\n try {\n const metaPath = path.join(this.symbolicPath, \"_meta.json\");\n await fs.access(metaPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the number of indexed files\n */\n get size(): number {\n return this.fileSummaries.size;\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.fileSummaries.clear();\n if (this.meta) {\n this.meta.fileCount = 0;\n this.meta.bm25Data = {\n avgDocLength: 0,\n documentFrequencies: {},\n totalDocs: 0,\n };\n }\n this.bm25Index = new BM25Index();\n }\n}\n\n/**\n * Get the symbolic index path for a module\n */\nexport function getSymbolicPath(\n rootDir: string,\n moduleId: string,\n indexDir: string = \".raggrep\"\n): string {\n return path.join(rootDir, indexDir, \"index\", moduleId, \"symbolic\");\n}\n\n",
|
|
37
39
|
"/**\n * Literal Index Storage\n *\n * Manages the literal index for exact-match boosting.\n * Handles file I/O for persisting literal data.\n *\n * Structure:\n * .raggrep/index/<module>/literals/\n * └── _index.json (literal → chunk mappings)\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type {\n ExtractedLiteral,\n DetectedLiteral,\n LiteralMatch,\n LiteralIndexData,\n LiteralIndexEntry,\n LiteralType,\n LiteralMatchType,\n} from \"../../domain/entities/literal\";\n\n/**\n * Literal Index Manager\n *\n * Manages the literal index for exact-match boosting.\n * Provides O(1) lookup for literal matches.\n *\n * Now also supports vocabulary-based search for partial matching:\n * - Store vocabulary words extracted from literals\n * - Search by vocabulary words to find partial matches\n */\nexport class LiteralIndex {\n private indexPath: string;\n private moduleId: string;\n\n /**\n * In-memory index: lowercase literal value → entries\n */\n private entries: Map<string, LiteralIndexEntry[]> = new Map();\n\n /**\n * Vocabulary index: vocabulary word → literal values that contain it\n * Used for partial matching (e.g., \"user\" → [\"getUserById\", \"fetchUserData\"])\n */\n private vocabularyIndex: Map<string, Set<string>> = new Map();\n\n /**\n * Schema version for compatibility checking.\n */\n private static readonly VERSION = \"1.1.0\"; // Updated for vocabulary support\n\n constructor(indexDir: string, moduleId: string) {\n this.indexPath = path.join(indexDir, \"index\", moduleId, \"literals\");\n this.moduleId = moduleId;\n }\n\n /**\n * Initialize the literal index.\n * Attempts to load from disk, creates empty index if not found.\n */\n async initialize(): Promise<void> {\n try {\n await this.load();\n this.rebuildVocabularyIndex();\n } catch {\n // Create empty index\n this.entries = new Map();\n this.vocabularyIndex = new Map();\n }\n }\n\n /**\n * Rebuild the vocabulary index from entries.\n * Called after loading from disk.\n */\n private rebuildVocabularyIndex(): void {\n this.vocabularyIndex.clear();\n\n for (const [literalKey, entries] of this.entries) {\n for (const entry of entries) {\n if (entry.vocabulary) {\n for (const word of entry.vocabulary) {\n const wordLower = word.toLowerCase();\n const literals = this.vocabularyIndex.get(wordLower) || new Set();\n literals.add(literalKey);\n this.vocabularyIndex.set(wordLower, literals);\n }\n }\n }\n }\n }\n\n /**\n * Add literals from a chunk to the index.\n *\n * @param chunkId - Unique identifier for the chunk\n * @param filepath - Path to the file containing the chunk\n * @param literals - Extracted literals from the chunk\n */\n addLiterals(\n chunkId: string,\n filepath: string,\n literals: ExtractedLiteral[]\n ): void {\n for (const literal of literals) {\n const key = literal.value.toLowerCase();\n const existingEntries = this.entries.get(key) || [];\n\n // Check if this chunk already has an entry for this literal\n const existingIndex = existingEntries.findIndex(\n (e) => e.chunkId === chunkId\n );\n\n const newEntry: LiteralIndexEntry = {\n chunkId,\n filepath,\n originalCasing: literal.value,\n type: literal.type,\n matchType: literal.matchType,\n vocabulary: literal.vocabulary,\n };\n\n // Update vocabulary index\n if (literal.vocabulary) {\n for (const word of literal.vocabulary) {\n const wordLower = word.toLowerCase();\n const literals = this.vocabularyIndex.get(wordLower) || new Set();\n literals.add(key);\n this.vocabularyIndex.set(wordLower, literals);\n }\n }\n\n if (existingIndex >= 0) {\n // Update existing entry (prefer definition over reference)\n const existing = existingEntries[existingIndex];\n if (shouldReplaceMatchType(existing.matchType, literal.matchType)) {\n existingEntries[existingIndex] = newEntry;\n }\n } else {\n existingEntries.push(newEntry);\n }\n\n this.entries.set(key, existingEntries);\n }\n }\n\n /**\n * Remove all literals for a chunk.\n *\n * @param chunkId - Chunk ID to remove\n */\n removeChunk(chunkId: string): void {\n for (const [key, entries] of this.entries) {\n const filtered = entries.filter((e) => e.chunkId !== chunkId);\n if (filtered.length === 0) {\n this.entries.delete(key);\n } else if (filtered.length !== entries.length) {\n this.entries.set(key, filtered);\n }\n }\n }\n\n /**\n * Remove all literals for a file.\n * Used when a file is re-indexed or deleted.\n *\n * @param filepath - Filepath to remove all literals for\n * @returns Number of literals removed\n */\n removeFile(filepath: string): number {\n let removed = 0;\n for (const [key, entries] of this.entries) {\n const filtered = entries.filter((e) => e.filepath !== filepath);\n const removedCount = entries.length - filtered.length;\n if (removedCount > 0) {\n removed += removedCount;\n if (filtered.length === 0) {\n this.entries.delete(key);\n } else {\n this.entries.set(key, filtered);\n }\n }\n }\n return removed;\n }\n\n /**\n * Find matches for query literals.\n *\n * @param queryLiterals - Literals detected in the query\n * @returns Array of matches with chunk IDs and filepaths\n */\n findMatches(queryLiterals: DetectedLiteral[]): LiteralMatch[] {\n const matches: LiteralMatch[] = [];\n\n for (const queryLiteral of queryLiterals) {\n const key = queryLiteral.value.toLowerCase();\n const entries = this.entries.get(key);\n\n if (!entries) {\n continue;\n }\n\n for (const entry of entries) {\n const exactMatch = entry.originalCasing === queryLiteral.value;\n\n matches.push({\n queryLiteral,\n indexedLiteral: {\n value: entry.originalCasing,\n type: entry.type,\n matchType: entry.matchType,\n },\n chunkId: entry.chunkId,\n filepath: entry.filepath,\n exactMatch,\n });\n }\n }\n\n return matches;\n }\n\n /**\n * Get all chunk IDs that contain a specific literal.\n *\n * @param literal - The literal value to search for\n * @returns Array of chunk IDs\n */\n getChunksForLiteral(literal: string): string[] {\n const key = literal.toLowerCase();\n const entries = this.entries.get(key);\n return entries ? entries.map((e) => e.chunkId) : [];\n }\n\n /**\n * Find literals that contain a specific vocabulary word.\n *\n * @param word - The vocabulary word to search for\n * @returns Array of literal entries that contain this word\n */\n findByVocabulary(word: string): LiteralIndexEntry[] {\n const wordLower = word.toLowerCase();\n const literalKeys = this.vocabularyIndex.get(wordLower);\n\n if (!literalKeys) {\n return [];\n }\n\n const results: LiteralIndexEntry[] = [];\n for (const key of literalKeys) {\n const entries = this.entries.get(key);\n if (entries) {\n results.push(...entries);\n }\n }\n\n return results;\n }\n\n /**\n * Find matches for query by vocabulary words.\n * Returns literals that contain any of the given vocabulary words.\n *\n * @param vocabularyWords - Words to search for\n * @returns Array of matches with overlap information\n */\n findByVocabularyWords(\n vocabularyWords: string[]\n ): Array<{ entry: LiteralIndexEntry; matchedWords: string[] }> {\n const matchesMap = new Map<\n string,\n { entry: LiteralIndexEntry; matchedWords: Set<string> }\n >();\n\n for (const word of vocabularyWords) {\n const wordLower = word.toLowerCase();\n const literalKeys = this.vocabularyIndex.get(wordLower);\n\n if (!literalKeys) continue;\n\n for (const key of literalKeys) {\n const entries = this.entries.get(key);\n if (!entries) continue;\n\n for (const entry of entries) {\n const matchKey = `${entry.chunkId}:${entry.originalCasing}`;\n const existing = matchesMap.get(matchKey);\n\n if (existing) {\n existing.matchedWords.add(wordLower);\n } else {\n matchesMap.set(matchKey, {\n entry,\n matchedWords: new Set([wordLower]),\n });\n }\n }\n }\n }\n\n return Array.from(matchesMap.values()).map(({ entry, matchedWords }) => ({\n entry,\n matchedWords: Array.from(matchedWords),\n }));\n }\n\n /**\n * Save the index to disk.\n */\n async save(): Promise<void> {\n // Ensure directory exists\n await fs.mkdir(this.indexPath, { recursive: true });\n\n // Convert Map to serializable format\n const data: LiteralIndexData = {\n version: LiteralIndex.VERSION,\n entries: Object.fromEntries(this.entries),\n };\n\n const indexFile = path.join(this.indexPath, \"_index.json\");\n await fs.writeFile(indexFile, JSON.stringify(data, null, 2));\n }\n\n /**\n * Load the index from disk.\n */\n async load(): Promise<void> {\n const indexFile = path.join(this.indexPath, \"_index.json\");\n const content = await fs.readFile(indexFile, \"utf-8\");\n const data: LiteralIndexData = JSON.parse(content);\n\n // Version check\n if (data.version !== LiteralIndex.VERSION) {\n console.warn(\n `Literal index version mismatch: expected ${LiteralIndex.VERSION}, got ${data.version}`\n );\n }\n\n // Convert back to Map\n this.entries = new Map(Object.entries(data.entries));\n }\n\n /**\n * Check if the index exists on disk.\n */\n async exists(): Promise<boolean> {\n try {\n const indexFile = path.join(this.indexPath, \"_index.json\");\n await fs.access(indexFile);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.entries.clear();\n this.vocabularyIndex.clear();\n }\n\n /**\n * Get the number of unique literals in the index.\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Get the total number of literal-to-chunk mappings.\n */\n get totalMappings(): number {\n let count = 0;\n for (const entries of this.entries.values()) {\n count += entries.length;\n }\n return count;\n }\n\n /**\n * Get all unique literals in the index.\n */\n getAllLiterals(): string[] {\n return Array.from(this.entries.keys());\n }\n\n /**\n * Build a map from chunk ID to literal matches for a set of query literals.\n * Convenience method for search integration.\n *\n * @param queryLiterals - Literals detected in the query\n * @returns Map from chunk ID to array of matches\n */\n buildMatchMap(queryLiterals: DetectedLiteral[]): Map<string, LiteralMatch[]> {\n const matches = this.findMatches(queryLiterals);\n const matchMap = new Map<string, LiteralMatch[]>();\n\n for (const match of matches) {\n const existing = matchMap.get(match.chunkId) || [];\n existing.push(match);\n matchMap.set(match.chunkId, existing);\n }\n\n return matchMap;\n }\n}\n\n/**\n * Determine if we should replace an existing match type with a new one.\n * Priority: definition > reference > import\n */\nfunction shouldReplaceMatchType(\n existing: LiteralMatchType,\n incoming: LiteralMatchType\n): boolean {\n const priority: Record<LiteralMatchType, number> = {\n definition: 3,\n reference: 2,\n import: 1,\n };\n return priority[incoming] > priority[existing];\n}\n\n/**\n * Get the literal index path for a module.\n */\nexport function getLiteralIndexPath(\n rootDir: string,\n moduleId: string,\n indexDir: string = \".raggrep\"\n): string {\n return path.join(rootDir, indexDir, \"index\", moduleId, \"literals\");\n}\n",
|
|
38
40
|
"/**\n * Storage Infrastructure\n *\n * Handles persistence of index data to the filesystem.\n */\n\nexport { FileIndexStorage } from \"./fileIndexStorage\";\nexport { SymbolicIndex, getSymbolicPath } from \"./symbolicIndex\";\nexport { LiteralIndex, getLiteralIndexPath } from \"./literalIndex\";\n",
|
|
39
|
-
"/**\n * TypeScript/JavaScript 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 * Supported file types: .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n calculateFileTypeBoost,\n extractQueryTerms,\n // Literal boosting\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n // Vocabulary extraction for query\n extractQueryVocabulary,\n calculateVocabularyMatch,\n // Structured Semantic Expansion\n expandQuery,\n // Content phrase matching\n calculatePhraseMatch,\n PHRASE_MATCH_CONSTANTS,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { parseTypeScriptCode, generateChunkId } from \"./parseCode\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type {\n FileSummary,\n ExtractedLiteral,\n LiteralMatch,\n} from \"../../../domain/entities\";\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.6;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.25;\n\n/** Weight for vocabulary matching in hybrid scoring (0-1) */\nconst VOCAB_WEIGHT = 0.15;\n\n/** Minimum vocabulary overlap score to bypass minScore filter */\nconst VOCAB_THRESHOLD = 0.4;\n\n/** File extensions supported by this module */\nexport const TYPESCRIPT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isTypeScriptFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return TYPESCRIPT_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isTypeScriptFile;\n\n/**\n * Calculate boost based on chunk type.\n * Function/class/interface chunks rank higher than generic blocks.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\":\n case \"interface\":\n return 0.04;\n case \"type\":\n case \"enum\":\n return 0.03;\n case \"variable\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * Public APIs are more likely to be what users are searching for.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\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\nexport class TypeScriptModule implements IndexModule {\n readonly id = \"language/typescript\";\n readonly name = \"TypeScript Search\";\n readonly description =\n \"TypeScript-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isTypeScriptFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n /** Map from chunkId → { filepath, literals } for building literal index */\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n // Extract embedding config from module options\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n\n // Extract logger from module options (passed from indexer)\n this.logger = config.options?.logger as Logger | undefined;\n\n // Add logger to embedding config\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n // Configure the embedding provider\n configureEmbeddings(this.embeddingConfig);\n\n // Clear pending data for fresh indexing\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process TypeScript/JavaScript files\n if (!isTypeScriptFile(filepath)) {\n return null;\n }\n\n // Store rootDir for finalize\n this.rootDir = ctx.rootDir;\n\n // Parse code into chunks using TypeScript AST\n const parsedChunks = parseTypeScriptCode(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 // Check if we should include full file chunk\n // Include when:\n // 1. Config option is enabled (future: add to module config)\n // 2. We have multiple semantic chunks (full file provides broad context)\n const includeFullFileChunk = parsedChunks.length > 1;\n\n // Prepare all chunks for embedding (including optional full file chunk)\n const allParsedChunks = [...parsedChunks];\n\n // Add full file chunk if requested\n if (includeFullFileChunk) {\n const lines = content.split(\"\\n\");\n allParsedChunks.unshift({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\" as const,\n name: path.basename(filepath),\n isExported: false,\n });\n }\n\n // Generate embeddings for all chunks with path context\n // Prepending path context helps the embedding model understand file structure\n const chunkContents = allParsedChunks.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[] = allParsedChunks.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 // Use original parsedChunks (not allParsedChunks) to avoid counting file chunk\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type)),\n ] as ChunkType[];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n // Extract keywords from semantic chunks + path keywords\n // (Skip full file chunk to avoid duplication)\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 // Extract literals from each chunk for literal boosting\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\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 and literal indexes.\n * Uses incremental updates when possible to avoid full rebuilds.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index (loads existing data including BM25)\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Track which files were updated for incremental save\n const updatedFilepaths: string[] = [];\n\n // Add all pending summaries incrementally (updates BM25 as we go)\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n // Save to disk (only saves updated files + serialized BM25)\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n // Initialize and build literal index\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n // Get all filepaths that were indexed in this run\n // (both from summaries for any indexed files and from literals for chunks with names)\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n // Remove old literals for all files that were re-indexed\n // This ensures stale literals (from renamed/deleted functions) are removed\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n // Add all pending literals (fresh data from this indexing run)\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n // Save literal index to disk\n await this.literalIndex.save();\n\n // Clear pending data\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n /**\n * Search the semantic index for chunks matching the query.\n *\n * Uses a three-source approach:\n * 1. Semantic search with embeddings\n * 2. BM25 keyword search\n * 3. Literal index for exact-match boosting\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 {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n // Parse query for literals (explicit backticks/quotes and implicit casing)\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n // Load symbolic index for BM25 scoring (not filtering)\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n // Load literal index for exact-match boosting and vocabulary matching\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n let vocabularyScoreMap = new Map<string, number>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n\n // Extract vocabulary from query for partial matching\n const queryVocabulary = extractQueryVocabulary(query);\n\n if (queryVocabulary.length > 0) {\n // Query vocabulary index for chunks with overlapping vocabulary\n const vocabMatches = literalIndex.findByVocabularyWords(queryVocabulary);\n\n // Calculate vocabulary score for each matched chunk\n for (const { entry, matchedWords } of vocabMatches) {\n // Score is the proportion of query vocabulary that matched\n const vocabScore = matchedWords.length / queryVocabulary.length;\n\n // Keep the best score if chunk already has a score\n const existingScore = vocabularyScoreMap.get(entry.chunkId) || 0;\n if (vocabScore > existingScore) {\n vocabularyScoreMap.set(entry.chunkId, vocabScore);\n }\n }\n }\n } catch {\n // Literal index doesn't exist yet, continue without it\n }\n\n // Get ALL indexed files - semantic search needs to check all embeddings\n // BM25 contributes to the hybrid score but doesn't filter candidates\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n // Symbolic index doesn't exist, fall back to loading all files\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Apply file pattern filter if specified\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 // Use remaining query (without explicit literals) for semantic search\n const semanticQuery = remainingQuery.trim() || query; // Fall back to full query if empty\n\n // Apply Structured Semantic Expansion to broaden search recall\n // This adds domain-specific synonyms (function → method, auth → authentication, etc.)\n // Use conservative settings: no weak synonyms, limited max terms\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false, // Only strong and moderate synonyms\n maxTerms: 10, // Conservative limit to avoid diluting specificity\n });\n\n // Use expanded query for embedding to improve semantic recall\n const queryEmbedding = await getEmbedding(\n expandedQuery.expandedQueryString\n );\n\n // Load all indexed files and compute scores\n // BM25 is used for keyword scoring, not filtering\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 filesToSearch) {\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 (use full query for BM25)\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 and intent detection\n const queryTerms = extractQueryTerms(query);\n\n // Build path boost map from file summaries\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n // Check if query terms match domain\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n // Check if query terms match layer\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n // Check if query terms match path segments\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\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 const processedChunkIds = new Set<string>();\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 vocabScore = vocabularyScoreMap.get(chunk.id) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n\n // Content phrase matching\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Additional boosts for ranking improvement\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost + phraseMatch.boost;\n\n // Base hybrid score: weighted combination of semantic, BM25, and vocabulary\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n VOCAB_WEIGHT * vocabScore;\n\n // Apply literal boosting (multiplicative)\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true // hasSemanticOrBm25\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n // Final score = boosted base score + additive boosts\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0 ||\n vocabScore > VOCAB_THRESHOLD || // Include chunks with significant vocabulary overlap\n phraseMatch.isSignificant // Include chunks with exact phrase or high token coverage\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n vocabScore,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n // Literal boosting context\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n // Semantic expansion context\n synonymsUsed: expandedQuery.wasExpanded\n ? expandedQuery.expandedTerms\n .filter((t) => t.source !== \"original\")\n .map((t) => t.term)\n : undefined,\n },\n });\n }\n }\n\n // Add literal-only results (chunks found by literal index but not loaded above)\n // This ensures exact matches always surface even if they weren't in the search scope\n const literalOnlyFiles = new Map<string, LiteralMatch[]>();\n\n // Group unprocessed literal matches by filepath\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunkIds.has(chunkId)) {\n continue;\n }\n\n // Get filepath from the first match (all matches for same chunkId have same filepath)\n const filepath = matches[0]?.filepath;\n if (!filepath) continue;\n\n const existing = literalOnlyFiles.get(filepath) || [];\n existing.push(...matches);\n literalOnlyFiles.set(filepath, existing);\n }\n\n // Load and score literal-only chunks\n for (const [filepath, matches] of literalOnlyFiles) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as SemanticModuleData;\n\n // Group matches by chunkId for this file\n const chunkMatches = new Map<string, LiteralMatch[]>();\n for (const match of matches) {\n const existing = chunkMatches.get(match.chunkId) || [];\n existing.push(match);\n chunkMatches.set(match.chunkId, existing);\n }\n\n // Find and score each matched chunk\n for (const [chunkId, chunkLiteralMatches] of chunkMatches) {\n if (processedChunkIds.has(chunkId)) continue;\n\n const chunkIndex = fileIndex.chunks.findIndex((c) => c.id === chunkId);\n if (chunkIndex === -1) continue;\n\n const chunk = fileIndex.chunks[chunkIndex];\n const embedding = moduleData?.embeddings?.[chunkIndex];\n\n // Calculate semantic score if embedding available\n let semanticScore = 0;\n if (embedding) {\n semanticScore = cosineSimilarity(queryEmbedding, embedding);\n }\n\n // BM25 score (chunk wasn't in our search, so typically 0)\n const bm25Score = bm25Scores.get(chunkId) || 0;\n\n // Vocabulary score\n const vocabScore = vocabularyScoreMap.get(chunkId) || 0;\n\n // Content phrase matching\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Additional boosts\n const pathBoost = pathBoosts.get(filepath) || 0;\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost + phraseMatch.boost;\n\n // For literal-only results, use literal scoring\n const literalContribution = calculateLiteralContribution(\n chunkLiteralMatches,\n false // hasSemanticOrBm25 = false (literal-only)\n );\n\n // Use LITERAL_SCORING_CONSTANTS.BASE_SCORE as base for literal-only\n const baseScore =\n semanticScore > 0\n ? SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n VOCAB_WEIGHT * vocabScore\n : LITERAL_SCORING_CONSTANTS.BASE_SCORE;\n\n const boostedScore = applyLiteralBoost(\n baseScore,\n chunkLiteralMatches,\n semanticScore > 0\n );\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n vocabScore,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n literalOnly: true, // Mark as literal-only result\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",
|
|
41
|
+
"/**\n * TypeScript/JavaScript 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 * Supported file types: .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n calculateFileTypeBoost,\n extractQueryTerms,\n // Literal boosting\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n // Vocabulary extraction for query\n extractQueryVocabulary,\n calculateVocabularyMatch,\n // Structured Semantic Expansion\n expandQuery,\n // Content phrase matching\n calculatePhraseMatch,\n PHRASE_MATCH_CONSTANTS,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { parseTypeScriptCode, generateChunkId } from \"./parseCode\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type {\n FileSummary,\n ExtractedLiteral,\n LiteralMatch,\n} from \"../../../domain/entities\";\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.6;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.25;\n\n/** Weight for vocabulary matching in hybrid scoring (0-1) */\nconst VOCAB_WEIGHT = 0.15;\n\n/** Minimum vocabulary overlap score to bypass minScore filter */\nconst VOCAB_THRESHOLD = 0.4;\n\n/** File extensions supported by this module */\nexport const TYPESCRIPT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isTypeScriptFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return TYPESCRIPT_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isTypeScriptFile;\n\n/**\n * Calculate boost based on chunk type.\n * Function/class/interface chunks rank higher than generic blocks.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\":\n case \"interface\":\n return 0.04;\n case \"type\":\n case \"enum\":\n return 0.03;\n case \"variable\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * Public APIs are more likely to be what users are searching for.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\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\nexport class TypeScriptModule implements IndexModule {\n readonly id = \"language/typescript\";\n readonly name = \"TypeScript Search\";\n readonly description =\n \"TypeScript-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isTypeScriptFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n /** Map from chunkId → { filepath, literals } for building literal index */\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n // Extract embedding config from module options\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n\n // Extract logger from module options (passed from indexer)\n this.logger = config.options?.logger as Logger | undefined;\n\n // Add logger to embedding config\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n // Configure the embedding provider\n configureEmbeddings(this.embeddingConfig);\n\n // Clear pending data for fresh indexing\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process TypeScript/JavaScript files\n if (!isTypeScriptFile(filepath)) {\n return null;\n }\n\n // Store rootDir for finalize\n this.rootDir = ctx.rootDir;\n\n // Parse code into chunks using TypeScript AST\n const parsedChunks = parseTypeScriptCode(content, filepath);\n\n if (parsedChunks.length === 0) {\n return null;\n }\n\n // Check if we should include full file chunk\n // Include when:\n // 1. Config option is enabled (future: add to module config)\n // 2. We have multiple semantic chunks (full file provides broad context)\n const includeFullFileChunk = parsedChunks.length > 1;\n\n // Prepare all chunks for embedding (including optional full file chunk)\n const allParsedChunks = [...parsedChunks];\n\n // Add full file chunk if requested\n if (includeFullFileChunk) {\n const lines = content.split(\"\\n\");\n allParsedChunks.unshift({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\" as const,\n name: path.basename(filepath),\n isExported: false,\n });\n }\n\n // Generate embeddings for all chunks with path context\n // Using the unified prepareChunkForEmbedding utility for consistent path injection\n const chunkContents = allParsedChunks.map((c) => {\n return prepareChunkForEmbedding({\n filepath,\n content: c.content,\n name: c.name,\n docComment: c.jsDoc,\n });\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks with all metadata\n const chunks: Chunk[] = allParsedChunks.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 // Use original parsedChunks (not allParsedChunks) to avoid counting file chunk\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type)),\n ] as ChunkType[];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n // Extract keywords from semantic chunks + path keywords\n // (Skip full file chunk to avoid duplication)\n const contentKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach((k) => contentKeywords.add(k));\n }\n // Add path keywords using unified utility\n const pathKeywords = extractPathKeywordsForFileSummary(filepath);\n const allKeywords = [...contentKeywords, ...pathKeywords];\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: [...new Set(allKeywords)],\n exports,\n lastModified: stats.lastModified,\n // Include parsed path context for search boosting\n pathContext: getPathContextForFileSummary(filepath),\n };\n\n // Store summary for finalize\n this.pendingSummaries.set(filepath, fileSummary);\n\n // Extract literals from each chunk for literal boosting\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\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 and literal indexes.\n * Uses incremental updates when possible to avoid full rebuilds.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index (loads existing data including BM25)\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Track which files were updated for incremental save\n const updatedFilepaths: string[] = [];\n\n // Add all pending summaries incrementally (updates BM25 as we go)\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n // Save to disk (only saves updated files + serialized BM25)\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n // Initialize and build literal index\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n // Get all filepaths that were indexed in this run\n // (both from summaries for any indexed files and from literals for chunks with names)\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n // Remove old literals for all files that were re-indexed\n // This ensures stale literals (from renamed/deleted functions) are removed\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n // Add all pending literals (fresh data from this indexing run)\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n // Save literal index to disk\n await this.literalIndex.save();\n\n // Clear pending data\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n /**\n * Search the semantic index for chunks matching the query.\n *\n * Uses a three-source approach:\n * 1. Semantic search with embeddings\n * 2. BM25 keyword search\n * 3. Literal index for exact-match boosting\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 {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n // Parse query for literals (explicit backticks/quotes and implicit casing)\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n // Load symbolic index for BM25 scoring (not filtering)\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n // Load literal index for exact-match boosting and vocabulary matching\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n let vocabularyScoreMap = new Map<string, number>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n\n // Extract vocabulary from query for partial matching\n const queryVocabulary = extractQueryVocabulary(query);\n\n if (queryVocabulary.length > 0) {\n // Query vocabulary index for chunks with overlapping vocabulary\n const vocabMatches = literalIndex.findByVocabularyWords(queryVocabulary);\n\n // Calculate vocabulary score for each matched chunk\n for (const { entry, matchedWords } of vocabMatches) {\n // Score is the proportion of query vocabulary that matched\n const vocabScore = matchedWords.length / queryVocabulary.length;\n\n // Keep the best score if chunk already has a score\n const existingScore = vocabularyScoreMap.get(entry.chunkId) || 0;\n if (vocabScore > existingScore) {\n vocabularyScoreMap.set(entry.chunkId, vocabScore);\n }\n }\n }\n } catch {\n // Literal index doesn't exist yet, continue without it\n }\n\n // Get ALL indexed files - semantic search needs to check all embeddings\n // BM25 contributes to the hybrid score but doesn't filter candidates\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n // Symbolic index doesn't exist, fall back to loading all files\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Apply file pattern filter if specified\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 // Use remaining query (without explicit literals) for semantic search\n const semanticQuery = remainingQuery.trim() || query; // Fall back to full query if empty\n\n // Apply Structured Semantic Expansion to broaden search recall\n // This adds domain-specific synonyms (function → method, auth → authentication, etc.)\n // Use conservative settings: no weak synonyms, limited max terms\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false, // Only strong and moderate synonyms\n maxTerms: 10, // Conservative limit to avoid diluting specificity\n });\n\n // Use expanded query for embedding to improve semantic recall\n const queryEmbedding = await getEmbedding(\n expandedQuery.expandedQueryString\n );\n\n // Load all indexed files and compute scores\n // BM25 is used for keyword scoring, not filtering\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 filesToSearch) {\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 (use full query for BM25)\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 and intent detection\n const queryTerms = extractQueryTerms(query);\n\n // Build path boost map from file summaries\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n // Check if query terms match domain\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n // Check if query terms match layer\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n // Check if query terms match path segments\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\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 const processedChunkIds = new Set<string>();\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 vocabScore = vocabularyScoreMap.get(chunk.id) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n\n // Content phrase matching\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Additional boosts for ranking improvement\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost + phraseMatch.boost;\n\n // Base hybrid score: weighted combination of semantic, BM25, and vocabulary\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n VOCAB_WEIGHT * vocabScore;\n\n // Apply literal boosting (multiplicative)\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true // hasSemanticOrBm25\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n // Final score = boosted base score + additive boosts\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0 ||\n vocabScore > VOCAB_THRESHOLD || // Include chunks with significant vocabulary overlap\n phraseMatch.isSignificant // Include chunks with exact phrase or high token coverage\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n vocabScore,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n // Literal boosting context\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n // Semantic expansion context\n synonymsUsed: expandedQuery.wasExpanded\n ? expandedQuery.expandedTerms\n .filter((t) => t.source !== \"original\")\n .map((t) => t.term)\n : undefined,\n },\n });\n }\n }\n\n // Add literal-only results (chunks found by literal index but not loaded above)\n // This ensures exact matches always surface even if they weren't in the search scope\n const literalOnlyFiles = new Map<string, LiteralMatch[]>();\n\n // Group unprocessed literal matches by filepath\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunkIds.has(chunkId)) {\n continue;\n }\n\n // Get filepath from the first match (all matches for same chunkId have same filepath)\n const filepath = matches[0]?.filepath;\n if (!filepath) continue;\n\n const existing = literalOnlyFiles.get(filepath) || [];\n existing.push(...matches);\n literalOnlyFiles.set(filepath, existing);\n }\n\n // Load and score literal-only chunks\n for (const [filepath, matches] of literalOnlyFiles) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as SemanticModuleData;\n\n // Group matches by chunkId for this file\n const chunkMatches = new Map<string, LiteralMatch[]>();\n for (const match of matches) {\n const existing = chunkMatches.get(match.chunkId) || [];\n existing.push(match);\n chunkMatches.set(match.chunkId, existing);\n }\n\n // Find and score each matched chunk\n for (const [chunkId, chunkLiteralMatches] of chunkMatches) {\n if (processedChunkIds.has(chunkId)) continue;\n\n const chunkIndex = fileIndex.chunks.findIndex((c) => c.id === chunkId);\n if (chunkIndex === -1) continue;\n\n const chunk = fileIndex.chunks[chunkIndex];\n const embedding = moduleData?.embeddings?.[chunkIndex];\n\n // Calculate semantic score if embedding available\n let semanticScore = 0;\n if (embedding) {\n semanticScore = cosineSimilarity(queryEmbedding, embedding);\n }\n\n // BM25 score (chunk wasn't in our search, so typically 0)\n const bm25Score = bm25Scores.get(chunkId) || 0;\n\n // Vocabulary score\n const vocabScore = vocabularyScoreMap.get(chunkId) || 0;\n\n // Content phrase matching\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Additional boosts\n const pathBoost = pathBoosts.get(filepath) || 0;\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost + phraseMatch.boost;\n\n // For literal-only results, use literal scoring\n const literalContribution = calculateLiteralContribution(\n chunkLiteralMatches,\n false // hasSemanticOrBm25 = false (literal-only)\n );\n\n // Use LITERAL_SCORING_CONSTANTS.BASE_SCORE as base for literal-only\n const baseScore =\n semanticScore > 0\n ? SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n VOCAB_WEIGHT * vocabScore\n : LITERAL_SCORING_CONSTANTS.BASE_SCORE;\n\n const boostedScore = applyLiteralBoost(\n baseScore,\n chunkLiteralMatches,\n semanticScore > 0\n );\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n vocabScore,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n literalOnly: true, // Mark as literal-only result\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",
|
|
40
42
|
"/**\n * TypeScript Parser\n *\n * Wraps the existing TypeScript Compiler API-based parser in the IParser interface.\n * This provides superior type information and JSDoc parsing for TS/JS files.\n *\n * For TypeScript and JavaScript files, this parser is preferred over tree-sitter\n * because it has access to full type information and proven quality.\n */\n\nimport * as path from \"path\";\nimport type {\n IParser,\n ParsedChunk,\n ParseResult,\n ParserConfig,\n ParserLanguage,\n} from \"../../domain/ports/parser\";\nimport {\n parseTypeScriptCode,\n type ParsedChunk as TSParsedChunk,\n} from \"../../modules/language/typescript/parseCode\";\n\n/**\n * File extensions supported by the TypeScript parser.\n */\nconst TYPESCRIPT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n];\n\n/**\n * TypeScript Parser implementation using TypeScript Compiler API.\n *\n * This is the primary parser for TypeScript and JavaScript files.\n * It provides:\n * - Accurate AST parsing\n * - Full JSDoc extraction\n * - Export detection\n * - Type information\n */\nexport class TypeScriptParser implements IParser {\n readonly supportedLanguages: ParserLanguage[] = [\"typescript\", \"javascript\"];\n\n /**\n * Parse TypeScript/JavaScript source code into semantic chunks.\n */\n async parse(\n content: string,\n filepath: string,\n config?: ParserConfig\n ): Promise<ParseResult> {\n try {\n // Use the existing TypeScript parser\n const tsChunks = parseTypeScriptCode(content, filepath);\n\n // Convert to ParsedChunk format\n const chunks: ParsedChunk[] = tsChunks.map((tc) =>\n this.convertChunk(tc)\n );\n\n // Optionally add full file chunk\n if (config?.includeFullFileChunk) {\n const lines = content.split(\"\\n\");\n const fullFileChunk: ParsedChunk = {\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n isExported: false,\n };\n\n // Add full file chunk at the beginning\n chunks.unshift(fullFileChunk);\n }\n\n // Detect language from extension\n const ext = path.extname(filepath).toLowerCase();\n const language: ParserLanguage =\n ext === \".js\" ||\n ext === \".jsx\" ||\n ext === \".mjs\" ||\n ext === \".cjs\"\n ? \"javascript\"\n : \"typescript\";\n\n return {\n chunks,\n language,\n success: true,\n };\n } catch (error) {\n return {\n chunks: [],\n language: this.detectLanguage(filepath),\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Check if this parser can handle the given file.\n */\n canParse(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return TYPESCRIPT_EXTENSIONS.includes(ext);\n }\n\n /**\n * Convert from the existing ParsedChunk format to the domain ParsedChunk format.\n */\n private convertChunk(tc: TSParsedChunk): ParsedChunk {\n return {\n content: tc.content,\n startLine: tc.startLine,\n endLine: tc.endLine,\n type: tc.type,\n name: tc.name,\n isExported: tc.isExported,\n docComment: tc.jsDoc,\n };\n }\n\n /**\n * Detect language from file extension.\n */\n private detectLanguage(filepath: string): ParserLanguage {\n const ext = path.extname(filepath).toLowerCase();\n if ([\".js\", \".jsx\", \".mjs\", \".cjs\"].includes(ext)) {\n return \"javascript\";\n }\n return \"typescript\";\n }\n}\n\n/**\n * Create a new TypeScript parser instance.\n */\nexport function createTypeScriptParser(): TypeScriptParser {\n return new TypeScriptParser();\n}\n\n",
|
|
41
43
|
"/**\n * Grammar Manager\n *\n * Manages tree-sitter grammar installation and loading.\n * Uses Bun for dynamic package installation on first use.\n *\n * This is an infrastructure component that handles:\n * - Grammar package installation via Bun\n * - Grammar caching in memory\n * - Thread-safe concurrent installation handling\n */\n\nimport type {\n IGrammarManager,\n GrammarStatus,\n ParserLanguage,\n} from \"../../domain/ports/parser\";\nimport type { Logger } from \"../../domain/ports/logger\";\n\n/**\n * Map from language to tree-sitter grammar package name.\n */\nconst GRAMMAR_PACKAGES: Record<ParserLanguage, string> = {\n typescript: \"tree-sitter-typescript\",\n javascript: \"tree-sitter-javascript\",\n python: \"tree-sitter-python\",\n go: \"tree-sitter-go\",\n rust: \"tree-sitter-rust\",\n java: \"tree-sitter-java\",\n};\n\n/**\n * Map from language to the specific grammar export path.\n * Some packages export multiple languages (e.g., tree-sitter-typescript has typescript and tsx).\n */\nconst GRAMMAR_EXPORTS: Record<ParserLanguage, string | undefined> = {\n typescript: undefined, // Uses default export\n javascript: undefined,\n python: undefined,\n go: undefined,\n rust: undefined,\n java: undefined,\n};\n\n/**\n * Singleton Grammar Manager for tree-sitter grammars.\n *\n * Handles:\n * - Checking if grammars are installed\n * - Installing grammars via Bun on demand\n * - Caching loaded grammars\n * - Thread-safe concurrent installation\n */\nexport class GrammarManager implements IGrammarManager {\n private static instance: GrammarManager | null = null;\n\n /** Cache of loaded grammars */\n private grammarCache: Map<ParserLanguage, unknown> = new Map();\n\n /** Track installation status */\n private installationStatus: Map<ParserLanguage, GrammarStatus> = new Map();\n\n /** Track pending installations to prevent duplicate installs */\n private pendingInstalls: Map<ParserLanguage, Promise<GrammarStatus>> =\n new Map();\n\n /** Optional logger for progress reporting */\n private logger?: Logger;\n\n private constructor() {}\n\n /**\n * Get the singleton instance.\n */\n static getInstance(): GrammarManager {\n if (!GrammarManager.instance) {\n GrammarManager.instance = new GrammarManager();\n }\n return GrammarManager.instance;\n }\n\n /**\n * Set a logger for progress reporting.\n */\n setLogger(logger: Logger): void {\n this.logger = logger;\n }\n\n /**\n * Check if a grammar package is installed.\n */\n async isInstalled(language: ParserLanguage): Promise<boolean> {\n // Check cache first\n if (this.grammarCache.has(language)) {\n return true;\n }\n\n const packageName = GRAMMAR_PACKAGES[language];\n if (!packageName) {\n return false;\n }\n\n try {\n // Try to require the package\n await import(packageName);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Install a grammar for a language using Bun.\n *\n * Thread-safe: concurrent calls for the same language will wait\n * for the first installation to complete.\n */\n async install(language: ParserLanguage): Promise<GrammarStatus> {\n const packageName = GRAMMAR_PACKAGES[language];\n\n if (!packageName) {\n const status: GrammarStatus = {\n language,\n installed: false,\n error: `Unknown language: ${language}`,\n };\n this.installationStatus.set(language, status);\n return status;\n }\n\n // Check if already installed\n if (await this.isInstalled(language)) {\n const status: GrammarStatus = {\n language,\n installed: true,\n packageName,\n };\n this.installationStatus.set(language, status);\n return status;\n }\n\n // Check if installation is already in progress\n const pending = this.pendingInstalls.get(language);\n if (pending) {\n return pending;\n }\n\n // Start installation\n const installPromise = this.doInstall(language, packageName);\n this.pendingInstalls.set(language, installPromise);\n\n try {\n const status = await installPromise;\n this.installationStatus.set(language, status);\n return status;\n } finally {\n this.pendingInstalls.delete(language);\n }\n }\n\n /**\n * Perform the actual installation using Bun.\n */\n private async doInstall(\n language: ParserLanguage,\n packageName: string\n ): Promise<GrammarStatus> {\n this.logger?.info?.(`Installing grammar: ${packageName}...`);\n\n try {\n // Use Bun.spawn to install the package\n const proc = Bun.spawn([\"bun\", \"add\", packageName], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n cwd: process.cwd(),\n });\n\n const exitCode = await proc.exited;\n\n if (exitCode !== 0) {\n const stderr = await new Response(proc.stderr).text();\n throw new Error(`Installation failed: ${stderr}`);\n }\n\n // Verify installation\n await import(packageName);\n\n this.logger?.info?.(`Grammar installed: ${packageName}`);\n\n return {\n language,\n installed: true,\n packageName,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.error?.(`Failed to install ${packageName}: ${message}`);\n\n return {\n language,\n installed: false,\n packageName,\n error: message,\n };\n }\n }\n\n /**\n * Get the status of all supported grammars.\n */\n async getStatus(): Promise<GrammarStatus[]> {\n const statuses: GrammarStatus[] = [];\n\n for (const language of Object.keys(GRAMMAR_PACKAGES) as ParserLanguage[]) {\n const installed = await this.isInstalled(language);\n statuses.push({\n language,\n installed,\n packageName: GRAMMAR_PACKAGES[language],\n });\n }\n\n return statuses;\n }\n\n /**\n * Pre-install grammars for a batch of languages.\n * Shows overall progress and handles failures gracefully.\n */\n async preInstallBatch(languages: ParserLanguage[]): Promise<GrammarStatus[]> {\n const uniqueLanguages = [...new Set(languages)];\n const results: GrammarStatus[] = [];\n\n // Check which languages need installation\n const toInstall: ParserLanguage[] = [];\n for (const lang of uniqueLanguages) {\n if (!(await this.isInstalled(lang))) {\n toInstall.push(lang);\n } else {\n results.push({\n language: lang,\n installed: true,\n packageName: GRAMMAR_PACKAGES[lang],\n });\n }\n }\n\n if (toInstall.length === 0) {\n return results;\n }\n\n this.logger?.info?.(\n `Installing ${toInstall.length} grammar(s): ${toInstall.join(\", \")}...`\n );\n\n // Install in parallel with concurrency limit\n const CONCURRENCY = 3;\n for (let i = 0; i < toInstall.length; i += CONCURRENCY) {\n const batch = toInstall.slice(i, i + CONCURRENCY);\n const batchResults = await Promise.all(batch.map((l) => this.install(l)));\n results.push(...batchResults);\n }\n\n // Log summary\n const successful = results.filter((r) => r.installed).length;\n const failed = results.filter((r) => !r.installed).length;\n\n if (failed > 0) {\n this.logger?.warn?.(\n `Grammar installation: ${successful} succeeded, ${failed} failed`\n );\n } else {\n this.logger?.info?.(`All ${successful} grammar(s) installed successfully`);\n }\n\n return results;\n }\n\n /**\n * Load a grammar module.\n * Returns the grammar if installed, null otherwise.\n */\n async loadGrammar(language: ParserLanguage): Promise<unknown | null> {\n // Check cache\n if (this.grammarCache.has(language)) {\n return this.grammarCache.get(language);\n }\n\n const packageName = GRAMMAR_PACKAGES[language];\n if (!packageName) {\n return null;\n }\n\n try {\n const grammar = await import(packageName);\n this.grammarCache.set(language, grammar);\n return grammar;\n } catch {\n return null;\n }\n }\n\n /**\n * Get the package name for a language.\n */\n getPackageName(language: ParserLanguage): string | undefined {\n return GRAMMAR_PACKAGES[language];\n }\n\n /**\n * Clear cached grammars (mainly for testing).\n */\n clearCache(): void {\n this.grammarCache.clear();\n this.installationStatus.clear();\n }\n}\n\n/**\n * Get the singleton grammar manager instance.\n */\nexport function getGrammarManager(): GrammarManager {\n return GrammarManager.getInstance();\n}\n\n",
|
|
42
44
|
"/**\n * Tree-sitter Parser\n *\n * Uses web-tree-sitter (WebAssembly) for parsing multiple languages.\n * This parser supports Python, Go, Rust, Java, and can act as a fallback for TS/JS.\n *\n * Web-tree-sitter provides:\n * - Cross-platform compatibility (no native compilation)\n * - Fast, incremental parsing\n * - Support for many languages via WASM grammars\n * - Consistent AST structure\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport type {\n IParser,\n ParsedChunk,\n ParseResult,\n ParserConfig,\n ParserLanguage,\n} from \"../../domain/ports/parser\";\nimport type { ChunkType } from \"../../domain/entities/chunk\";\nimport { getGrammarManager } from \"./grammarManager\";\n\n/**\n * Map from file extension to parser language.\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, ParserLanguage> = {\n \".py\": \"python\",\n \".pyw\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n // TypeScript/JavaScript as fallback\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n};\n\n/**\n * Tree-sitter Parser implementation using web-tree-sitter (WebAssembly).\n *\n * Supports multiple languages through WASM grammar files.\n * Falls back to basic chunking if grammar is not available.\n */\nexport class TreeSitterParser implements IParser {\n readonly supportedLanguages: ParserLanguage[] = [\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n \"typescript\",\n \"javascript\",\n ];\n\n private grammarManager = getGrammarManager();\n private parserInstance: any = null;\n private loadedLanguages: Map<ParserLanguage, any> = new Map();\n private initPromise: Promise<void> | null = null;\n\n /**\n * Parse source code into semantic chunks using tree-sitter.\n */\n async parse(\n content: string,\n filepath: string,\n config?: ParserConfig\n ): Promise<ParseResult> {\n const language = this.detectLanguage(filepath);\n\n if (!language) {\n return {\n chunks: [],\n language: \"typescript\", // Default fallback\n success: false,\n error: `Unsupported file type: ${path.extname(filepath)}`,\n };\n }\n\n try {\n // Initialize tree-sitter if needed\n await this.ensureInitialized();\n\n // Check if grammar is available\n const langModule = await this.loadLanguage(language);\n\n if (!langModule) {\n // Fall back to basic line-based chunking\n return this.fallbackParse(content, filepath, language, config);\n }\n\n // Parse with tree-sitter\n const chunks = await this.parseWithTreeSitter(\n content,\n filepath,\n language,\n langModule,\n config\n );\n\n return {\n chunks,\n language,\n success: true,\n };\n } catch (error) {\n // Fall back to basic parsing on error\n return this.fallbackParse(content, filepath, language, config);\n }\n }\n\n /**\n * Check if this parser can handle the given file.\n */\n canParse(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return ext in EXTENSION_TO_LANGUAGE;\n }\n\n /**\n * Detect language from file extension.\n */\n private detectLanguage(filepath: string): ParserLanguage | null {\n const ext = path.extname(filepath).toLowerCase();\n return EXTENSION_TO_LANGUAGE[ext] || null;\n }\n\n /**\n * Ensure tree-sitter is initialized.\n */\n private async ensureInitialized(): Promise<void> {\n if (this.parserInstance) return;\n\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n\n this.initPromise = this.initializeTreeSitter();\n await this.initPromise;\n }\n\n /**\n * Initialize web-tree-sitter.\n */\n private async initializeTreeSitter(): Promise<void> {\n try {\n const { Parser } = await import(\"web-tree-sitter\");\n\n // Locate the web-tree-sitter.wasm file relative to the web-tree-sitter package\n // This is needed because when installed globally or in different environments,\n // the default path resolution fails to find the WASM file\n const wasmPath = await this.resolveWasmPath();\n\n await Parser.init({\n locateFile: (scriptName: string) => {\n // Return the correct path to the WASM file\n if (scriptName.endsWith(\".wasm\")) {\n return wasmPath;\n }\n return scriptName;\n },\n });\n this.parserInstance = new Parser();\n } catch (error) {\n console.error(\"Failed to initialize web-tree-sitter:\", error);\n throw error;\n }\n }\n\n /**\n * Resolve the path to the web-tree-sitter.wasm file.\n * Tries multiple strategies to find the file.\n */\n private async resolveWasmPath(): Promise<string> {\n // Strategy 1: Try to find it via require.resolve (works in Node.js/Bun)\n try {\n const webTreeSitterPath = require.resolve(\"web-tree-sitter\");\n const wasmPath = path.join(\n path.dirname(webTreeSitterPath),\n \"web-tree-sitter.wasm\"\n );\n if (fs.existsSync(wasmPath)) {\n return wasmPath;\n }\n } catch {\n // require.resolve not available or failed\n }\n\n // Strategy 2: Try relative to __dirname (for bundled scenarios)\n try {\n const possiblePaths = [\n // Relative to this file in node_modules\n path.join(__dirname, \"../../../node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Relative to dist folder\n path.join(__dirname, \"../../node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Relative to package root\n path.join(__dirname, \"../../../../node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // In the same directory (if copied during build)\n path.join(__dirname, \"web-tree-sitter.wasm\"),\n ];\n\n for (const wasmPath of possiblePaths) {\n if (fs.existsSync(wasmPath)) {\n return wasmPath;\n }\n }\n } catch {\n // __dirname not available\n }\n\n // Strategy 3: Return the default name and let Emscripten try to find it\n // This might work in browser environments\n return \"web-tree-sitter.wasm\";\n }\n\n /**\n * Load a language module for tree-sitter.\n * Returns null if the language is not available.\n */\n private async loadLanguage(language: ParserLanguage): Promise<any> {\n // Check cache\n if (this.loadedLanguages.has(language)) {\n return this.loadedLanguages.get(language);\n }\n\n // For now, we'll skip WASM loading and return null\n // This means we'll use the fallback parser\n // TODO: Download and cache WASM files in a future iteration\n return null;\n }\n\n /**\n * Parse source code with tree-sitter.\n */\n private async parseWithTreeSitter(\n content: string,\n filepath: string,\n language: ParserLanguage,\n langModule: any,\n config?: ParserConfig\n ): Promise<ParsedChunk[]> {\n // Set the language\n this.parserInstance.setLanguage(langModule);\n\n // Parse the content\n const tree = this.parserInstance.parse(content);\n const chunks: ParsedChunk[] = [];\n\n // Extract chunks based on language\n switch (language) {\n case \"python\":\n this.extractPythonChunks(tree.rootNode, content, chunks, config);\n break;\n case \"go\":\n this.extractGoChunks(tree.rootNode, content, chunks, config);\n break;\n case \"rust\":\n this.extractRustChunks(tree.rootNode, content, chunks, config);\n break;\n case \"java\":\n this.extractJavaChunks(tree.rootNode, content, chunks, config);\n break;\n default:\n this.extractGenericChunks(tree.rootNode, content, chunks, config);\n }\n\n // Add full file chunk if requested\n if (config?.includeFullFileChunk) {\n const lines = content.split(\"\\n\");\n chunks.unshift({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n isExported: false,\n });\n }\n\n return chunks;\n }\n\n /**\n * Extract chunks from Python AST.\n */\n private extractPythonChunks(\n rootNode: any,\n content: string,\n chunks: ParsedChunk[],\n config?: ParserConfig\n ): void {\n const lines = content.split(\"\\n\");\n\n const visit = (node: any): void => {\n const nodeType = node.type;\n\n // Function definitions\n if (nodeType === \"function_definition\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"function\",\n config\n );\n if (chunk) {\n // Extract docstring\n const body = node.childForFieldName(\"body\");\n if (body && body.firstChild?.type === \"expression_statement\") {\n const expr = body.firstChild.firstChild;\n if (expr?.type === \"string\") {\n chunk.docComment = this.getNodeText(expr, content);\n }\n }\n chunks.push(chunk);\n }\n return;\n }\n\n // Class definitions\n if (nodeType === \"class_definition\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"class\",\n config\n );\n if (chunk) {\n const body = node.childForFieldName(\"body\");\n if (body && body.firstChild?.type === \"expression_statement\") {\n const expr = body.firstChild.firstChild;\n if (expr?.type === \"string\") {\n chunk.docComment = this.getNodeText(expr, content);\n }\n }\n chunks.push(chunk);\n }\n return;\n }\n\n // Recurse into children\n for (let i = 0; i < node.childCount; i++) {\n visit(node.child(i));\n }\n };\n\n visit(rootNode);\n }\n\n /**\n * Extract chunks from Go AST.\n */\n private extractGoChunks(\n rootNode: any,\n content: string,\n chunks: ParsedChunk[],\n config?: ParserConfig\n ): void {\n const lines = content.split(\"\\n\");\n\n const visit = (node: any): void => {\n const nodeType = node.type;\n\n // Function declarations\n if (\n nodeType === \"function_declaration\" ||\n nodeType === \"method_declaration\"\n ) {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"function\",\n config\n );\n if (chunk) {\n const comment = this.findPrecedingComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n // Type declarations\n if (nodeType === \"type_declaration\") {\n const spec = node.namedChild(0);\n if (spec) {\n const specType = spec.childForFieldName(\"type\");\n const chunkType: ChunkType =\n specType?.type === \"interface_type\" ? \"interface\" : \"type\";\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n chunkType,\n config\n );\n if (chunk) {\n const comment = this.findPrecedingComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n }\n return;\n }\n\n // Recurse into children\n for (let i = 0; i < node.childCount; i++) {\n visit(node.child(i));\n }\n };\n\n visit(rootNode);\n }\n\n /**\n * Extract chunks from Rust AST.\n */\n private extractRustChunks(\n rootNode: any,\n content: string,\n chunks: ParsedChunk[],\n config?: ParserConfig\n ): void {\n const lines = content.split(\"\\n\");\n\n const visit = (node: any): void => {\n const nodeType = node.type;\n\n if (nodeType === \"function_item\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"function\",\n config\n );\n if (chunk) {\n const vis = node.childForFieldName(\"visibility\");\n if (vis) {\n chunk.isExported = true;\n }\n const comment = this.findRustDocComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"struct_item\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"class\",\n config\n );\n if (chunk) {\n const vis = node.childForFieldName(\"visibility\");\n if (vis) {\n chunk.isExported = true;\n }\n const comment = this.findRustDocComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"trait_item\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"interface\",\n config\n );\n if (chunk) {\n const vis = node.childForFieldName(\"visibility\");\n if (vis) {\n chunk.isExported = true;\n }\n const comment = this.findRustDocComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"impl_item\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"class\",\n config\n );\n if (chunk) {\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"enum_item\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"enum\",\n config\n );\n if (chunk) {\n const vis = node.childForFieldName(\"visibility\");\n if (vis) {\n chunk.isExported = true;\n }\n const comment = this.findRustDocComment(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n for (let i = 0; i < node.childCount; i++) {\n visit(node.child(i));\n }\n };\n\n visit(rootNode);\n }\n\n /**\n * Extract chunks from Java AST.\n */\n private extractJavaChunks(\n rootNode: any,\n content: string,\n chunks: ParsedChunk[],\n config?: ParserConfig\n ): void {\n const lines = content.split(\"\\n\");\n\n const visit = (node: any): void => {\n const nodeType = node.type;\n\n if (nodeType === \"method_declaration\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"function\",\n config\n );\n if (chunk) {\n const modifiers = node.childForFieldName(\"modifiers\");\n if (modifiers) {\n chunk.isExported = this.getNodeText(modifiers, content).includes(\n \"public\"\n );\n }\n const comment = this.findJavadoc(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"class_declaration\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"class\",\n config\n );\n if (chunk) {\n const modifiers = node.childForFieldName(\"modifiers\");\n if (modifiers) {\n chunk.isExported = this.getNodeText(modifiers, content).includes(\n \"public\"\n );\n }\n const comment = this.findJavadoc(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"interface_declaration\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"interface\",\n config\n );\n if (chunk) {\n const modifiers = node.childForFieldName(\"modifiers\");\n if (modifiers) {\n chunk.isExported = this.getNodeText(modifiers, content).includes(\n \"public\"\n );\n }\n const comment = this.findJavadoc(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n if (nodeType === \"enum_declaration\") {\n const chunk = this.createChunkFromNode(\n node,\n content,\n lines,\n \"enum\",\n config\n );\n if (chunk) {\n const modifiers = node.childForFieldName(\"modifiers\");\n if (modifiers) {\n chunk.isExported = this.getNodeText(modifiers, content).includes(\n \"public\"\n );\n }\n const comment = this.findJavadoc(node, content, lines);\n if (comment) {\n chunk.docComment = comment;\n }\n chunks.push(chunk);\n }\n return;\n }\n\n for (let i = 0; i < node.childCount; i++) {\n visit(node.child(i));\n }\n };\n\n visit(rootNode);\n }\n\n /**\n * Extract generic chunks.\n */\n private extractGenericChunks(\n rootNode: any,\n content: string,\n chunks: ParsedChunk[],\n config?: ParserConfig\n ): void {\n const lines = content.split(\"\\n\");\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n });\n }\n\n /**\n * Create a chunk from a tree-sitter node.\n */\n private createChunkFromNode(\n node: any,\n content: string,\n lines: string[],\n type: ChunkType,\n config?: ParserConfig\n ): ParsedChunk | null {\n const startLine = node.startPosition.row + 1;\n const endLine = node.endPosition.row + 1;\n\n const nodeContent = this.getNodeText(node, content);\n if (!nodeContent.trim()) return null;\n\n let name: string | undefined;\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) {\n name = this.getNodeText(nameNode, content);\n }\n\n return {\n content: nodeContent,\n startLine,\n endLine,\n type,\n name,\n };\n }\n\n /**\n * Get the text content of a tree-sitter node.\n */\n private getNodeText(node: any, content: string): string {\n return content.slice(node.startIndex, node.endIndex);\n }\n\n /**\n * Find a preceding comment (for Go-style comments).\n */\n private findPrecedingComment(\n node: any,\n content: string,\n lines: string[]\n ): string | undefined {\n const startLine = node.startPosition.row;\n if (startLine === 0) return undefined;\n\n const comments: string[] = [];\n for (let i = startLine - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"//\")) {\n comments.unshift(line.slice(2).trim());\n } else if (line === \"\") {\n if (i < startLine - 1) break;\n } else {\n break;\n }\n }\n\n return comments.length > 0 ? comments.join(\"\\n\") : undefined;\n }\n\n /**\n * Find Rust doc comments (/// or //!).\n */\n private findRustDocComment(\n node: any,\n content: string,\n lines: string[]\n ): string | undefined {\n const startLine = node.startPosition.row;\n if (startLine === 0) return undefined;\n\n const comments: string[] = [];\n for (let i = startLine - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n comments.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n if (i < startLine - 1) break;\n } else {\n break;\n }\n }\n\n return comments.length > 0 ? comments.join(\"\\n\") : undefined;\n }\n\n /**\n * Find Javadoc comments.\n */\n private findJavadoc(\n node: any,\n content: string,\n lines: string[]\n ): string | undefined {\n const startLine = node.startPosition.row;\n if (startLine === 0) return undefined;\n\n let inJavadoc = false;\n const comments: string[] = [];\n\n for (let i = startLine - 1; i >= 0; i--) {\n const line = lines[i].trim();\n\n if (line.endsWith(\"*/\")) {\n inJavadoc = true;\n const content = line.slice(0, -2).replace(/^\\*\\s*/, \"\").trim();\n if (content && content !== \"/**\") {\n comments.unshift(content);\n }\n } else if (inJavadoc) {\n if (line.startsWith(\"/**\")) {\n const content = line.slice(3).replace(/\\*\\s*$/, \"\").trim();\n if (content) {\n comments.unshift(content);\n }\n break;\n } else if (line.startsWith(\"*\")) {\n const content = line.slice(1).trim();\n if (content) {\n comments.unshift(content);\n }\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return comments.length > 0 ? comments.join(\"\\n\") : undefined;\n }\n\n /**\n * Fall back to basic line-based parsing.\n */\n private fallbackParse(\n content: string,\n filepath: string,\n language: ParserLanguage,\n config?: ParserConfig\n ): ParseResult {\n const lines = content.split(\"\\n\");\n const chunks: ParsedChunk[] = [];\n\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n return {\n chunks,\n language,\n success: true,\n };\n }\n}\n\n/**\n * Create a new tree-sitter parser instance.\n */\nexport function createTreeSitterParser(): TreeSitterParser {\n return new TreeSitterParser();\n}\n",
|
|
43
45
|
"/**\n * Parser Factory\n *\n * Creates the appropriate parser for a given file or language.\n * Implements the strategy pattern for parser selection.\n *\n * Strategy:\n * - TypeScript/JavaScript: Use TypeScriptParser (TypeScript Compiler API)\n * - Python, Go, Rust, Java: Use TreeSitterParser\n * - Unknown: Fall back to TreeSitterParser or null\n */\n\nimport * as path from \"path\";\nimport type { IParser, ParserLanguage } from \"../../domain/ports/parser\";\nimport { TypeScriptParser } from \"./typescriptParser\";\nimport { TreeSitterParser } from \"./treeSitterParser\";\n\n/**\n * Map from file extension to preferred parser type.\n */\nconst EXTENSION_PARSER_MAP: Record<string, \"typescript\" | \"treesitter\"> = {\n // TypeScript/JavaScript → TypeScript Compiler API (preferred)\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"typescript\",\n \".jsx\": \"typescript\",\n \".mjs\": \"typescript\",\n \".cjs\": \"typescript\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n\n // Other languages → tree-sitter\n \".py\": \"treesitter\",\n \".pyw\": \"treesitter\",\n \".go\": \"treesitter\",\n \".rs\": \"treesitter\",\n \".java\": \"treesitter\",\n};\n\n/**\n * Map from language to preferred parser type.\n */\nconst LANGUAGE_PARSER_MAP: Record<ParserLanguage, \"typescript\" | \"treesitter\"> =\n {\n typescript: \"typescript\",\n javascript: \"typescript\",\n python: \"treesitter\",\n go: \"treesitter\",\n rust: \"treesitter\",\n java: \"treesitter\",\n };\n\n// Singleton parser instances\nlet typescriptParserInstance: TypeScriptParser | null = null;\nlet treeSitterParserInstance: TreeSitterParser | null = null;\n\n/**\n * Get or create the TypeScript parser singleton.\n */\nfunction getTypeScriptParser(): TypeScriptParser {\n if (!typescriptParserInstance) {\n typescriptParserInstance = new TypeScriptParser();\n }\n return typescriptParserInstance;\n}\n\n/**\n * Get or create the tree-sitter parser singleton.\n */\nfunction getTreeSitterParser(): TreeSitterParser {\n if (!treeSitterParserInstance) {\n treeSitterParserInstance = new TreeSitterParser();\n }\n return treeSitterParserInstance;\n}\n\n/**\n * Create a parser for the given file.\n *\n * @param filepath - The file path to get a parser for\n * @returns The appropriate parser, or null if no parser supports the file\n */\nexport function createParserForFile(filepath: string): IParser | null {\n const ext = path.extname(filepath).toLowerCase();\n const parserType = EXTENSION_PARSER_MAP[ext];\n\n if (!parserType) {\n return null;\n }\n\n if (parserType === \"typescript\") {\n return getTypeScriptParser();\n }\n\n return getTreeSitterParser();\n}\n\n/**\n * Create a parser for the given language.\n *\n * @param language - The language to get a parser for\n * @returns The appropriate parser\n */\nexport function createParserForLanguage(language: ParserLanguage): IParser {\n const parserType = LANGUAGE_PARSER_MAP[language];\n\n if (parserType === \"typescript\") {\n return getTypeScriptParser();\n }\n\n return getTreeSitterParser();\n}\n\n/**\n * Detect the language from a file path.\n *\n * @param filepath - The file path to detect language from\n * @returns The detected language, or null if unknown\n */\nexport function detectLanguage(filepath: string): ParserLanguage | null {\n const ext = path.extname(filepath).toLowerCase();\n\n const languageMap: Record<string, ParserLanguage> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".py\": \"python\",\n \".pyw\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n };\n\n return languageMap[ext] || null;\n}\n\n/**\n * Detect languages from a list of file paths.\n * Returns unique languages found.\n *\n * @param filepaths - Array of file paths\n * @returns Set of detected languages\n */\nexport function detectLanguagesFromFiles(\n filepaths: string[]\n): Set<ParserLanguage> {\n const languages = new Set<ParserLanguage>();\n\n for (const filepath of filepaths) {\n const lang = detectLanguage(filepath);\n if (lang) {\n languages.add(lang);\n }\n }\n\n return languages;\n}\n\n/**\n * Check if a file is supported by any parser.\n *\n * @param filepath - The file path to check\n * @returns True if a parser can handle this file\n */\nexport function isFileSupported(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return ext in EXTENSION_PARSER_MAP;\n}\n\n/**\n * Get all supported file extensions.\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_PARSER_MAP);\n}\n\n/**\n * Get all supported languages.\n */\nexport function getSupportedLanguages(): ParserLanguage[] {\n return Object.keys(LANGUAGE_PARSER_MAP) as ParserLanguage[];\n}\n\n",
|
|
44
46
|
"/**\n * Parsing Infrastructure\n *\n * Provides parser implementations for different programming languages.\n *\n * Exports:\n * - TypeScriptParser: Uses TypeScript Compiler API for TS/JS\n * - TreeSitterParser: Uses tree-sitter for Python, Go, Rust, Java\n * - GrammarManager: Manages tree-sitter grammar installation\n * - Parser factory functions for automatic parser selection\n */\n\n// Parser implementations\nexport { TypeScriptParser, createTypeScriptParser } from \"./typescriptParser\";\nexport { TreeSitterParser, createTreeSitterParser } from \"./treeSitterParser\";\n\n// Grammar management\nexport { GrammarManager, getGrammarManager } from \"./grammarManager\";\n\n// Parser factory\nexport {\n createParserForFile,\n createParserForLanguage,\n detectLanguage,\n detectLanguagesFromFiles,\n isFileSupported,\n getSupportedExtensions,\n getSupportedLanguages,\n} from \"./parserFactory\";\n\n",
|
|
45
|
-
"/**\n * Python Language Index Module\n *\n * Provides Python-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .py, .pyw\n *\n * Index location: .raggrep/index/language/python/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const PYTHON_EXTENSIONS = [\".py\", \".pyw\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isPythonFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return PYTHON_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isPythonFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\":\n return 0.04;\n case \"variable\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Python, all top-level definitions are considered \"exported\".\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface PythonModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class PythonModule implements IndexModule {\n readonly id = \"language/python\";\n readonly name = \"Python Search\";\n readonly description =\n \"Python-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isPythonFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isPythonFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Python files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // If parsing failed, fall back to regex-based parsing\n const fallbackChunks = this.parsePythonRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Python.\n * Used when tree-sitter is not available.\n */\n private parsePythonRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function definitions\n const funcRegex = /^(\\s*)(async\\s+)?def\\s+(\\w+)\\s*\\([^)]*\\)\\s*:/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const indent = match[1].length;\n const name = match[3];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the function by tracking indentation\n let endLine = startLine;\n for (let i = startLine; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() === \"\") continue;\n\n const lineIndent = line.match(/^\\s*/)?.[0].length || 0;\n if (lineIndent <= indent && i > startLine) {\n endLine = i;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract docstring\n let docComment: string | undefined;\n const docMatch = funcContent.match(\n /^\\s*(async\\s+)?def\\s+\\w+[^:]+:\\s*\\n\\s*(?:'''|\"\"\")([^]*?)(?:'''|\"\"\")/\n );\n if (docMatch) {\n docComment = docMatch[2].trim();\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported: indent === 0,\n docComment,\n });\n }\n\n // Match class definitions\n const classRegex = /^(\\s*)class\\s+(\\w+)[^:]*:/gm;\n\n while ((match = classRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const indent = match[1].length;\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the class\n let endLine = startLine;\n for (let i = startLine; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() === \"\") continue;\n\n const lineIndent = line.match(/^\\s*/)?.[0].length || 0;\n if (lineIndent <= indent && i > startLine) {\n endLine = i;\n break;\n }\n endLine = i + 1;\n }\n\n const classContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract docstring\n let docComment: string | undefined;\n const docMatch = classContent.match(\n /^class\\s+\\w+[^:]*:\\s*\\n\\s*(?:'''|\"\"\")([^]*?)(?:'''|\"\"\")/\n );\n if (docMatch) {\n docComment = docMatch[1].trim();\n }\n\n chunks.push({\n content: classContent,\n startLine,\n endLine,\n type: \"class\",\n name,\n isExported: indent === 0,\n docComment,\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Parse path context for structural awareness\n const pathContext = parsePathContext(filepath);\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n\n // Generate embeddings for all chunks\n const chunkContents = parsedChunks.map((c) => {\n const namePrefix = c.name ? `${c.name}: ` : \"\";\n const docPrefix = c.docComment ? `${c.docComment} ` : \"\";\n return `${pathPrefix} ${namePrefix}${docPrefix}${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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: PythonModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build file summary\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\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 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 pathContext: {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n },\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n // Extract literals from each chunk\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\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 const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n // Initialize and build literal index\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as PythonModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n synonymsUsed: expandedQuery.wasExpanded\n ? expandedQuery.expandedTerms\n .filter((t) => t.source !== \"original\")\n .map((t) => t.term)\n : undefined,\n },\n });\n }\n }\n\n // Add literal-only results\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunkIds.has(chunkId)) continue;\n\n const filepath = matches[0]?.filepath;\n if (!filepath) continue;\n\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as PythonModuleData;\n\n const chunkIndex = fileIndex.chunks.findIndex((c) => c.id === chunkId);\n if (chunkIndex === -1) continue;\n\n const chunk = fileIndex.chunks[chunkIndex];\n const embedding = moduleData?.embeddings?.[chunkIndex];\n\n let semanticScore = 0;\n if (embedding) {\n semanticScore = cosineSimilarity(queryEmbedding, embedding);\n }\n\n const bm25Score = bm25Scores.get(chunkId) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const literalContribution = calculateLiteralContribution(matches, false);\n\n const baseScore =\n semanticScore > 0\n ? SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score\n : LITERAL_SCORING_CONSTANTS.BASE_SCORE;\n\n const boostedScore = applyLiteralBoost(baseScore, matches, semanticScore > 0);\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n literalOnly: true,\n },\n });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n\n",
|
|
46
|
-
"/**\n * Go Language Index Module\n *\n * Provides Go-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .go\n *\n * Index location: .raggrep/index/language/go/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const GO_EXTENSIONS = [\".go\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isGoFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return GO_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isGoFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\": // Struct\n case \"interface\":\n return 0.04;\n case \"type\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Go, exported symbols start with an uppercase letter.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface GoModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class GoModule implements IndexModule {\n readonly id = \"language/go\";\n readonly name = \"Go Search\";\n readonly description =\n \"Go-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isGoFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isGoFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Go files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // Fall back to regex-based parsing\n const fallbackChunks = this.parseGoRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Go.\n */\n private parseGoRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function declarations\n const funcRegex = /^func\\s+(?:\\(\\s*\\w+\\s+\\*?\\w+\\s*\\)\\s+)?(\\w+)\\s*\\(/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const name = match[1];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Check if exported (starts with uppercase)\n const isExported = /^[A-Z]/.test(name);\n\n // Find the end of the function (matching braces)\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment (Go uses // or /* */ above declarations)\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"//\")) {\n docLines.unshift(line.slice(2).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported,\n docComment,\n });\n }\n\n // Match type declarations (struct and interface)\n const typeRegex = /^type\\s+(\\w+)\\s+(struct|interface)\\s*\\{/gm;\n\n while ((match = typeRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const name = match[1];\n const kind = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Check if exported\n const isExported = /^[A-Z]/.test(name);\n\n // Find end of type definition\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const typeContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"//\")) {\n docLines.unshift(line.slice(2).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: typeContent,\n startLine,\n endLine,\n type: kind === \"interface\" ? \"interface\" : \"class\",\n name,\n isExported,\n docComment,\n });\n }\n\n // Match const blocks\n const constRegex = /^const\\s+\\(/gm;\n\n while ((match = constRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find end of const block\n let parenCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"(\") {\n parenCount++;\n foundStart = true;\n } else if (char === \")\") {\n parenCount--;\n }\n }\n\n if (foundStart && parenCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const constContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n chunks.push({\n content: constContent,\n startLine,\n endLine,\n type: \"block\",\n name: \"constants\",\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n const pathContext = parsePathContext(filepath);\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n\n const chunkContents = parsedChunks.map((c) => {\n const namePrefix = c.name ? `${c.name}: ` : \"\";\n const docPrefix = c.docComment ? `${c.docComment} ` : \"\";\n return `${pathPrefix} ${namePrefix}${docPrefix}${c.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: GoModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\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 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 pathContext: {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n },\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as GoModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
|
|
47
|
-
"/**\n * Rust Language Index Module\n *\n * Provides Rust-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .rs\n *\n * Index location: .raggrep/index/language/rust/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const RUST_EXTENSIONS = [\".rs\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isRustFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return RUST_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isRustFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\": // Struct\n case \"interface\": // Trait\n return 0.04;\n case \"enum\":\n return 0.03;\n case \"type\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Rust, pub items are exported.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface RustModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class RustModule implements IndexModule {\n readonly id = \"language/rust\";\n readonly name = \"Rust Search\";\n readonly description =\n \"Rust-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isRustFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isRustFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Rust files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // Fall back to regex-based parsing\n const fallbackChunks = this.parseRustRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Rust.\n */\n private parseRustRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function declarations\n const funcRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?(?:async\\s+)?fn\\s+(\\w+)/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the function (matching braces)\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment (Rust uses /// for doc comments)\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match struct declarations\n const structRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?struct\\s+(\\w+)/gm;\n\n while ((match = structRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find end of struct\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n\n // Handle tuple structs: struct Foo(i32);\n if (!foundStart && line.includes(\";\") && !line.includes(\"{\")) {\n endLine = i + 1;\n break;\n }\n\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const structContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: structContent,\n startLine,\n endLine,\n type: \"class\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match trait declarations\n const traitRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?trait\\s+(\\w+)/gm;\n\n while ((match = traitRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const traitContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: traitContent,\n startLine,\n endLine,\n type: \"interface\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match enum declarations\n const enumRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?enum\\s+(\\w+)/gm;\n\n while ((match = enumRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const enumContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: enumContent,\n startLine,\n endLine,\n type: \"enum\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n const pathContext = parsePathContext(filepath);\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n\n const chunkContents = parsedChunks.map((c) => {\n const namePrefix = c.name ? `${c.name}: ` : \"\";\n const docPrefix = c.docComment ? `${c.docComment} ` : \"\";\n return `${pathPrefix} ${namePrefix}${docPrefix}${c.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: RustModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\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 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 pathContext: {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n },\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as RustModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
|
|
47
|
+
"/**\n * Python Language Index Module\n *\n * Provides Python-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .py, .pyw\n *\n * Index location: .raggrep/index/language/python/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const PYTHON_EXTENSIONS = [\".py\", \".pyw\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isPythonFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return PYTHON_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isPythonFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\":\n return 0.04;\n case \"variable\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Python, all top-level definitions are considered \"exported\".\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface PythonModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class PythonModule implements IndexModule {\n readonly id = \"language/python\";\n readonly name = \"Python Search\";\n readonly description =\n \"Python-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isPythonFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isPythonFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Python files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // If parsing failed, fall back to regex-based parsing\n const fallbackChunks = this.parsePythonRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Python.\n * Used when tree-sitter is not available.\n */\n private parsePythonRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function definitions\n const funcRegex = /^(\\s*)(async\\s+)?def\\s+(\\w+)\\s*\\([^)]*\\)\\s*:/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const indent = match[1].length;\n const name = match[3];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the function by tracking indentation\n let endLine = startLine;\n for (let i = startLine; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() === \"\") continue;\n\n const lineIndent = line.match(/^\\s*/)?.[0].length || 0;\n if (lineIndent <= indent && i > startLine) {\n endLine = i;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract docstring\n let docComment: string | undefined;\n const docMatch = funcContent.match(\n /^\\s*(async\\s+)?def\\s+\\w+[^:]+:\\s*\\n\\s*(?:'''|\"\"\")([^]*?)(?:'''|\"\"\")/\n );\n if (docMatch) {\n docComment = docMatch[2].trim();\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported: indent === 0,\n docComment,\n });\n }\n\n // Match class definitions\n const classRegex = /^(\\s*)class\\s+(\\w+)[^:]*:/gm;\n\n while ((match = classRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const indent = match[1].length;\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the class\n let endLine = startLine;\n for (let i = startLine; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() === \"\") continue;\n\n const lineIndent = line.match(/^\\s*/)?.[0].length || 0;\n if (lineIndent <= indent && i > startLine) {\n endLine = i;\n break;\n }\n endLine = i + 1;\n }\n\n const classContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract docstring\n let docComment: string | undefined;\n const docMatch = classContent.match(\n /^class\\s+\\w+[^:]*:\\s*\\n\\s*(?:'''|\"\"\")([^]*?)(?:'''|\"\"\")/\n );\n if (docMatch) {\n docComment = docMatch[1].trim();\n }\n\n chunks.push({\n content: classContent,\n startLine,\n endLine,\n type: \"class\",\n name,\n isExported: indent === 0,\n docComment,\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Generate embeddings for all chunks with path context\n // Using the unified prepareChunkForEmbedding utility for consistent path injection\n const chunkContents = parsedChunks.map((c) => {\n return prepareChunkForEmbedding({\n filepath,\n content: c.content,\n name: c.name,\n docComment: c.docComment,\n });\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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: PythonModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build file summary with path keywords\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n const contentKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach((k) => contentKeywords.add(k));\n }\n const pathKeywords = extractPathKeywordsForFileSummary(filepath);\n const allKeywords = [...contentKeywords, ...pathKeywords];\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: [...new Set(allKeywords)],\n exports,\n lastModified: stats.lastModified,\n pathContext: getPathContextForFileSummary(filepath),\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n // Extract literals from each chunk\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\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 const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n // Initialize and build literal index\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as PythonModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n synonymsUsed: expandedQuery.wasExpanded\n ? expandedQuery.expandedTerms\n .filter((t) => t.source !== \"original\")\n .map((t) => t.term)\n : undefined,\n },\n });\n }\n }\n\n // Add literal-only results\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunkIds.has(chunkId)) continue;\n\n const filepath = matches[0]?.filepath;\n if (!filepath) continue;\n\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as PythonModuleData;\n\n const chunkIndex = fileIndex.chunks.findIndex((c) => c.id === chunkId);\n if (chunkIndex === -1) continue;\n\n const chunk = fileIndex.chunks[chunkIndex];\n const embedding = moduleData?.embeddings?.[chunkIndex];\n\n let semanticScore = 0;\n if (embedding) {\n semanticScore = cosineSimilarity(queryEmbedding, embedding);\n }\n\n const bm25Score = bm25Scores.get(chunkId) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const literalContribution = calculateLiteralContribution(matches, false);\n\n const baseScore =\n semanticScore > 0\n ? SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score\n : LITERAL_SCORING_CONSTANTS.BASE_SCORE;\n\n const boostedScore = applyLiteralBoost(baseScore, matches, semanticScore > 0);\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n literalOnly: true,\n },\n });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n\n",
|
|
48
|
+
"/**\n * Go Language Index Module\n *\n * Provides Go-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .go\n *\n * Index location: .raggrep/index/language/go/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const GO_EXTENSIONS = [\".go\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isGoFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return GO_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isGoFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\": // Struct\n case \"interface\":\n return 0.04;\n case \"type\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Go, exported symbols start with an uppercase letter.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface GoModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class GoModule implements IndexModule {\n readonly id = \"language/go\";\n readonly name = \"Go Search\";\n readonly description =\n \"Go-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isGoFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isGoFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Go files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // Fall back to regex-based parsing\n const fallbackChunks = this.parseGoRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Go.\n */\n private parseGoRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function declarations\n const funcRegex = /^func\\s+(?:\\(\\s*\\w+\\s+\\*?\\w+\\s*\\)\\s+)?(\\w+)\\s*\\(/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const name = match[1];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Check if exported (starts with uppercase)\n const isExported = /^[A-Z]/.test(name);\n\n // Find the end of the function (matching braces)\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment (Go uses // or /* */ above declarations)\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"//\")) {\n docLines.unshift(line.slice(2).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported,\n docComment,\n });\n }\n\n // Match type declarations (struct and interface)\n const typeRegex = /^type\\s+(\\w+)\\s+(struct|interface)\\s*\\{/gm;\n\n while ((match = typeRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const name = match[1];\n const kind = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Check if exported\n const isExported = /^[A-Z]/.test(name);\n\n // Find end of type definition\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const typeContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"//\")) {\n docLines.unshift(line.slice(2).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: typeContent,\n startLine,\n endLine,\n type: kind === \"interface\" ? \"interface\" : \"class\",\n name,\n isExported,\n docComment,\n });\n }\n\n // Match const blocks\n const constRegex = /^const\\s+\\(/gm;\n\n while ((match = constRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find end of const block\n let parenCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"(\") {\n parenCount++;\n foundStart = true;\n } else if (char === \")\") {\n parenCount--;\n }\n }\n\n if (foundStart && parenCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const constContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n chunks.push({\n content: constContent,\n startLine,\n endLine,\n type: \"block\",\n name: \"constants\",\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Generate embeddings for all chunks with path context\n // Using the unified prepareChunkForEmbedding utility for consistent path injection\n const chunkContents = parsedChunks.map((c) => {\n return prepareChunkForEmbedding({\n filepath,\n content: c.content,\n name: c.name,\n docComment: c.docComment,\n });\n });\n const embeddings = await getEmbeddings(chunkContents);\n\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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: GoModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build file summary with path keywords\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n const contentKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach((k) => contentKeywords.add(k));\n }\n const pathKeywords = extractPathKeywordsForFileSummary(filepath);\n const allKeywords = [...contentKeywords, ...pathKeywords];\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: [...new Set(allKeywords)],\n exports,\n lastModified: stats.lastModified,\n pathContext: getPathContextForFileSummary(filepath),\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as GoModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
|
|
49
|
+
"/**\n * Rust Language Index Module\n *\n * Provides Rust-aware code search using:\n * - AST parsing via tree-sitter (with regex fallback)\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .rs\n *\n * Index location: .raggrep/index/language/rust/\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 {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n calculateFileTypeBoost,\n extractQueryTerms,\n parseQueryLiterals,\n extractLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport { createParserForFile } from \"../../../infrastructure/parsing\";\nimport type { EmbeddingConfig, Logger, ParsedChunk } from \"../../../domain/ports\";\nimport type { FileSummary, ExtractedLiteral, LiteralMatch } from \"../../../domain/entities\";\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/** File extensions supported by this module */\nexport const RUST_EXTENSIONS = [\".rs\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isRustFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return RUST_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isRustFile;\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n */\nfunction generateChunkId(\n filepath: string,\n startLine: number,\n endLine: number\n): string {\n const safePath = filepath.replace(/[/\\\\]/g, \"-\").replace(/\\./g, \"_\");\n return `${safePath}-${startLine}-${endLine}`;\n}\n\n/**\n * Calculate boost based on chunk type.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\": // Struct\n case \"interface\": // Trait\n return 0.04;\n case \"enum\":\n return 0.03;\n case \"type\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * In Rust, pub items are exported.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index.\n */\nexport interface RustModuleData {\n embeddings: number[][];\n embeddingModel: string;\n [key: string]: unknown;\n}\n\nexport class RustModule implements IndexModule {\n readonly id = \"language/rust\";\n readonly name = \"Rust Search\";\n readonly description =\n \"Rust-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isRustFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n if (!isRustFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Get the parser for Rust files\n const parser = createParserForFile(filepath);\n\n if (!parser) {\n return null;\n }\n\n // Parse the file\n const parseResult = await parser.parse(content, filepath, {\n includeFullFileChunk: true,\n associateComments: true,\n });\n\n if (!parseResult.success || parseResult.chunks.length === 0) {\n // Fall back to regex-based parsing\n const fallbackChunks = this.parseRustRegex(content, filepath);\n if (fallbackChunks.length === 0) {\n return null;\n }\n\n return this.createFileIndex(filepath, content, fallbackChunks, ctx);\n }\n\n return this.createFileIndex(filepath, content, parseResult.chunks, ctx);\n }\n\n /**\n * Regex-based fallback parser for Rust.\n */\n private parseRustRegex(content: string, filepath: string): ParsedChunk[] {\n const chunks: ParsedChunk[] = [];\n const lines = content.split(\"\\n\");\n\n // Add full file chunk\n chunks.push({\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n name: path.basename(filepath),\n });\n\n // Match function declarations\n const funcRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?(?:async\\s+)?fn\\s+(\\w+)/gm;\n let match;\n\n while ((match = funcRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find the end of the function (matching braces)\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const funcContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment (Rust uses /// for doc comments)\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: funcContent,\n startLine,\n endLine,\n type: \"function\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match struct declarations\n const structRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?struct\\s+(\\w+)/gm;\n\n while ((match = structRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n // Find end of struct\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n\n // Handle tuple structs: struct Foo(i32);\n if (!foundStart && line.includes(\";\") && !line.includes(\"{\")) {\n endLine = i + 1;\n break;\n }\n\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const structContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n // Extract doc comment\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: structContent,\n startLine,\n endLine,\n type: \"class\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match trait declarations\n const traitRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?trait\\s+(\\w+)/gm;\n\n while ((match = traitRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const traitContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: traitContent,\n startLine,\n endLine,\n type: \"interface\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n // Match enum declarations\n const enumRegex = /^(pub(?:\\s*\\([^)]*\\))?\\s+)?enum\\s+(\\w+)/gm;\n\n while ((match = enumRegex.exec(content)) !== null) {\n const startIdx = match.index;\n const isPublic = !!match[1];\n const name = match[2];\n const startLine = content.slice(0, startIdx).split(\"\\n\").length;\n\n let braceCount = 0;\n let endLine = startLine;\n let foundStart = false;\n\n for (let i = startLine - 1; i < lines.length; i++) {\n const line = lines[i];\n for (const char of line) {\n if (char === \"{\") {\n braceCount++;\n foundStart = true;\n } else if (char === \"}\") {\n braceCount--;\n }\n }\n\n if (foundStart && braceCount === 0) {\n endLine = i + 1;\n break;\n }\n endLine = i + 1;\n }\n\n const enumContent = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n let docComment: string | undefined;\n const docLines: string[] = [];\n for (let i = startLine - 2; i >= 0; i--) {\n const line = lines[i].trim();\n if (line.startsWith(\"///\") || line.startsWith(\"//!\")) {\n docLines.unshift(line.slice(3).trim());\n } else if (line === \"\") {\n continue;\n } else {\n break;\n }\n }\n if (docLines.length > 0) {\n docComment = docLines.join(\"\\n\");\n }\n\n chunks.push({\n content: enumContent,\n startLine,\n endLine,\n type: \"enum\",\n name,\n isExported: isPublic,\n docComment,\n });\n }\n\n return chunks;\n }\n\n /**\n * Create file index from parsed chunks.\n */\n private async createFileIndex(\n filepath: string,\n content: string,\n parsedChunks: ParsedChunk[],\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Generate embeddings for all chunks with path context\n // Using the unified prepareChunkForEmbedding utility for consistent path injection\n const chunkContents = parsedChunks.map((c) => {\n return prepareChunkForEmbedding({\n filepath,\n content: c.content,\n name: c.name,\n docComment: c.docComment,\n });\n });\n const embeddings = await getEmbeddings(chunkContents);\n\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 as ChunkType,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.docComment,\n }));\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: RustModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build file summary with path keywords\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type as ChunkType)),\n ];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n const contentKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach((k) => contentKeywords.add(k));\n }\n const pathKeywords = extractPathKeywordsForFileSummary(filepath);\n const allKeywords = [...contentKeywords, ...pathKeywords];\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: [...new Set(allKeywords)],\n exports,\n lastModified: stats.lastModified,\n pathContext: getPathContextForFileSummary(filepath),\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n for (const chunk of chunks) {\n const literals = extractLiterals(chunk);\n if (literals.length > 0) {\n const existing = this.pendingLiterals.get(chunk.id);\n if (existing) {\n existing.literals.push(...literals);\n } else {\n this.pendingLiterals.set(chunk.id, { filepath, literals });\n }\n }\n }\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n const updatedFilepaths: string[] = [];\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n await this.literalIndex.save();\n\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet\n }\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.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 const semanticQuery = remainingQuery.trim() || query;\n const expandedQuery = expandQuery(semanticQuery, undefined, {\n maxDepth: 1,\n includeWeak: false,\n maxTerms: 10,\n });\n\n const queryEmbedding = await getEmbedding(expandedQuery.expandedQueryString);\n\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as RustModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\n\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const pathCtx = summary.pathContext;\n\n if (\n pathCtx.domain &&\n queryTerms.some(\n (t) => pathCtx.domain!.includes(t) || t.includes(pathCtx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n if (\n pathCtx.layer &&\n queryTerms.some(\n (t) => pathCtx.layer!.includes(t) || t.includes(pathCtx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n const segmentMatch = pathCtx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\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 const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const additiveBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n const baseScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true\n );\n const boostedScore = applyLiteralBoost(baseScore, literalMatches, true);\n\n const finalScore = boostedScore + additiveBoost;\n\n processedChunkIds.add(chunk.id);\n\n if (\n finalScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
|
|
48
50
|
"/**\n * JSON Data Index Module\n *\n * Provides JSON file search using:\n * - Literal indexing of dot-notation key paths (e.g., \"package.dependencies.react\")\n * - BM25 keyword matching for fuzzy search\n *\n * Note: This module uses literal-only indexing (no embeddings) for fast indexing.\n * JSON keys are indexed as dot-notation paths prefixed with the filename.\n *\n * Supported file types: .json\n *\n * Index location: .raggrep/index/data/json/\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} from \"../../../types\";\nimport {\n BM25Index,\n normalizeScore,\n generateChunkId,\n // Literal boosting\n parseQueryLiterals,\n calculateLiteralContribution,\n applyLiteralBoost,\n LITERAL_SCORING_CONSTANTS,\n // JSON path extraction\n extractJsonPaths,\n extractJsonKeywords,\n} from \"../../../domain/services\";\nimport { getRaggrepDir } from \"../../../infrastructure/config\";\nimport { SymbolicIndex, LiteralIndex } from \"../../../infrastructure/storage\";\nimport type { Logger } from \"../../../domain/ports\";\nimport type {\n FileSummary,\n ExtractedLiteral,\n LiteralMatch,\n} from \"../../../domain/entities\";\n\n/** Default minimum similarity score for search results */\nexport const DEFAULT_MIN_SCORE = 0.1;\n\n/** Default number of results to return */\nexport const DEFAULT_TOP_K = 10;\n\n/** Weight for BM25 keyword matching in scoring */\nconst BM25_WEIGHT = 0.4;\n\n/** Weight for literal matching in scoring */\nconst LITERAL_WEIGHT = 0.6;\n\n/** File extensions supported by this module */\nexport const JSON_EXTENSIONS = [\".json\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isJsonFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return JSON_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isJsonFile;\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface JsonModuleData {\n /** Dot-notation paths extracted from the JSON file */\n jsonPaths: string[];\n [key: string]: unknown;\n}\n\nexport class JsonModule implements IndexModule {\n readonly id = \"data/json\";\n readonly name = \"JSON Search\";\n readonly description =\n \"JSON file search with literal-based key path indexing\";\n readonly version = \"2.0.0\"; // Bumped for literal-only mode\n\n supportsFile(filepath: string): boolean {\n return isJsonFile(filepath);\n }\n\n private symbolicIndex: SymbolicIndex | null = null;\n private literalIndex: LiteralIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n /** Map from chunkId → { filepath, literals } for building literal index */\n private pendingLiterals: Map<\n string,\n { filepath: string; literals: ExtractedLiteral[] }\n > = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.logger = config.options?.logger as Logger | undefined;\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process JSON files\n if (!isJsonFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Parse JSON content\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n // Invalid JSON, skip indexing\n return null;\n }\n\n // Get filename without extension for path prefix\n const fileBasename = path.basename(filepath, path.extname(filepath));\n\n // Extract dot-notation paths as literals\n const jsonPathLiterals = extractJsonPaths(parsed, fileBasename);\n\n // Count lines for chunk metadata\n const lines = content.split(\"\\n\");\n const lineCount = lines.length;\n\n // Create single chunk for the entire file\n const chunkId = generateChunkId(filepath, 1, lineCount);\n const chunks: Chunk[] = [\n {\n id: chunkId,\n content: content,\n startLine: 1,\n endLine: lineCount,\n type: \"file\",\n },\n ];\n\n // Store literals for finalize\n if (jsonPathLiterals.length > 0) {\n this.pendingLiterals.set(chunkId, {\n filepath,\n literals: jsonPathLiterals,\n });\n }\n\n const stats = await ctx.getFileStats(filepath);\n\n // Module data without embeddings\n const moduleData: JsonModuleData = {\n jsonPaths: jsonPathLiterals.map((l) => l.value),\n };\n\n // Build file summary with keywords for BM25\n const keywords = extractJsonKeywords(parsed);\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: 1,\n chunkTypes: [\"file\"],\n keywords,\n exports: [], // JSON files don't have exports\n lastModified: stats.lastModified,\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n /**\n * Finalize indexing by building and saving the symbolic and literal indexes.\n * Uses incremental updates when possible to avoid full rebuilds.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index (loads existing data including BM25)\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Track which files were updated for incremental save\n const updatedFilepaths: string[] = [];\n\n // Add all pending summaries incrementally (updates BM25 as we go)\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n // Save to disk (only saves updated files + serialized BM25)\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n // Initialize and build literal index\n this.literalIndex = new LiteralIndex(indexDir, this.id);\n await this.literalIndex.initialize();\n\n // Get all filepaths that were indexed in this run\n const indexedFilepaths = new Set<string>();\n for (const filepath of this.pendingSummaries.keys()) {\n indexedFilepaths.add(filepath);\n }\n for (const { filepath } of this.pendingLiterals.values()) {\n indexedFilepaths.add(filepath);\n }\n\n // Remove old literals for all files that were re-indexed\n for (const filepath of indexedFilepaths) {\n this.literalIndex.removeFile(filepath);\n }\n\n // Add all pending literals\n for (const [chunkId, { filepath, literals }] of this.pendingLiterals) {\n this.literalIndex.addLiterals(chunkId, filepath, literals);\n }\n\n // Save literal index to disk\n await this.literalIndex.save();\n\n // Clear pending data\n this.pendingSummaries.clear();\n this.pendingLiterals.clear();\n }\n\n /**\n * Search the JSON index for files matching the query.\n *\n * Uses a two-source approach:\n * 1. Literal index for exact path matches (e.g., `package.dependencies.react`)\n * 2. BM25 keyword search for fuzzy matching\n *\n * @param query - Search query (supports backticks for exact literal matching)\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 {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n // Parse query for literals (explicit backticks/quotes and implicit patterns)\n const { literals: queryLiterals, remainingQuery } =\n parseQueryLiterals(query);\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Load symbolic index for BM25 and file listing\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n // Load literal index for exact-match boosting\n const literalIndex = new LiteralIndex(indexDir, this.id);\n let literalMatchMap = new Map<string, LiteralMatch[]>();\n\n try {\n await literalIndex.initialize();\n literalMatchMap = literalIndex.buildMatchMap(queryLiterals);\n } catch {\n // Literal index doesn't exist yet, continue without it\n }\n\n // Get all indexed JSON files\n let allFiles: string[];\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Filter to JSON files only\n let filesToSearch = allFiles.filter((f) => isJsonFile(f));\n\n // Apply file pattern filter if specified\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = filesToSearch.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 // Build BM25 index from all chunks\n const bm25Index = new BM25Index();\n const allChunksData: Array<{\n filepath: string;\n chunk: Chunk;\n }> = [];\n\n for (const filepath of filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n for (const chunk of fileIndex.chunks) {\n allChunksData.push({\n filepath: fileIndex.filepath,\n chunk,\n });\n\n // Add to BM25 index\n bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\n // Perform BM25 search\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 // Calculate scores for all chunks\n const results: SearchResult[] = [];\n const processedChunkIds = new Set<string>();\n\n for (const { filepath, chunk } of allChunksData) {\n const bm25Score = bm25Scores.get(chunk.id) || 0;\n\n // Get literal matches for this chunk\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n bm25Score > 0 // hasSemanticOrBm25\n );\n\n // Base score from BM25\n const baseScore = BM25_WEIGHT * bm25Score;\n\n // Apply literal boosting\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n bm25Score > 0\n );\n\n // Add literal contribution if no BM25 score\n const literalBase =\n literalMatches.length > 0 && bm25Score === 0\n ? LITERAL_SCORING_CONSTANTS.BASE_SCORE * LITERAL_WEIGHT\n : 0;\n\n const finalScore = boostedScore + literalBase;\n\n processedChunkIds.add(chunk.id);\n\n // Include if score meets threshold or has literal matches\n if (finalScore >= minScore || literalMatches.length > 0) {\n results.push({\n filepath,\n chunk,\n score: finalScore,\n moduleId: this.id,\n context: {\n bm25Score,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n },\n });\n }\n }\n\n // Add literal-only results (chunks found by literal index but not loaded)\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunkIds.has(chunkId)) {\n continue;\n }\n\n const filepath = matches[0]?.filepath;\n if (!filepath) continue;\n\n // Load the file index\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const chunk = fileIndex.chunks.find((c) => c.id === chunkId);\n if (!chunk) continue;\n\n const literalContribution = calculateLiteralContribution(matches, false);\n\n const score =\n LITERAL_SCORING_CONSTANTS.BASE_SCORE * literalContribution.multiplier;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score,\n moduleId: this.id,\n context: {\n bm25Score: 0,\n literalMultiplier: literalContribution.multiplier,\n literalMatchType: literalContribution.bestMatchType,\n literalConfidence: literalContribution.bestConfidence,\n literalMatchCount: literalContribution.matchCount,\n literalOnly: true,\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",
|
|
49
|
-
"/**\n * Markdown Documentation Index Module\n *\n * Provides Markdown file search using:\n * - Heading-based section parsing\n * - Local text embeddings for semantic similarity\n * - Structure-aware chunking\n *\n * Supported file types: .md\n *\n * Index location: .raggrep/index/docs/markdown/\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} from \"../../../types\";\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from \"../../../infrastructure/embeddings\";\nimport {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractQueryTerms,\n generateChunkId,\n // Content phrase matching\n calculatePhraseMatch,\n PHRASE_MATCH_CONSTANTS,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type { FileSummary, ChunkType } from \"../../../domain/entities\";\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 * Calculate boost based on heading level.\n * More specific sections (higher heading numbers) get a slight boost\n * because they're more targeted matches.\n */\nfunction calculateHeadingLevelBoost(chunk: Chunk): number {\n const metadata = chunk.metadata as { headingLevel?: number } | undefined;\n const level = metadata?.headingLevel ?? 0;\n\n // Boost based on specificity:\n // - H4/H5: +0.05 (most specific)\n // - H3: +0.03\n // - H2: +0.02\n // - H1: +0.01 (least specific but valuable for overview)\n // - Preamble/full: 0\n switch (level) {\n case 4:\n case 5:\n case 6:\n return 0.05;\n case 3:\n return 0.03;\n case 2:\n return 0.02;\n case 1:\n return 0.01;\n default:\n return 0;\n }\n}\n\n/** File extensions supported by this module */\nexport const MARKDOWN_EXTENSIONS = [\".md\", \".txt\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isMarkdownFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return MARKDOWN_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isMarkdownFile;\n\n/**\n * Represents a parsed section from a Markdown document.\n */\ninterface MarkdownSection {\n /** The heading text (without #) */\n heading: string;\n /** The heading level (1-6) */\n level: number;\n /** The content under this heading */\n content: string;\n /** 1-based start line number */\n startLine: number;\n /** 1-based end line number */\n endLine: number;\n}\n\n/**\n * Parse Markdown content into sections based on headings.\n */\nfunction parseMarkdownSections(content: string): MarkdownSection[] {\n const lines = content.split(\"\\n\");\n const sections: MarkdownSection[] = [];\n\n let currentSection: MarkdownSection | null = null;\n let currentContent: string[] = [];\n let startLine = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n // Save previous section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = i; // Previous line\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // Content before first heading\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: i,\n });\n }\n\n // Start new section\n currentSection = {\n heading: headingMatch[2],\n level: headingMatch[1].length,\n content: \"\",\n startLine: i + 1,\n endLine: lines.length,\n };\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n // Save final section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = lines.length;\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // No headings at all\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: lines.length,\n });\n }\n\n return sections;\n}\n\n/**\n * Represents a hierarchical chunk that includes nested content.\n */\ninterface HierarchicalChunk {\n /** The heading text */\n heading: string;\n /** The heading level (1-6, 0 for preamble) */\n level: number;\n /** Full content including nested sections */\n content: string;\n /** 1-based start line */\n startLine: number;\n /** 1-based end line */\n endLine: number;\n /** Type identifier for the chunk (h1, h2, etc.) */\n chunkType: string;\n}\n\n/**\n * Parse Markdown content into hierarchical chunks.\n *\n * Creates chunks at multiple granularities:\n * - H1 chunks: Contain all nested content (h2, h3, h4, etc.)\n * - H2 chunks: Contain h2 and its nested h3, h4 content\n * - H3 chunks: Contain h3 and its nested h4, h5 content\n * - etc.\n *\n * This enables searching at different \"zoom levels\".\n */\nfunction parseMarkdownHierarchical(\n content: string,\n maxDepth: number = 4\n): HierarchicalChunk[] {\n const lines = content.split(\"\\n\");\n const chunks: HierarchicalChunk[] = [];\n\n // First pass: identify all heading positions\n interface HeadingInfo {\n level: number;\n heading: string;\n lineIndex: number; // 0-based\n }\n\n const headings: HeadingInfo[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)$/);\n if (match) {\n headings.push({\n level: match[1].length,\n heading: match[2],\n lineIndex: i,\n });\n }\n }\n\n // If no headings, return single chunk\n if (headings.length === 0) {\n chunks.push({\n heading: \"\",\n level: 0,\n content: content,\n startLine: 1,\n endLine: lines.length,\n chunkType: \"full\",\n });\n return chunks;\n }\n\n // Add preamble if there's content before first heading\n if (headings[0].lineIndex > 0) {\n const preambleContent = lines.slice(0, headings[0].lineIndex).join(\"\\n\").trim();\n if (preambleContent) {\n chunks.push({\n heading: \"\",\n level: 0,\n content: preambleContent,\n startLine: 1,\n endLine: headings[0].lineIndex,\n chunkType: \"preamble\",\n });\n }\n }\n\n // For each heading, find where its section ends\n // A section ends when we hit a heading of the same or higher level\n for (let i = 0; i < headings.length; i++) {\n const current = headings[i];\n\n // Only process headings up to maxDepth\n if (current.level > maxDepth) continue;\n\n // Find where this section ends\n let endLineIndex = lines.length; // Default to end of file\n\n for (let j = i + 1; j < headings.length; j++) {\n // Section ends at next heading of same or higher level (lower number)\n if (headings[j].level <= current.level) {\n endLineIndex = headings[j].lineIndex;\n break;\n }\n }\n\n // Extract content from start of heading to end of section\n const sectionContent = lines.slice(current.lineIndex, endLineIndex).join(\"\\n\");\n\n chunks.push({\n heading: current.heading,\n level: current.level,\n content: sectionContent,\n startLine: current.lineIndex + 1,\n endLine: endLineIndex,\n chunkType: `h${current.level}`,\n });\n }\n\n return chunks;\n}\n\n/**\n * Extract keywords from Markdown content.\n */\nfunction extractMarkdownKeywords(content: string): string[] {\n const keywords: string[] = [];\n\n // Extract headings\n const headingMatches = content.matchAll(/^#{1,6}\\s+(.+)$/gm);\n for (const match of headingMatches) {\n const heading = match[1].toLowerCase();\n const words = heading.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract bold/emphasized text\n const emphasisMatches = content.matchAll(/\\*\\*(.+?)\\*\\*|\\*(.+?)\\*/g);\n for (const match of emphasisMatches) {\n const text = (match[1] || match[2] || \"\").toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract code blocks (inline)\n const codeMatches = content.matchAll(/`([^`]+)`/g);\n for (const match of codeMatches) {\n const code = match[1].toLowerCase();\n if (code.length > 2 && code.length < 50) {\n keywords.push(code);\n }\n }\n\n // Extract links\n const linkMatches = content.matchAll(/\\[([^\\]]+)\\]/g);\n for (const match of linkMatches) {\n const text = match[1].toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n return [...new Set(keywords)];\n}\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface MarkdownModuleData {\n embeddings: number[][];\n embeddingModel: string;\n headings: string[];\n [key: string]: unknown;\n}\n\nexport class MarkdownModule implements IndexModule {\n readonly id = \"docs/markdown\";\n readonly name = \"Markdown Search\";\n readonly description =\n \"Markdown documentation search with section-aware indexing\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isMarkdownFile(filepath);\n }\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 private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process Markdown files\n if (!isMarkdownFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Parse Markdown into hierarchical sections\n // This creates chunks at multiple granularities (h1, h2, h3, h4)\n const hierarchicalChunks = parseMarkdownHierarchical(content, 4);\n\n if (hierarchicalChunks.length === 0) {\n return null;\n }\n\n // Generate embeddings for all chunks\n const chunkContents = hierarchicalChunks.map((s) => {\n const filename = path.basename(filepath);\n const headingContext = s.heading ? `${s.heading}: ` : \"\";\n return `${filename} ${headingContext}${s.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks from hierarchical sections\n const chunks: Chunk[] = hierarchicalChunks.map((section) => ({\n id: generateChunkId(filepath, section.startLine, section.endLine),\n content: section.content,\n startLine: section.startLine,\n endLine: section.endLine,\n type: \"block\" as ChunkType,\n name: section.heading || undefined,\n // Store chunk type in metadata for scoring\n metadata: {\n headingLevel: section.level,\n chunkType: section.chunkType,\n },\n }));\n\n // Extract headings for metadata (unique headings only)\n const headings = hierarchicalChunks\n .filter((s) => s.heading)\n .map((s) => s.heading);\n const uniqueHeadings = [...new Set(headings)];\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: MarkdownModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n headings: uniqueHeadings,\n };\n\n // Build file summary\n const keywords = extractMarkdownKeywords(content);\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes: [\"block\"],\n keywords,\n exports: uniqueHeadings, // Use headings as \"exports\" for searchability\n lastModified: stats.lastModified,\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index (loads existing data including BM25)\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Track which files were updated for incremental save\n const updatedFilepaths: string[] = [];\n\n // Add all pending summaries incrementally (updates BM25 as we go)\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n // Save to disk (only saves updated files + serialized BM25)\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.pendingSummaries.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Filter to Markdown files only\n let filesToSearch = allFiles.filter((f) => isMarkdownFile(f));\n\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = filesToSearch.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 const queryEmbedding = await getEmbedding(query);\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as MarkdownModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\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\n // Content phrase matching - critical for Markdown documentation\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Documentation files get a small boost for documentation-intent queries\n let docBoost = 0;\n if (\n queryTerms.some((t) =>\n [\n \"docs\",\n \"documentation\",\n \"readme\",\n \"guide\",\n \"how\",\n \"what\",\n \"explain\",\n ].includes(t)\n )\n ) {\n docBoost = 0.05;\n }\n\n // Boost for more specific sections\n const headingBoost = calculateHeadingLevelBoost(chunk);\n\n const hybridScore =\n SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n docBoost +\n headingBoost +\n phraseMatch.boost; // Add phrase match boost\n\n if (\n hybridScore >= minScore ||\n bm25Score > 0.3 ||\n phraseMatch.isSignificant // Include chunks with exact phrase or high token coverage\n ) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n docBoost,\n headingBoost,\n headingLevel: (chunk.metadata as any)?.headingLevel,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n\n\n\n\n",
|
|
50
|
-
"'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n if(a===b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n",
|
|
51
|
-
"var balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m) return [str];\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n if (/\\$$/.test(m.pre)) { \n for (var k = 0; k < post.length; k++) {\n var expansion = pre+ '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n } else {\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = [];\n\n for (var j = 0; j < n.length; j++) {\n N.push.apply(N, expand(n[j], false));\n }\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n }\n\n return expansions;\n}\n\n",
|
|
51
|
+
"/**\n * Markdown Documentation Index Module\n *\n * Provides Markdown file search using:\n * - Heading-based section parsing\n * - Local text embeddings for semantic similarity\n * - Structure-aware chunking\n *\n * Supported file types: .md\n *\n * Index location: .raggrep/index/docs/markdown/\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} from \"../../../types\";\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from \"../../../infrastructure/embeddings\";\nimport {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractQueryTerms,\n generateChunkId,\n // Content phrase matching\n calculatePhraseMatch,\n PHRASE_MATCH_CONSTANTS,\n // Path context injection\n prepareChunkForEmbedding,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type { FileSummary, ChunkType } from \"../../../domain/entities\";\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 * Calculate boost based on heading level.\n * More specific sections (higher heading numbers) get a slight boost\n * because they're more targeted matches.\n */\nfunction calculateHeadingLevelBoost(chunk: Chunk): number {\n const metadata = chunk.metadata as { headingLevel?: number } | undefined;\n const level = metadata?.headingLevel ?? 0;\n\n // Boost based on specificity:\n // - H4/H5: +0.05 (most specific)\n // - H3: +0.03\n // - H2: +0.02\n // - H1: +0.01 (least specific but valuable for overview)\n // - Preamble/full: 0\n switch (level) {\n case 4:\n case 5:\n case 6:\n return 0.05;\n case 3:\n return 0.03;\n case 2:\n return 0.02;\n case 1:\n return 0.01;\n default:\n return 0;\n }\n}\n\n/** File extensions supported by this module */\nexport const MARKDOWN_EXTENSIONS = [\".md\", \".txt\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isMarkdownFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return MARKDOWN_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isMarkdownFile;\n\n/**\n * Represents a parsed section from a Markdown document.\n */\ninterface MarkdownSection {\n /** The heading text (without #) */\n heading: string;\n /** The heading level (1-6) */\n level: number;\n /** The content under this heading */\n content: string;\n /** 1-based start line number */\n startLine: number;\n /** 1-based end line number */\n endLine: number;\n}\n\n/**\n * Parse Markdown content into sections based on headings.\n */\nfunction parseMarkdownSections(content: string): MarkdownSection[] {\n const lines = content.split(\"\\n\");\n const sections: MarkdownSection[] = [];\n\n let currentSection: MarkdownSection | null = null;\n let currentContent: string[] = [];\n let startLine = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n // Save previous section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = i; // Previous line\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // Content before first heading\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: i,\n });\n }\n\n // Start new section\n currentSection = {\n heading: headingMatch[2],\n level: headingMatch[1].length,\n content: \"\",\n startLine: i + 1,\n endLine: lines.length,\n };\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n // Save final section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = lines.length;\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // No headings at all\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: lines.length,\n });\n }\n\n return sections;\n}\n\n/**\n * Represents a hierarchical chunk that includes nested content.\n */\ninterface HierarchicalChunk {\n /** The heading text */\n heading: string;\n /** The heading level (1-6, 0 for preamble) */\n level: number;\n /** Full content including nested sections */\n content: string;\n /** 1-based start line */\n startLine: number;\n /** 1-based end line */\n endLine: number;\n /** Type identifier for the chunk (h1, h2, etc.) */\n chunkType: string;\n}\n\n/**\n * Parse Markdown content into hierarchical chunks.\n *\n * Creates chunks at multiple granularities:\n * - H1 chunks: Contain all nested content (h2, h3, h4, etc.)\n * - H2 chunks: Contain h2 and its nested h3, h4 content\n * - H3 chunks: Contain h3 and its nested h4, h5 content\n * - etc.\n *\n * This enables searching at different \"zoom levels\".\n */\nfunction parseMarkdownHierarchical(\n content: string,\n maxDepth: number = 4\n): HierarchicalChunk[] {\n const lines = content.split(\"\\n\");\n const chunks: HierarchicalChunk[] = [];\n\n // First pass: identify all heading positions\n interface HeadingInfo {\n level: number;\n heading: string;\n lineIndex: number; // 0-based\n }\n\n const headings: HeadingInfo[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)$/);\n if (match) {\n headings.push({\n level: match[1].length,\n heading: match[2],\n lineIndex: i,\n });\n }\n }\n\n // If no headings, return single chunk\n if (headings.length === 0) {\n chunks.push({\n heading: \"\",\n level: 0,\n content: content,\n startLine: 1,\n endLine: lines.length,\n chunkType: \"full\",\n });\n return chunks;\n }\n\n // Add preamble if there's content before first heading\n if (headings[0].lineIndex > 0) {\n const preambleContent = lines.slice(0, headings[0].lineIndex).join(\"\\n\").trim();\n if (preambleContent) {\n chunks.push({\n heading: \"\",\n level: 0,\n content: preambleContent,\n startLine: 1,\n endLine: headings[0].lineIndex,\n chunkType: \"preamble\",\n });\n }\n }\n\n // For each heading, find where its section ends\n // A section ends when we hit a heading of the same or higher level\n for (let i = 0; i < headings.length; i++) {\n const current = headings[i];\n\n // Only process headings up to maxDepth\n if (current.level > maxDepth) continue;\n\n // Find where this section ends\n let endLineIndex = lines.length; // Default to end of file\n\n for (let j = i + 1; j < headings.length; j++) {\n // Section ends at next heading of same or higher level (lower number)\n if (headings[j].level <= current.level) {\n endLineIndex = headings[j].lineIndex;\n break;\n }\n }\n\n // Extract content from start of heading to end of section\n const sectionContent = lines.slice(current.lineIndex, endLineIndex).join(\"\\n\");\n\n chunks.push({\n heading: current.heading,\n level: current.level,\n content: sectionContent,\n startLine: current.lineIndex + 1,\n endLine: endLineIndex,\n chunkType: `h${current.level}`,\n });\n }\n\n return chunks;\n}\n\n/**\n * Extract keywords from Markdown content.\n */\nfunction extractMarkdownKeywords(content: string): string[] {\n const keywords: string[] = [];\n\n // Extract headings\n const headingMatches = content.matchAll(/^#{1,6}\\s+(.+)$/gm);\n for (const match of headingMatches) {\n const heading = match[1].toLowerCase();\n const words = heading.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract bold/emphasized text\n const emphasisMatches = content.matchAll(/\\*\\*(.+?)\\*\\*|\\*(.+?)\\*/g);\n for (const match of emphasisMatches) {\n const text = (match[1] || match[2] || \"\").toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract code blocks (inline)\n const codeMatches = content.matchAll(/`([^`]+)`/g);\n for (const match of codeMatches) {\n const code = match[1].toLowerCase();\n if (code.length > 2 && code.length < 50) {\n keywords.push(code);\n }\n }\n\n // Extract links\n const linkMatches = content.matchAll(/\\[([^\\]]+)\\]/g);\n for (const match of linkMatches) {\n const text = match[1].toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n return [...new Set(keywords)];\n}\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface MarkdownModuleData {\n embeddings: number[][];\n embeddingModel: string;\n headings: string[];\n [key: string]: unknown;\n}\n\nexport class MarkdownModule implements IndexModule {\n readonly id = \"docs/markdown\";\n readonly name = \"Markdown Search\";\n readonly description =\n \"Markdown documentation search with section-aware indexing\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isMarkdownFile(filepath);\n }\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 private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process Markdown files\n if (!isMarkdownFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Parse Markdown into hierarchical sections\n // This creates chunks at multiple granularities (h1, h2, h3, h4)\n const hierarchicalChunks = parseMarkdownHierarchical(content, 4);\n\n if (hierarchicalChunks.length === 0) {\n return null;\n }\n\n // Generate embeddings for all chunks with path context\n // Using the unified prepareChunkForEmbedding utility for consistent path injection\n const chunkContents = hierarchicalChunks.map((s) => {\n return prepareChunkForEmbedding({\n filepath,\n content: s.content,\n name: s.heading || undefined,\n });\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks from hierarchical sections\n const chunks: Chunk[] = hierarchicalChunks.map((section) => ({\n id: generateChunkId(filepath, section.startLine, section.endLine),\n content: section.content,\n startLine: section.startLine,\n endLine: section.endLine,\n type: \"block\" as ChunkType,\n name: section.heading || undefined,\n // Store chunk type in metadata for scoring\n metadata: {\n headingLevel: section.level,\n chunkType: section.chunkType,\n },\n }));\n\n // Extract headings for metadata (unique headings only)\n const headings = hierarchicalChunks\n .filter((s) => s.heading)\n .map((s) => s.heading);\n const uniqueHeadings = [...new Set(headings)];\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: MarkdownModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n headings: uniqueHeadings,\n };\n\n // Build file summary with path keywords for better search\n const contentKeywords = extractMarkdownKeywords(content);\n const pathKeywords = extractPathKeywordsForFileSummary(filepath);\n const allKeywords = [...new Set([...contentKeywords, ...pathKeywords])];\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes: [\"block\"],\n keywords: allKeywords,\n exports: uniqueHeadings, // Use headings as \"exports\" for searchability\n lastModified: stats.lastModified,\n // Include parsed path context for search boosting\n pathContext: getPathContextForFileSummary(filepath),\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index (loads existing data including BM25)\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Track which files were updated for incremental save\n const updatedFilepaths: string[] = [];\n\n // Add all pending summaries incrementally (updates BM25 as we go)\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFileIncremental(summary);\n updatedFilepaths.push(filepath);\n }\n\n // Save to disk (only saves updated files + serialized BM25)\n if (updatedFilepaths.length > 0) {\n await this.symbolicIndex.saveIncremental(updatedFilepaths);\n }\n\n this.pendingSummaries.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Filter to Markdown files only\n let filesToSearch = allFiles.filter((f) => isMarkdownFile(f));\n\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = filesToSearch.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 const queryEmbedding = await getEmbedding(query);\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 filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as MarkdownModuleData;\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 bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\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 const queryTerms = extractQueryTerms(query);\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\n // Content phrase matching - critical for Markdown documentation\n const phraseMatch = calculatePhraseMatch(chunk.content, query);\n\n // Documentation files get a small boost for documentation-intent queries\n let docBoost = 0;\n if (\n queryTerms.some((t) =>\n [\n \"docs\",\n \"documentation\",\n \"readme\",\n \"guide\",\n \"how\",\n \"what\",\n \"explain\",\n ].includes(t)\n )\n ) {\n docBoost = 0.05;\n }\n\n // Boost for more specific sections\n const headingBoost = calculateHeadingLevelBoost(chunk);\n\n const hybridScore =\n SEMANTIC_WEIGHT * semanticScore +\n BM25_WEIGHT * bm25Score +\n docBoost +\n headingBoost +\n phraseMatch.boost; // Add phrase match boost\n\n if (\n hybridScore >= minScore ||\n bm25Score > 0.3 ||\n phraseMatch.isSignificant // Include chunks with exact phrase or high token coverage\n ) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n phraseMatch: phraseMatch.exactMatch,\n phraseCoverage: phraseMatch.coverage,\n docBoost,\n headingBoost,\n headingLevel: (chunk.metadata as any)?.headingLevel,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n\n\n\n\n",
|
|
52
52
|
"import { createRequire } from \"module\";\nimport { basename, dirname, normalize, relative, resolve, sep } from \"path\";\nimport * as nativeFs from \"fs\";\n\n//#region rolldown:runtime\nvar __require = /* @__PURE__ */ createRequire(import.meta.url);\n\n//#endregion\n//#region src/utils.ts\nfunction cleanPath(path) {\n\tlet normalized = normalize(path);\n\tif (normalized.length > 1 && normalized[normalized.length - 1] === sep) normalized = normalized.substring(0, normalized.length - 1);\n\treturn normalized;\n}\nconst SLASHES_REGEX = /[\\\\/]/g;\nfunction convertSlashes(path, separator) {\n\treturn path.replace(SLASHES_REGEX, separator);\n}\nconst WINDOWS_ROOT_DIR_REGEX = /^[a-z]:[\\\\/]$/i;\nfunction isRootDirectory(path) {\n\treturn path === \"/\" || WINDOWS_ROOT_DIR_REGEX.test(path);\n}\nfunction normalizePath(path, options) {\n\tconst { resolvePaths, normalizePath: normalizePath$1, pathSeparator } = options;\n\tconst pathNeedsCleaning = process.platform === \"win32\" && path.includes(\"/\") || path.startsWith(\".\");\n\tif (resolvePaths) path = resolve(path);\n\tif (normalizePath$1 || pathNeedsCleaning) path = cleanPath(path);\n\tif (path === \".\") return \"\";\n\tconst needsSeperator = path[path.length - 1] !== pathSeparator;\n\treturn convertSlashes(needsSeperator ? path + pathSeparator : path, pathSeparator);\n}\n\n//#endregion\n//#region src/api/functions/join-path.ts\nfunction joinPathWithBasePath(filename, directoryPath) {\n\treturn directoryPath + filename;\n}\nfunction joinPathWithRelativePath(root, options) {\n\treturn function(filename, directoryPath) {\n\t\tconst sameRoot = directoryPath.startsWith(root);\n\t\tif (sameRoot) return directoryPath.slice(root.length) + filename;\n\t\telse return convertSlashes(relative(root, directoryPath), options.pathSeparator) + options.pathSeparator + filename;\n\t};\n}\nfunction joinPath(filename) {\n\treturn filename;\n}\nfunction joinDirectoryPath(filename, directoryPath, separator) {\n\treturn directoryPath + filename + separator;\n}\nfunction build$7(root, options) {\n\tconst { relativePaths, includeBasePath } = options;\n\treturn relativePaths && root ? joinPathWithRelativePath(root, options) : includeBasePath ? joinPathWithBasePath : joinPath;\n}\n\n//#endregion\n//#region src/api/functions/push-directory.ts\nfunction pushDirectoryWithRelativePath(root) {\n\treturn function(directoryPath, paths) {\n\t\tpaths.push(directoryPath.substring(root.length) || \".\");\n\t};\n}\nfunction pushDirectoryFilterWithRelativePath(root) {\n\treturn function(directoryPath, paths, filters) {\n\t\tconst relativePath = directoryPath.substring(root.length) || \".\";\n\t\tif (filters.every((filter) => filter(relativePath, true))) paths.push(relativePath);\n\t};\n}\nconst pushDirectory = (directoryPath, paths) => {\n\tpaths.push(directoryPath || \".\");\n};\nconst pushDirectoryFilter = (directoryPath, paths, filters) => {\n\tconst path = directoryPath || \".\";\n\tif (filters.every((filter) => filter(path, true))) paths.push(path);\n};\nconst empty$2 = () => {};\nfunction build$6(root, options) {\n\tconst { includeDirs, filters, relativePaths } = options;\n\tif (!includeDirs) return empty$2;\n\tif (relativePaths) return filters && filters.length ? pushDirectoryFilterWithRelativePath(root) : pushDirectoryWithRelativePath(root);\n\treturn filters && filters.length ? pushDirectoryFilter : pushDirectory;\n}\n\n//#endregion\n//#region src/api/functions/push-file.ts\nconst pushFileFilterAndCount = (filename, _paths, counts, filters) => {\n\tif (filters.every((filter) => filter(filename, false))) counts.files++;\n};\nconst pushFileFilter = (filename, paths, _counts, filters) => {\n\tif (filters.every((filter) => filter(filename, false))) paths.push(filename);\n};\nconst pushFileCount = (_filename, _paths, counts, _filters) => {\n\tcounts.files++;\n};\nconst pushFile = (filename, paths) => {\n\tpaths.push(filename);\n};\nconst empty$1 = () => {};\nfunction build$5(options) {\n\tconst { excludeFiles, filters, onlyCounts } = options;\n\tif (excludeFiles) return empty$1;\n\tif (filters && filters.length) return onlyCounts ? pushFileFilterAndCount : pushFileFilter;\n\telse if (onlyCounts) return pushFileCount;\n\telse return pushFile;\n}\n\n//#endregion\n//#region src/api/functions/get-array.ts\nconst getArray = (paths) => {\n\treturn paths;\n};\nconst getArrayGroup = () => {\n\treturn [\"\"].slice(0, 0);\n};\nfunction build$4(options) {\n\treturn options.group ? getArrayGroup : getArray;\n}\n\n//#endregion\n//#region src/api/functions/group-files.ts\nconst groupFiles = (groups, directory, files) => {\n\tgroups.push({\n\t\tdirectory,\n\t\tfiles,\n\t\tdir: directory\n\t});\n};\nconst empty = () => {};\nfunction build$3(options) {\n\treturn options.group ? groupFiles : empty;\n}\n\n//#endregion\n//#region src/api/functions/resolve-symlink.ts\nconst resolveSymlinksAsync = function(path, state, callback$1) {\n\tconst { queue, fs, options: { suppressErrors } } = state;\n\tqueue.enqueue();\n\tfs.realpath(path, (error, resolvedPath) => {\n\t\tif (error) return queue.dequeue(suppressErrors ? null : error, state);\n\t\tfs.stat(resolvedPath, (error$1, stat) => {\n\t\t\tif (error$1) return queue.dequeue(suppressErrors ? null : error$1, state);\n\t\t\tif (stat.isDirectory() && isRecursive(path, resolvedPath, state)) return queue.dequeue(null, state);\n\t\t\tcallback$1(stat, resolvedPath);\n\t\t\tqueue.dequeue(null, state);\n\t\t});\n\t});\n};\nconst resolveSymlinks = function(path, state, callback$1) {\n\tconst { queue, fs, options: { suppressErrors } } = state;\n\tqueue.enqueue();\n\ttry {\n\t\tconst resolvedPath = fs.realpathSync(path);\n\t\tconst stat = fs.statSync(resolvedPath);\n\t\tif (stat.isDirectory() && isRecursive(path, resolvedPath, state)) return;\n\t\tcallback$1(stat, resolvedPath);\n\t} catch (e) {\n\t\tif (!suppressErrors) throw e;\n\t}\n};\nfunction build$2(options, isSynchronous) {\n\tif (!options.resolveSymlinks || options.excludeSymlinks) return null;\n\treturn isSynchronous ? resolveSymlinks : resolveSymlinksAsync;\n}\nfunction isRecursive(path, resolved, state) {\n\tif (state.options.useRealPaths) return isRecursiveUsingRealPaths(resolved, state);\n\tlet parent = dirname(path);\n\tlet depth = 1;\n\twhile (parent !== state.root && depth < 2) {\n\t\tconst resolvedPath = state.symlinks.get(parent);\n\t\tconst isSameRoot = !!resolvedPath && (resolvedPath === resolved || resolvedPath.startsWith(resolved) || resolved.startsWith(resolvedPath));\n\t\tif (isSameRoot) depth++;\n\t\telse parent = dirname(parent);\n\t}\n\tstate.symlinks.set(path, resolved);\n\treturn depth > 1;\n}\nfunction isRecursiveUsingRealPaths(resolved, state) {\n\treturn state.visited.includes(resolved + state.options.pathSeparator);\n}\n\n//#endregion\n//#region src/api/functions/invoke-callback.ts\nconst onlyCountsSync = (state) => {\n\treturn state.counts;\n};\nconst groupsSync = (state) => {\n\treturn state.groups;\n};\nconst defaultSync = (state) => {\n\treturn state.paths;\n};\nconst limitFilesSync = (state) => {\n\treturn state.paths.slice(0, state.options.maxFiles);\n};\nconst onlyCountsAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.counts, state.options.suppressErrors);\n\treturn null;\n};\nconst defaultAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.paths, state.options.suppressErrors);\n\treturn null;\n};\nconst limitFilesAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.paths.slice(0, state.options.maxFiles), state.options.suppressErrors);\n\treturn null;\n};\nconst groupsAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.groups, state.options.suppressErrors);\n\treturn null;\n};\nfunction report(error, callback$1, output, suppressErrors) {\n\tif (error && !suppressErrors) callback$1(error, output);\n\telse callback$1(null, output);\n}\nfunction build$1(options, isSynchronous) {\n\tconst { onlyCounts, group, maxFiles } = options;\n\tif (onlyCounts) return isSynchronous ? onlyCountsSync : onlyCountsAsync;\n\telse if (group) return isSynchronous ? groupsSync : groupsAsync;\n\telse if (maxFiles) return isSynchronous ? limitFilesSync : limitFilesAsync;\n\telse return isSynchronous ? defaultSync : defaultAsync;\n}\n\n//#endregion\n//#region src/api/functions/walk-directory.ts\nconst readdirOpts = { withFileTypes: true };\nconst walkAsync = (state, crawlPath, directoryPath, currentDepth, callback$1) => {\n\tstate.queue.enqueue();\n\tif (currentDepth < 0) return state.queue.dequeue(null, state);\n\tconst { fs } = state;\n\tstate.visited.push(crawlPath);\n\tstate.counts.directories++;\n\tfs.readdir(crawlPath || \".\", readdirOpts, (error, entries = []) => {\n\t\tcallback$1(entries, directoryPath, currentDepth);\n\t\tstate.queue.dequeue(state.options.suppressErrors ? null : error, state);\n\t});\n};\nconst walkSync = (state, crawlPath, directoryPath, currentDepth, callback$1) => {\n\tconst { fs } = state;\n\tif (currentDepth < 0) return;\n\tstate.visited.push(crawlPath);\n\tstate.counts.directories++;\n\tlet entries = [];\n\ttry {\n\t\tentries = fs.readdirSync(crawlPath || \".\", readdirOpts);\n\t} catch (e) {\n\t\tif (!state.options.suppressErrors) throw e;\n\t}\n\tcallback$1(entries, directoryPath, currentDepth);\n};\nfunction build(isSynchronous) {\n\treturn isSynchronous ? walkSync : walkAsync;\n}\n\n//#endregion\n//#region src/api/queue.ts\n/**\n* This is a custom stateless queue to track concurrent async fs calls.\n* It increments a counter whenever a call is queued and decrements it\n* as soon as it completes. When the counter hits 0, it calls onQueueEmpty.\n*/\nvar Queue = class {\n\tcount = 0;\n\tconstructor(onQueueEmpty) {\n\t\tthis.onQueueEmpty = onQueueEmpty;\n\t}\n\tenqueue() {\n\t\tthis.count++;\n\t\treturn this.count;\n\t}\n\tdequeue(error, output) {\n\t\tif (this.onQueueEmpty && (--this.count <= 0 || error)) {\n\t\t\tthis.onQueueEmpty(error, output);\n\t\t\tif (error) {\n\t\t\t\toutput.controller.abort();\n\t\t\t\tthis.onQueueEmpty = void 0;\n\t\t\t}\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/api/counter.ts\nvar Counter = class {\n\t_files = 0;\n\t_directories = 0;\n\tset files(num) {\n\t\tthis._files = num;\n\t}\n\tget files() {\n\t\treturn this._files;\n\t}\n\tset directories(num) {\n\t\tthis._directories = num;\n\t}\n\tget directories() {\n\t\treturn this._directories;\n\t}\n\t/**\n\t* @deprecated use `directories` instead\n\t*/\n\t/* c8 ignore next 3 */\n\tget dirs() {\n\t\treturn this._directories;\n\t}\n};\n\n//#endregion\n//#region src/api/aborter.ts\n/**\n* AbortController is not supported on Node 14 so we use this until we can drop\n* support for Node 14.\n*/\nvar Aborter = class {\n\taborted = false;\n\tabort() {\n\t\tthis.aborted = true;\n\t}\n};\n\n//#endregion\n//#region src/api/walker.ts\nvar Walker = class {\n\troot;\n\tisSynchronous;\n\tstate;\n\tjoinPath;\n\tpushDirectory;\n\tpushFile;\n\tgetArray;\n\tgroupFiles;\n\tresolveSymlink;\n\twalkDirectory;\n\tcallbackInvoker;\n\tconstructor(root, options, callback$1) {\n\t\tthis.isSynchronous = !callback$1;\n\t\tthis.callbackInvoker = build$1(options, this.isSynchronous);\n\t\tthis.root = normalizePath(root, options);\n\t\tthis.state = {\n\t\t\troot: isRootDirectory(this.root) ? this.root : this.root.slice(0, -1),\n\t\t\tpaths: [\"\"].slice(0, 0),\n\t\t\tgroups: [],\n\t\t\tcounts: new Counter(),\n\t\t\toptions,\n\t\t\tqueue: new Queue((error, state) => this.callbackInvoker(state, error, callback$1)),\n\t\t\tsymlinks: /* @__PURE__ */ new Map(),\n\t\t\tvisited: [\"\"].slice(0, 0),\n\t\t\tcontroller: new Aborter(),\n\t\t\tfs: options.fs || nativeFs\n\t\t};\n\t\tthis.joinPath = build$7(this.root, options);\n\t\tthis.pushDirectory = build$6(this.root, options);\n\t\tthis.pushFile = build$5(options);\n\t\tthis.getArray = build$4(options);\n\t\tthis.groupFiles = build$3(options);\n\t\tthis.resolveSymlink = build$2(options, this.isSynchronous);\n\t\tthis.walkDirectory = build(this.isSynchronous);\n\t}\n\tstart() {\n\t\tthis.pushDirectory(this.root, this.state.paths, this.state.options.filters);\n\t\tthis.walkDirectory(this.state, this.root, this.root, this.state.options.maxDepth, this.walk);\n\t\treturn this.isSynchronous ? this.callbackInvoker(this.state, null) : null;\n\t}\n\twalk = (entries, directoryPath, depth) => {\n\t\tconst { paths, options: { filters, resolveSymlinks: resolveSymlinks$1, excludeSymlinks, exclude, maxFiles, signal, useRealPaths, pathSeparator }, controller } = this.state;\n\t\tif (controller.aborted || signal && signal.aborted || maxFiles && paths.length > maxFiles) return;\n\t\tconst files = this.getArray(this.state.paths);\n\t\tfor (let i = 0; i < entries.length; ++i) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.isFile() || entry.isSymbolicLink() && !resolveSymlinks$1 && !excludeSymlinks) {\n\t\t\t\tconst filename = this.joinPath(entry.name, directoryPath);\n\t\t\t\tthis.pushFile(filename, files, this.state.counts, filters);\n\t\t\t} else if (entry.isDirectory()) {\n\t\t\t\tlet path = joinDirectoryPath(entry.name, directoryPath, this.state.options.pathSeparator);\n\t\t\t\tif (exclude && exclude(entry.name, path)) continue;\n\t\t\t\tthis.pushDirectory(path, paths, filters);\n\t\t\t\tthis.walkDirectory(this.state, path, path, depth - 1, this.walk);\n\t\t\t} else if (this.resolveSymlink && entry.isSymbolicLink()) {\n\t\t\t\tlet path = joinPathWithBasePath(entry.name, directoryPath);\n\t\t\t\tthis.resolveSymlink(path, this.state, (stat, resolvedPath) => {\n\t\t\t\t\tif (stat.isDirectory()) {\n\t\t\t\t\t\tresolvedPath = normalizePath(resolvedPath, this.state.options);\n\t\t\t\t\t\tif (exclude && exclude(entry.name, useRealPaths ? resolvedPath : path + pathSeparator)) return;\n\t\t\t\t\t\tthis.walkDirectory(this.state, resolvedPath, useRealPaths ? resolvedPath : path + pathSeparator, depth - 1, this.walk);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolvedPath = useRealPaths ? resolvedPath : path;\n\t\t\t\t\t\tconst filename = basename(resolvedPath);\n\t\t\t\t\t\tconst directoryPath$1 = normalizePath(dirname(resolvedPath), this.state.options);\n\t\t\t\t\t\tresolvedPath = this.joinPath(filename, directoryPath$1);\n\t\t\t\t\t\tthis.pushFile(resolvedPath, files, this.state.counts, filters);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.groupFiles(this.state.groups, directoryPath, files);\n\t};\n};\n\n//#endregion\n//#region src/api/async.ts\nfunction promise(root, options) {\n\treturn new Promise((resolve$1, reject) => {\n\t\tcallback(root, options, (err, output) => {\n\t\t\tif (err) return reject(err);\n\t\t\tresolve$1(output);\n\t\t});\n\t});\n}\nfunction callback(root, options, callback$1) {\n\tlet walker = new Walker(root, options, callback$1);\n\twalker.start();\n}\n\n//#endregion\n//#region src/api/sync.ts\nfunction sync(root, options) {\n\tconst walker = new Walker(root, options);\n\treturn walker.start();\n}\n\n//#endregion\n//#region src/builder/api-builder.ts\nvar APIBuilder = class {\n\tconstructor(root, options) {\n\t\tthis.root = root;\n\t\tthis.options = options;\n\t}\n\twithPromise() {\n\t\treturn promise(this.root, this.options);\n\t}\n\twithCallback(cb) {\n\t\tcallback(this.root, this.options, cb);\n\t}\n\tsync() {\n\t\treturn sync(this.root, this.options);\n\t}\n};\n\n//#endregion\n//#region src/builder/index.ts\nlet pm = null;\n/* c8 ignore next 6 */\ntry {\n\t__require.resolve(\"picomatch\");\n\tpm = __require(\"picomatch\");\n} catch {}\nvar Builder = class {\n\tglobCache = {};\n\toptions = {\n\t\tmaxDepth: Infinity,\n\t\tsuppressErrors: true,\n\t\tpathSeparator: sep,\n\t\tfilters: []\n\t};\n\tglobFunction;\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t\tthis.globFunction = this.options.globFunction;\n\t}\n\tgroup() {\n\t\tthis.options.group = true;\n\t\treturn this;\n\t}\n\twithPathSeparator(separator) {\n\t\tthis.options.pathSeparator = separator;\n\t\treturn this;\n\t}\n\twithBasePath() {\n\t\tthis.options.includeBasePath = true;\n\t\treturn this;\n\t}\n\twithRelativePaths() {\n\t\tthis.options.relativePaths = true;\n\t\treturn this;\n\t}\n\twithDirs() {\n\t\tthis.options.includeDirs = true;\n\t\treturn this;\n\t}\n\twithMaxDepth(depth) {\n\t\tthis.options.maxDepth = depth;\n\t\treturn this;\n\t}\n\twithMaxFiles(limit) {\n\t\tthis.options.maxFiles = limit;\n\t\treturn this;\n\t}\n\twithFullPaths() {\n\t\tthis.options.resolvePaths = true;\n\t\tthis.options.includeBasePath = true;\n\t\treturn this;\n\t}\n\twithErrors() {\n\t\tthis.options.suppressErrors = false;\n\t\treturn this;\n\t}\n\twithSymlinks({ resolvePaths = true } = {}) {\n\t\tthis.options.resolveSymlinks = true;\n\t\tthis.options.useRealPaths = resolvePaths;\n\t\treturn this.withFullPaths();\n\t}\n\twithAbortSignal(signal) {\n\t\tthis.options.signal = signal;\n\t\treturn this;\n\t}\n\tnormalize() {\n\t\tthis.options.normalizePath = true;\n\t\treturn this;\n\t}\n\tfilter(predicate) {\n\t\tthis.options.filters.push(predicate);\n\t\treturn this;\n\t}\n\tonlyDirs() {\n\t\tthis.options.excludeFiles = true;\n\t\tthis.options.includeDirs = true;\n\t\treturn this;\n\t}\n\texclude(predicate) {\n\t\tthis.options.exclude = predicate;\n\t\treturn this;\n\t}\n\tonlyCounts() {\n\t\tthis.options.onlyCounts = true;\n\t\treturn this;\n\t}\n\tcrawl(root) {\n\t\treturn new APIBuilder(root || \".\", this.options);\n\t}\n\twithGlobFunction(fn) {\n\t\tthis.globFunction = fn;\n\t\treturn this;\n\t}\n\t/**\n\t* @deprecated Pass options using the constructor instead:\n\t* ```ts\n\t* new fdir(options).crawl(\"/path/to/root\");\n\t* ```\n\t* This method will be removed in v7.0\n\t*/\n\t/* c8 ignore next 4 */\n\tcrawlWithOptions(root, options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t\treturn new APIBuilder(root || \".\", this.options);\n\t}\n\tglob(...patterns) {\n\t\tif (this.globFunction) return this.globWithOptions(patterns);\n\t\treturn this.globWithOptions(patterns, ...[{ dot: true }]);\n\t}\n\tglobWithOptions(patterns, ...options) {\n\t\tconst globFn = this.globFunction || pm;\n\t\t/* c8 ignore next 5 */\n\t\tif (!globFn) throw new Error(\"Please specify a glob function to use glob matching.\");\n\t\tvar isMatch = this.globCache[patterns.join(\"\\0\")];\n\t\tif (!isMatch) {\n\t\t\tisMatch = globFn(patterns, ...options);\n\t\t\tthis.globCache[patterns.join(\"\\0\")] = isMatch;\n\t\t}\n\t\tthis.options.filters.push((path) => isMatch(path));\n\t\treturn this;\n\t}\n};\n\n//#endregion\nexport { Builder as fdir };",
|
|
53
53
|
"// Main indexer - coordinates modules for indexing files\nimport { fdir } from \"fdir\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as crypto from \"crypto\";\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 getRaggrepDir,\n} from \"../../infrastructure/config\";\nimport { registry, registerBuiltInModules } from \"../../modules/registry\";\nimport type { EmbeddingModelName, Logger } from \"../../domain/ports\";\nimport { IntrospectionIndex } from \"../../infrastructure/introspection\";\nimport { createLogger, createSilentLogger } from \"../../infrastructure/logger\";\nimport { ProgressManager } from \"../../infrastructure/logger/progressManager\";\n\n// ============================================================================\n// Freshness Check Caching\n// ============================================================================\n\n/**\n * Cache for freshness check results.\n * Avoids expensive filesystem scans when running multiple queries in succession.\n */\ninterface FreshnessCache {\n rootDir: string;\n result: EnsureFreshResult;\n timestamp: number;\n manifestMtime: number;\n}\n\n/** Cache TTL in milliseconds (5 seconds) */\nconst FRESHNESS_CACHE_TTL_MS = 5000;\n\n/** In-memory freshness cache */\nlet freshnessCache: FreshnessCache | null = null;\n\n/**\n * Clear the freshness cache.\n * Call this after explicit indexing operations.\n */\nexport function clearFreshnessCache(): void {\n freshnessCache = null;\n}\n\n// ============================================================================\n// Content Hashing\n// ============================================================================\n\n/**\n * Compute a SHA-256 hash of file content.\n * Used for reliable change detection that's immune to git mtime changes.\n *\n * @param content - File content to hash\n * @returns Hex-encoded SHA-256 hash\n */\nfunction computeContentHash(content: string): string {\n return crypto.createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\n// ============================================================================\n// Parallel Processing Utilities\n// ============================================================================\n\n/**\n * Process items in parallel with controlled concurrency.\n * Returns results in the same order as input items.\n *\n * @param items - Items to process\n * @param processor - Async function to process each item\n * @param concurrency - Maximum number of concurrent operations\n * @returns Array of results (or errors) in input order\n */\nasync function parallelMap<T, R>(\n items: T[],\n processor: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<\n Array<{ success: true; value: R } | { success: false; error: unknown }>\n> {\n const results: Array<\n { success: true; value: R } | { success: false; error: unknown }\n > = new Array(items.length);\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n const item = items[index];\n try {\n const value = await processor(item, index);\n results[index] = { success: true, value };\n } catch (error) {\n results[index] = { success: false, error };\n }\n }\n }\n\n // Start workers up to concurrency limit\n const workers = Array(Math.min(concurrency, items.length))\n .fill(null)\n .map(() => worker());\n\n await Promise.all(workers);\n return results;\n}\n\n/**\n * Current index schema version.\n * Increment this when making breaking changes to the index format.\n * This is separate from the package version to allow non-breaking updates.\n *\n * History:\n * - 1.0.0: Initial version\n * - 1.1.0: Changed default embedding model to bge-small-en-v1.5, added nomic-embed-text-v1.5\n * - 2.0.0: Tree-sitter integration, vocabulary extraction, README context, full file chunks, hierarchical markdown\n */\nconst INDEX_SCHEMA_VERSION = \"2.0.0\";\n\nexport interface IndexResult {\n moduleId: string;\n indexed: number;\n skipped: number;\n errors: number;\n /** Time taken in milliseconds */\n durationMs?: number;\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = ms / 1000;\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds.toFixed(1)}s`;\n}\n\n/**\n * Get optimal concurrency based on CPU specs.\n *\n * Uses the number of CPU cores with some considerations:\n * - Minimum: 2 (ensure some parallelism)\n * - Maximum: 16 (avoid diminishing returns / memory pressure)\n * - For embedding generation, we leave 1-2 cores free for the system\n *\n * @returns Optimal concurrency value\n */\nfunction getOptimalConcurrency(): number {\n const cpuCount = os.cpus().length;\n\n // Leave some cores for system/other processes\n // For 4 cores: use 3\n // For 8 cores: use 6\n // For 16+ cores: use 12-14\n const optimal = Math.max(2, Math.min(16, Math.floor(cpuCount * 0.75)));\n\n return optimal;\n}\n\n/** Default concurrency for parallel file processing (dynamic based on CPU) */\nconst DEFAULT_CONCURRENCY = getOptimalConcurrency();\n\nexport interface IndexOptions {\n /** Override the embedding model (semantic module) */\n model?: EmbeddingModelName;\n /** Show detailed progress */\n verbose?: boolean;\n /** Suppress most output (for use during query) */\n quiet?: boolean;\n /** Logger for progress reporting. If not provided, uses console by default (quiet mode uses silent logger) */\n logger?: Logger;\n /** Number of files to process in parallel (default: auto based on CPU cores) */\n concurrency?: number;\n /** Show timing information for each stage */\n timing?: boolean;\n}\n\n/** Timing information for performance profiling */\nexport interface TimingInfo {\n /** Total time in milliseconds */\n totalMs: number;\n /** Time spent on file discovery (with mtime filtering) */\n fileDiscoveryMs: number;\n /** Time spent on indexing changed files */\n indexingMs: number;\n /** Time spent on cleanup operations */\n cleanupMs: number;\n /** Number of files discovered on disk */\n filesDiscovered: number;\n /** Number of files modified since last index */\n filesChanged: number;\n /** Number of files that were actually re-indexed (content changed) */\n filesReindexed: number;\n /** Whether result was from cache */\n fromCache: boolean;\n}\n\nexport interface EnsureFreshResult {\n /** Number of files indexed (new or modified) */\n indexed: number;\n /** Number of stale entries removed (deleted files) */\n removed: number;\n /** Number of files unchanged (used cache) */\n unchanged: number;\n /** Timing information (only present if timing option was enabled) */\n timing?: TimingInfo;\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(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<IndexResult[]> {\n // Capture the index start time FIRST - this becomes lastIndexStarted for next run\n const indexStartTime = new Date().toISOString();\n \n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n\n // Clear freshness cache since we're explicitly indexing\n clearFreshnessCache();\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Show index location\n const location = getIndexLocation(rootDir);\n logger.info(`Indexing directory: ${rootDir}`);\n logger.info(`Index location: ${location.indexDir}`);\n logger.debug(`Concurrency: ${concurrency}`);\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 const structure = introspection.getStructure();\n if (structure?.isMonorepo) {\n logger.debug(\n `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 logger.info(\"No modules enabled. Check your configuration.\");\n return [];\n }\n\n logger.info(`Enabled modules: ${enabledModules.map((m) => m.id).join(\", \")}`);\n\n // Get all files matching extensions\n const files = await findFiles(rootDir, config);\n logger.info(`Found ${files.length} files to index`);\n\n // Track overall timing\n const overallStart = Date.now();\n\n // Index with each module\n const results: IndexResult[] = [];\n\n for (const module of enabledModules) {\n const moduleStart = Date.now();\n logger.info(`\\n[${module.name}] Starting indexing...`);\n\n // Pre-filter files that this module supports\n const moduleFiles = module.supportsFile\n ? files.filter((f) => module.supportsFile!(f))\n : files;\n\n logger.info(` Processing ${moduleFiles.length} files...`);\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, including logger\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 // Pass logger to module via options\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n const result = await indexWithModule(\n rootDir,\n moduleFiles,\n module,\n config,\n verbose,\n introspection,\n logger,\n concurrency\n );\n results.push(result);\n\n // Call finalize to build secondary indexes (Tier 1, BM25, etc.)\n if (module.finalize) {\n logger.info(`[${module.name}] Building secondary indexes...`);\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : 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 const moduleDuration = Date.now() - moduleStart;\n result.durationMs = moduleDuration;\n\n logger.info(\n `[${module.name}] Complete: ${result.indexed} indexed, ${\n result.skipped\n } skipped, ${result.errors} errors (${formatDuration(moduleDuration)})`\n );\n }\n\n // Save introspection data\n await introspection.save(config);\n\n // Log overall timing\n const overallDuration = Date.now() - overallStart;\n logger.info(`\\nIndexing complete in ${formatDuration(overallDuration)}`);\n\n // Log summary\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n const totalSkipped = results.reduce((sum, r) => sum + r.skipped, 0);\n const totalErrors = results.reduce((sum, r) => sum + r.errors, 0);\n logger.info(\n `Total: ${totalIndexed} indexed, ${totalSkipped} skipped, ${totalErrors} errors`\n );\n\n // Update global manifest with the index start time\n await updateGlobalManifest(rootDir, enabledModules, config, indexStartTime);\n\n return results;\n}\n\n/**\n * Check if the existing index version is compatible with the current schema.\n * Returns true if compatible, false if needs rebuild.\n */\nasync function isIndexVersionCompatible(rootDir: string): Promise<boolean> {\n const config = await loadConfig(rootDir);\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n\n try {\n const content = await fs.readFile(globalManifestPath, \"utf-8\");\n const manifest: GlobalManifest = JSON.parse(content);\n\n // Check if version matches current schema version\n return manifest.version === INDEX_SCHEMA_VERSION;\n } catch {\n // Can't read manifest - treat as incompatible\n return false;\n }\n}\n\n/**\n * Delete the entire index directory to allow a clean rebuild.\n */\nasync function deleteIndex(rootDir: string): Promise<void> {\n const indexDir = getRaggrepDir(rootDir);\n\n try {\n await fs.rm(indexDir, { recursive: true, force: true });\n } catch {\n // Directory may not exist, that's okay\n }\n}\n\n/**\n * Result of a reset operation\n */\nexport interface ResetResult {\n /** Whether the reset was successful */\n success: boolean;\n /** The index directory that was removed */\n indexDir: string;\n}\n\n/**\n * Reset (delete) the index for a directory.\n *\n * @param rootDir - Root directory of the project\n * @returns ResetResult with success status\n * @throws Error if no index exists\n */\nexport async function resetIndex(rootDir: string): Promise<ResetResult> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Clear freshness cache\n clearFreshnessCache();\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n throw new Error(`No index found for ${rootDir}`);\n }\n\n // Delete the index\n await deleteIndex(rootDir);\n\n return {\n success: true,\n indexDir: status.indexDir,\n };\n}\n\n/**\n * Ensure the index is fresh by checking for changes and updating incrementally.\n * This function is designed to be called before search to transparently manage the index.\n *\n * - If no index exists, creates a full index\n * - If index version is incompatible, rebuilds from scratch\n * - If files have changed, re-indexes only the modified files\n * - If files have been deleted, removes stale entries\n * - If nothing changed, returns immediately (uses cache)\n *\n * @param rootDir - Root directory of the project\n * @param options - Index options\n * @returns Statistics about what was updated\n */\nexport async function ensureIndexFresh(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<EnsureFreshResult> {\n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n const showTiming = options.timing ?? false;\n\n // Capture the index start time FIRST - this becomes lastIndexStarted for next run\n const indexStartTime = new Date().toISOString();\n \n // Timing tracking\n const startTime = Date.now();\n let fileDiscoveryMs = 0;\n let indexingMs = 0;\n let cleanupMs = 0;\n let filesDiscovered = 0;\n let filesChanged = 0; // Files modified since last index\n let filesReindexed = 0; // Files that were actually re-indexed (content changed)\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n // No index exists - do full indexing\n clearFreshnessCache();\n logger.info(\"No index found. Creating index...\\n\");\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Index exists - check if version is compatible\n const versionCompatible = await isIndexVersionCompatible(rootDir);\n if (!versionCompatible) {\n // Incompatible index version - delete and rebuild\n clearFreshnessCache();\n logger.info(\"Index version incompatible. Rebuilding...\\n\");\n await deleteIndex(rootDir);\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Load config early to get manifest path for cache check\n const config = await loadConfig(rootDir);\n\n // Fast path: Check freshness cache\n // If we recently checked this directory and the manifest hasn't changed,\n // we can skip the expensive file-by-file scan\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n let currentManifestMtime = 0;\n try {\n const manifestStats = await fs.stat(globalManifestPath);\n currentManifestMtime = manifestStats.mtimeMs;\n } catch {\n // Manifest doesn't exist - will be created during indexing\n }\n\n const now = Date.now();\n if (\n freshnessCache &&\n freshnessCache.rootDir === rootDir &&\n now - freshnessCache.timestamp < FRESHNESS_CACHE_TTL_MS &&\n freshnessCache.manifestMtime === currentManifestMtime\n ) {\n // Cache hit - return cached result with timing info\n logger.debug(\"Using cached freshness check result\");\n const cachedResult = { ...freshnessCache.result };\n if (showTiming) {\n cachedResult.timing = {\n totalMs: Date.now() - startTime,\n fileDiscoveryMs: 0,\n indexingMs: 0,\n cleanupMs: 0,\n filesDiscovered: 0,\n filesChanged: 0,\n filesReindexed: 0,\n fromCache: true,\n };\n }\n return cachedResult;\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 return { indexed: 0, removed: 0, unchanged: 0 };\n }\n\n // Load global manifest to get lastIndexStarted for change detection\n const globalManifest = await loadGlobalManifest(rootDir, config);\n const lastIndexStarted = globalManifest?.lastIndexStarted \n ? new Date(globalManifest.lastIndexStarted)\n : null;\n\n // Initialize introspection and find files with mtime filtering in parallel\n const fileDiscoveryStart = Date.now();\n const introspection = new IntrospectionIndex(rootDir);\n const [, discoveryResult] = await Promise.all([\n introspection.initialize(),\n findFilesWithStats(rootDir, config, lastIndexStarted),\n ]);\n fileDiscoveryMs = Date.now() - fileDiscoveryStart;\n \n const { allFiles: currentFiles, changedFiles, changedFileMtimes } = discoveryResult;\n filesDiscovered = currentFiles.length;\n filesChanged = changedFiles.length;\n\n const currentFileSet = new Set(\n currentFiles.map((f) => path.relative(rootDir, f))\n );\n \n // Build set of changed file paths for quick lookup\n const changedFileSet = new Set(changedFiles);\n\n let totalIndexed = 0;\n let totalRemoved = 0;\n let totalUnchanged = 0;\n\n for (const module of enabledModules) {\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\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 // Pass logger to module\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Find files to remove (in manifest but not on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n // Remove stale entries in parallel\n // Also need to track files removed for literal index cleanup\n const cleanupStart = Date.now();\n const removedFilepaths: string[] = [];\n if (filesToRemove.length > 0) {\n await Promise.all(\n filesToRemove.map(async (filepath) => {\n logger.debug(` Removing stale: ${filepath}`);\n // Remove main index file and symbolic index file in parallel\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n await Promise.all([\n fs.unlink(indexFilePath).catch(() => {}), // Ignore errors\n fs.unlink(symbolicFilePath).catch(() => {}), // Ignore errors\n ]);\n delete manifest.files[filepath];\n removedFilepaths.push(filepath);\n })\n );\n totalRemoved += removedFilepaths.length;\n }\n\n // Clean up literal index for removed files\n if (removedFilepaths.length > 0) {\n try {\n const { LiteralIndex } = await import(\n \"../../infrastructure/storage/literalIndex\"\n );\n // LiteralIndex expects the base raggrep directory\n const raggrepDir = getRaggrepDir(rootDir, config);\n const literalIndex = new LiteralIndex(raggrepDir, module.id);\n await literalIndex.initialize();\n for (const filepath of removedFilepaths) {\n literalIndex.removeFile(filepath);\n }\n await literalIndex.save();\n } catch {\n // Literal index may not exist yet\n }\n }\n cleanupMs += Date.now() - cleanupStart;\n\n // Index new/modified files using two-phase approach:\n // Phase 1: Fast stat check with high I/O concurrency\n // Phase 2: Only index files that actually need it\n\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : 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 // ========================================================================\n // Identify files to process for this module\n // ========================================================================\n // Changed files are already identified during file discovery (mtime > lastIndexStarted)\n // We only process files that:\n // 1. This module supports\n // 2. Have been modified since last index run\n \n interface FileToProcess {\n filepath: string;\n relativePath: string;\n lastModified: string;\n isNew: boolean;\n existingContentHash?: string;\n }\n\n // Filter changed files to only those this module supports\n const moduleChangedFiles = module.supportsFile \n ? changedFiles.filter((f) => module.supportsFile!(f))\n : changedFiles;\n\n // Build list of files to process\n const filesToProcess: FileToProcess[] = moduleChangedFiles.map((filepath) => {\n const relativePath = path.relative(rootDir, filepath);\n const existingEntry = manifest.files[relativePath];\n const lastModified = changedFileMtimes.get(filepath) || new Date().toISOString();\n \n return {\n filepath,\n relativePath,\n lastModified,\n isNew: !existingEntry,\n existingContentHash: existingEntry?.contentHash,\n };\n });\n\n // Count unchanged files for this module\n const moduleAllFiles = module.supportsFile \n ? currentFiles.filter((f) => module.supportsFile!(f))\n : currentFiles;\n const unchangedCount = moduleAllFiles.length - filesToProcess.length;\n\n // If nothing needs processing, continue to next module\n if (filesToProcess.length === 0) {\n totalUnchanged += unchangedCount;\n continue; // Move to next module\n }\n\n // ========================================================================\n // PHASE 2: Process changed files (normal concurrency for CPU-bound work)\n // ========================================================================\n let completedCount = 0;\n const totalToProcess = filesToProcess.length;\n\n const progressManager = new ProgressManager(logger);\n progressManager.start();\n\n // Track stats for progress reporting\n let indexedCount = 0;\n let mtimeUpdatedCount = 0;\n\n const processChangedFile = async (\n fileToProcess: FileToProcess\n ): Promise<IncrementalFileResult> => {\n const { filepath, relativePath, lastModified, isNew, existingContentHash } = fileToProcess;\n\n // Skip binary files early to avoid attempting to read them\n if (isLikelyBinary(filepath)) {\n completedCount++;\n return { relativePath, status: \"unchanged\" };\n }\n\n try {\n // Read file content\n const content = await fs.readFile(filepath, \"utf-8\");\n const contentHash = computeContentHash(content);\n\n // Check if content actually changed (handles git branch switches)\n if (!isNew && existingContentHash && existingContentHash === contentHash) {\n completedCount++;\n mtimeUpdatedCount++;\n // Content unchanged, just mtime update - don't report progress for this fast case\n return {\n relativePath,\n status: \"mtime_updated\",\n lastModified,\n contentHash,\n };\n }\n\n // File is new or content actually changed - index it\n completedCount++;\n indexedCount++;\n progressManager.reportProgress(completedCount, totalToProcess, `Indexing: ${relativePath}`, indexedCount, mtimeUpdatedCount);\n\n introspection.addFile(relativePath, content);\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n return { relativePath, status: \"unchanged\" };\n }\n\n await writeFileIndex(\n rootDir,\n module.id,\n relativePath,\n fileIndex,\n config\n );\n\n return {\n relativePath,\n status: \"indexed\",\n lastModified,\n chunkCount: fileIndex.chunks.length,\n contentHash,\n };\n } catch (error) {\n completedCount++;\n return { relativePath, status: \"error\", error };\n }\n };\n\n // Run indexing with normal concurrency (CPU bound)\n const indexingStart = Date.now();\n const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n const results = await parallelMap(filesToProcess, processChangedFile, concurrency);\n indexingMs += Date.now() - indexingStart;\n\n progressManager.stop();\n\n // Add unchanged files to total\n totalUnchanged += unchangedCount;\n\n // Clear progress line\n logger.clearProgress();\n\n // Process results and update manifest\n let mtimeUpdates = 0;\n for (const item of results) {\n if (!item.success) {\n continue;\n }\n\n const fileResult = item.value;\n switch (fileResult.status) {\n case \"indexed\":\n manifest.files[fileResult.relativePath] = {\n lastModified: fileResult.lastModified!,\n chunkCount: fileResult.chunkCount!,\n contentHash: fileResult.contentHash,\n };\n totalIndexed++;\n filesReindexed++;\n break;\n case \"mtime_updated\":\n // Update mtime without re-indexing\n if (manifest.files[fileResult.relativePath]) {\n manifest.files[fileResult.relativePath] = {\n ...manifest.files[fileResult.relativePath],\n lastModified: fileResult.lastModified!,\n contentHash: fileResult.contentHash,\n };\n mtimeUpdates++;\n }\n totalUnchanged++;\n break;\n case \"unchanged\":\n totalUnchanged++;\n break;\n case \"error\":\n logger.error(\n ` Error indexing ${fileResult.relativePath}: ${fileResult.error}`\n );\n break;\n }\n }\n\n // Log module summary for incremental updates\n if (totalIndexed > 0 || mtimeUpdates > 0) {\n const parts: string[] = [];\n if (totalIndexed > 0) {\n parts.push(`${totalIndexed} indexed`);\n }\n if (mtimeUpdates > 0) {\n parts.push(`${mtimeUpdates} mtime-only`);\n }\n if (totalRemoved > 0) {\n parts.push(`${totalRemoved} removed`);\n }\n logger.info(` [${module.name}] ${parts.join(', ')}`);\n }\n\n // Update manifest if there were any changes (including mtime-only updates)\n const hasManifestChanges = totalIndexed > 0 || totalRemoved > 0 || mtimeUpdates > 0;\n if (hasManifestChanges) {\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n }\n\n // Only call finalize when there are actual content changes (not just mtime updates)\n const hasContentChanges = totalIndexed > 0 || totalRemoved > 0;\n if (hasContentChanges && module.finalize) {\n await module.finalize(ctx);\n }\n\n // Clean up empty directories\n if (totalRemoved > 0) {\n await cleanupEmptyDirectories(indexPath);\n }\n }\n\n // Save introspection if there were changes\n if (totalIndexed > 0) {\n await introspection.save(config);\n }\n\n // Always update global manifest to save the new lastIndexStarted\n // This ensures next run can detect changes since this run started\n await updateGlobalManifest(rootDir, enabledModules, config, indexStartTime);\n \n // Clear cache if there were actual changes\n if (totalIndexed > 0 || totalRemoved > 0) {\n clearFreshnessCache();\n }\n\n const result: EnsureFreshResult = {\n indexed: totalIndexed,\n removed: totalRemoved,\n unchanged: totalUnchanged,\n };\n\n // Add timing info if requested\n if (showTiming) {\n result.timing = {\n totalMs: Date.now() - startTime,\n fileDiscoveryMs,\n indexingMs,\n cleanupMs,\n filesDiscovered,\n filesChanged,\n filesReindexed,\n fromCache: false,\n };\n }\n\n // Cache the result for subsequent queries\n // Re-read manifest mtime in case it was updated during this run\n let finalManifestMtime = currentManifestMtime;\n try {\n const manifestStats = await fs.stat(globalManifestPath);\n finalManifestMtime = manifestStats.mtimeMs;\n } catch {\n // Ignore\n }\n\n freshnessCache = {\n rootDir,\n result: { indexed: totalIndexed, removed: totalRemoved, unchanged: totalUnchanged }, // Cache without timing\n timestamp: Date.now(),\n manifestMtime: finalManifestMtime,\n };\n\n return result;\n}\n\n/**\n * Result of processing a single file during full indexing\n */\ninterface FileProcessResult {\n relativePath: string;\n status: \"indexed\" | \"skipped\" | \"error\";\n lastModified?: string;\n chunkCount?: number;\n contentHash?: string;\n error?: unknown;\n}\n\n/**\n * Result of processing a single file during incremental (ensureIndexFresh) indexing\n */\ninterface IncrementalFileResult {\n relativePath: string;\n status: \"indexed\" | \"unchanged\" | \"mtime_updated\" | \"error\";\n lastModified?: string;\n chunkCount?: number;\n contentHash?: string;\n error?: unknown;\n}\n\n/**\n * Index files with a specific module using parallel processing\n */\nasync function indexWithModule(\n rootDir: string,\n files: string[],\n module: IndexModule,\n config: Config,\n verbose: boolean,\n introspection: IntrospectionIndex,\n logger: Logger,\n concurrency: number = DEFAULT_CONCURRENCY\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 const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Build set of current files for quick lookup\n const currentFileSet = new Set(files.map((f) => path.relative(rootDir, f)));\n\n // Clean up stale entries (files in manifest but no longer on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n if (filesToRemove.length > 0) {\n logger.info(` Removing ${filesToRemove.length} stale entries...`);\n for (const filepath of filesToRemove) {\n logger.debug(` Removing: ${filepath}`);\n // Remove main index file\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist\n }\n // Remove symbolic index file\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(symbolicFilePath);\n } catch {\n // Symbolic file may not exist\n }\n delete manifest.files[filepath];\n }\n // Clean up empty directories\n await cleanupEmptyDirectories(indexPath);\n }\n\n // Create index context\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : 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 const totalFiles = files.length;\n\n const progressManager = new ProgressManager(logger);\n progressManager.start();\n\n // Track progress across parallel operations\n let completedCount = 0;\n let indexedCount = 0;\n let skippedCount = 0;\n\n // Process files in parallel with concurrency control\n const processFile = async (\n filepath: string,\n _index: number\n ): Promise<FileProcessResult> => {\n const relativePath = path.relative(rootDir, filepath);\n\n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n const existingEntry = manifest.files[relativePath];\n\n // Fast path: if mtime unchanged, skip (no need to read file)\n if (existingEntry && existingEntry.lastModified === lastModified) {\n completedCount++;\n skippedCount++;\n // Update progress with stats\n progressManager.reportProgress(completedCount, totalFiles, `Processing: ${relativePath}`, indexedCount, skippedCount);\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (unchanged)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Read and index file\n const content = await fs.readFile(filepath, \"utf-8\");\n const contentHash = computeContentHash(content);\n\n // Check if content actually changed (handles git branch switches)\n if (existingEntry?.contentHash && existingEntry.contentHash === contentHash) {\n completedCount++;\n skippedCount++;\n progressManager.reportProgress(completedCount, totalFiles, `Processing: ${relativePath}`, indexedCount, skippedCount);\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (content unchanged)`\n );\n // Return with updated mtime but mark as skipped since content is same\n return {\n relativePath,\n status: \"skipped\",\n lastModified,\n contentHash,\n };\n }\n\n // Add introspection for this file (thread-safe - just adds to a Map)\n introspection.addFile(relativePath, content);\n\n // Update progress\n completedCount++;\n indexedCount++;\n progressManager.reportProgress(completedCount, totalFiles, `Processing: ${relativePath}`, indexedCount, skippedCount);\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n skippedCount++; // Count no-chunks as skipped\n progressManager.reportProgress(completedCount, totalFiles, `Processing: ${relativePath}`, indexedCount, skippedCount);\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (no chunks)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Write index file\n await writeFileIndex(rootDir, module.id, relativePath, fileIndex, config);\n\n return {\n relativePath,\n status: \"indexed\",\n lastModified,\n chunkCount: fileIndex.chunks.length,\n contentHash,\n };\n } catch (error) {\n completedCount++;\n return { relativePath, status: \"error\", error };\n }\n };\n\n // Run parallel processing\n logger.debug(` Using concurrency: ${concurrency}`);\n const results = await parallelMap(files, processFile, concurrency);\n\n progressManager.stop();\n\n // Clear progress line\n logger.clearProgress();\n\n // Process results and update manifest\n for (const item of results) {\n if (!item.success) {\n // This shouldn't happen as we catch errors in processFile\n result.errors++;\n continue;\n }\n\n const fileResult = item.value;\n switch (fileResult.status) {\n case \"indexed\":\n manifest.files[fileResult.relativePath] = {\n lastModified: fileResult.lastModified!,\n chunkCount: fileResult.chunkCount!,\n contentHash: fileResult.contentHash,\n };\n result.indexed++;\n break;\n case \"skipped\":\n // If skipped due to content hash match but mtime changed, update mtime\n if (fileResult.lastModified && fileResult.contentHash) {\n const existingEntry = manifest.files[fileResult.relativePath];\n if (existingEntry) {\n manifest.files[fileResult.relativePath] = {\n ...existingEntry,\n lastModified: fileResult.lastModified,\n contentHash: fileResult.contentHash,\n };\n }\n }\n result.skipped++;\n break;\n case \"error\":\n logger.error(\n ` Error indexing ${fileResult.relativePath}: ${fileResult.error}`\n );\n result.errors++;\n break;\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\n/**\n * Result of file discovery with change detection.\n */\ninterface FileDiscoveryResult {\n /** All files matching config extensions */\n allFiles: string[];\n /** Files that have been modified since lastIndexStarted */\n changedFiles: string[];\n /** Map of filepath to mtime (ISO string) for changed files */\n changedFileMtimes: Map<string, string>;\n}\n\n/** Higher concurrency for I/O-bound stat operations */\nconst STAT_CONCURRENCY = 64;\n\n// ============================================================================\n// Binary File Detection\n// ============================================================================\n\n/**\n * Check if a file is likely binary based on extension and filename patterns.\n *\n * This is a fast heuristic check that identifies files that should not be indexed\n * without reading file content. It's used as an early filter to avoid attempting\n * to read binary files as text.\n *\n * @param filepath - Path to the file to check\n * @returns true if the file is likely binary, false otherwise\n */\nfunction isLikelyBinary(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n const basename = path.basename(filepath).toLowerCase();\n\n const binaryExtensions = new Set([\n // Images\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".ico\", \".svg\", \".webp\", \".bmp\", \".tiff\",\n // Documents\n \".pdf\", \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\",\n // Archives\n \".zip\", \".tar\", \".gz\", \".7z\", \".rar\", \".bz2\",\n // Binaries\n \".exe\", \".dll\", \".so\", \".dylib\", \".bin\", \".dat\", \".obj\", \".o\",\n // Media\n \".mp3\", \".mp4\", \".wav\", \".avi\", \".mov\", \".flac\", \".ogg\",\n // Fonts\n \".woff\", \".woff2\", \".ttf\", \".eot\", \".otf\",\n ]);\n\n // Check extension\n if (binaryExtensions.has(ext)) {\n return true;\n }\n\n // Check filename patterns for minified/bundled files\n const minifiedPatterns = [\n \".min.js\", \".min.css\", \".bundle.js\", \".bundle.css\",\n \".prod.js\", \".prod.css\", \".chunk.js\", \".chunk.css\",\n ];\n if (minifiedPatterns.some(pattern => filepath.includes(pattern))) {\n return true;\n }\n\n // Check specific system files\n const systemFiles = [\n \".ds_store\",\n \"thumbs.db\",\n \"desktop.ini\",\n ];\n if (systemFiles.includes(basename)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Find all files and identify which ones have changed since the last index.\n * Uses fdir for fast directory traversal, then batch stats to identify changes.\n */\nasync function findFilesWithStats(\n rootDir: string,\n config: Config,\n lastIndexStarted: Date | null\n): Promise<FileDiscoveryResult> {\n // Build a set of valid extensions for fast lookup\n const validExtensions = new Set(config.extensions);\n \n // Build ignore patterns as directory names\n const ignoreDirs = new Set(config.ignorePaths);\n \n const lastIndexMs = lastIndexStarted?.getTime() ?? 0;\n\n // Use fdir for fast directory traversal\n const crawler = new fdir()\n .withFullPaths()\n .exclude((dirName) => ignoreDirs.has(dirName))\n .filter((filePath) => {\n const ext = path.extname(filePath);\n return validExtensions.has(ext);\n })\n .crawl(rootDir);\n\n const allFiles = await crawler.withPromise() as string[];\n \n // If no lastIndexStarted, all files are \"changed\" (first run or rebuild)\n if (!lastIndexStarted) {\n const changedFileMtimes = new Map<string, string>();\n // Batch stat all files with high concurrency\n await parallelMap(allFiles, async (filePath) => {\n try {\n const stats = await fs.stat(filePath);\n changedFileMtimes.set(filePath, stats.mtime.toISOString());\n } catch {\n // File inaccessible, skip\n }\n }, STAT_CONCURRENCY);\n \n return {\n allFiles,\n changedFiles: allFiles,\n changedFileMtimes,\n };\n }\n\n // Batch stat all files to find changed ones\n const changedFiles: string[] = [];\n const changedFileMtimes = new Map<string, string>();\n\n await parallelMap(allFiles, async (filePath) => {\n try {\n const stats = await fs.stat(filePath);\n // Check if modified since last index\n if (stats.mtimeMs > lastIndexMs) {\n changedFiles.push(filePath);\n changedFileMtimes.set(filePath, stats.mtime.toISOString());\n }\n } catch {\n // File inaccessible, skip\n }\n }, STAT_CONCURRENCY);\n\n return {\n allFiles,\n changedFiles,\n changedFileMtimes,\n };\n}\n\n/**\n * Find all files matching config (legacy function for compatibility).\n */\nasync function findFiles(rootDir: string, config: Config): Promise<string[]> {\n const result = await findFilesWithStats(rootDir, config, null);\n return result.allFiles;\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(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n\n await fs.mkdir(path.dirname(indexFilePath), { recursive: true });\n await fs.writeFile(indexFilePath, JSON.stringify(fileIndex, null, 2));\n}\n\n/**\n * Load the global manifest if it exists.\n */\nasync function loadGlobalManifest(\n rootDir: string,\n config: Config\n): Promise<GlobalManifest | null> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n try {\n const content = await fs.readFile(manifestPath, \"utf-8\");\n return JSON.parse(content) as GlobalManifest;\n } catch {\n return null;\n }\n}\n\n/**\n * Update the global manifest with new index run information.\n */\nasync function updateGlobalManifest(\n rootDir: string,\n modules: IndexModule[],\n config: Config,\n indexStartTime: string\n): Promise<void> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n const manifest: GlobalManifest = {\n version: INDEX_SCHEMA_VERSION,\n lastUpdated: new Date().toISOString(),\n lastIndexStarted: indexStartTime,\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 * Options for cleanup operation\n */\nexport interface CleanupOptions {\n /** Show detailed progress */\n verbose?: boolean;\n /** Logger for progress reporting */\n logger?: Logger;\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: CleanupOptions = {}\n): Promise<CleanupResult[]> {\n const verbose = options.verbose ?? false;\n\n // Create logger\n const logger: Logger = options.logger ?? createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n logger.info(`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 logger.info(\"No modules enabled.\");\n return [];\n }\n\n const results: CleanupResult[] = [];\n\n for (const module of enabledModules) {\n logger.info(`\\n[${module.name}] Checking for stale entries...`);\n\n const result = await cleanupModuleIndex(rootDir, module.id, config, logger);\n results.push(result);\n\n logger.info(\n `[${module.name}] Removed ${result.removed} stale entries, kept ${result.kept} valid entries`\n );\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 logger: Logger\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 logger.debug(` Removing stale entry: ${filepath}`);\n }\n }\n\n // Remove stale index files\n for (const filepath of filesToRemove) {\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\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",
|
|
54
54
|
"// 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 // Idempotent registration: avoid noisy logs when called multiple times\n if (!this.modules.has(module.id)) {\n this.modules.set(module.id, module);\n }\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.filter((m) => m.enabled).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 const { PythonModule } = await import(\"./language/python\");\n const { GoModule } = await import(\"./language/go\");\n const { RustModule } = await import(\"./language/rust\");\n const { JsonModule } = await import(\"./data/json\");\n const { MarkdownModule } = await import(\"./docs/markdown\");\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 registry.register(new PythonModule());\n registry.register(new GoModule());\n registry.register(new RustModule());\n\n // Register data format modules\n registry.register(new JsonModule());\n\n // Register documentation modules\n registry.register(new MarkdownModule());\n}\n",
|
|
@@ -58,17 +58,21 @@
|
|
|
58
58
|
"/**\n * Progress Manager - Thread-safe progress reporting for parallel operations\n *\n * Handles concurrent progress updates from multiple workers and batches\n * them to avoid race conditions and flickering output.\n */\n\nimport type { Logger } from \"../../domain/ports\";\n\ninterface ProgressState {\n completed: number;\n total: number;\n message: string;\n timestamp: number;\n /** Number of newly indexed files */\n indexed?: number;\n /** Number of skipped files (unchanged) */\n skipped?: number;\n}\n\nconst PROGRESS_UPDATE_INTERVAL_MS = 50;\n\nexport class ProgressManager {\n private logger: Logger;\n private state: ProgressState = {\n completed: 0,\n total: 0,\n message: \"\",\n timestamp: 0,\n };\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n start(): void {\n if (this.intervalId) {\n return;\n }\n\n this.intervalId = setInterval(() => {\n this.writeProgress();\n }, PROGRESS_UPDATE_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n this.logger.clearProgress();\n }\n\n reportProgress(completed: number, total: number, message: string, indexed?: number, skipped?: number): void {\n this.state = {\n completed,\n total,\n message,\n indexed,\n skipped,\n timestamp: Date.now(),\n };\n }\n\n private writeProgress(): void {\n let progressMessage = ` [${this.state.completed}/${this.state.total}] ${this.state.message}`;\n\n // Add additional stats if provided\n if (this.state.indexed !== undefined || this.state.skipped !== undefined) {\n const parts: string[] = [];\n if (this.state.indexed !== undefined && this.state.indexed > 0) {\n parts.push(`${this.state.indexed} indexed`);\n }\n if (this.state.skipped !== undefined && this.state.skipped > 0) {\n parts.push(`${this.state.skipped} skipped`);\n }\n if (parts.length > 0) {\n progressMessage += ` (${parts.join(', ')})`;\n }\n }\n\n this.logger.progress(progressMessage);\n }\n}\n",
|
|
59
59
|
"/**\n * Multi-Module Progress Manager - Consolidated progress for parallel module indexing\n *\n * Tracks progress across multiple modules and displays them on a single line.\n * Thread-safe progress updates from concurrent workers.\n */\n\nimport type { Logger } from \"../../domain/ports\";\n\ninterface ModuleProgress {\n moduleName: string;\n completed: number;\n total: number;\n currentFile: string;\n active: boolean;\n}\n\nconst PROGRESS_UPDATE_INTERVAL_MS = 50;\n\nexport class MultiModuleProgressManager {\n private logger: Logger;\n private modules: Map<string, ModuleProgress> = new Map();\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n start(): void {\n if (this.intervalId) {\n return;\n }\n\n this.intervalId = setInterval(() => {\n this.writeProgress();\n }, PROGRESS_UPDATE_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n this.logger.clearProgress();\n }\n\n registerModule(moduleId: string, moduleName: string, totalFiles: number): void {\n this.modules.set(moduleId, {\n moduleName,\n completed: 0,\n total: totalFiles,\n currentFile: \"\",\n active: true,\n });\n }\n\n unregisterModule(moduleId: string): void {\n const module = this.modules.get(moduleId);\n if (module) {\n module.active = false;\n }\n }\n\n reportProgress(moduleId: string, completed: number, currentFile: string): void {\n const module = this.modules.get(moduleId);\n if (!module) {\n return;\n }\n\n module.completed = completed;\n module.currentFile = currentFile;\n }\n\n private writeProgress(): void {\n const activeModules = Array.from(this.modules.values()).filter(m => m.active);\n\n if (activeModules.length === 0) {\n return;\n }\n\n if (activeModules.length === 1) {\n const m = activeModules[0];\n const progressMessage = `[${m.moduleName}] ${m.completed}/${m.total}: ${m.currentFile}`;\n this.logger.progress(progressMessage);\n } else {\n const parts = activeModules.map(m => {\n const percent = m.total > 0 ? Math.round((m.completed / m.total) * 100) : 100;\n return `[${m.moduleName} ${m.completed}/${m.total} ${percent}%]`;\n });\n const progressMessage = parts.join(\" \");\n this.logger.progress(progressMessage);\n }\n }\n}\n",
|
|
60
60
|
"/**\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, clearFreshnessCache, 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 // Clear freshness cache since files have changed\n clearFreshnessCache();\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",
|
|
61
|
-
"// Search module - queries across all enabled modules\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { minimatch } from \"minimatch\";\nimport {\n Config,\n SearchContext,\n SearchOptions,\n SearchResult,\n FileIndex,\n IndexModule,\n GlobalManifest,\n DEFAULT_SEARCH_OPTIONS,\n} from \"../../types\";\nimport {\n loadConfig,\n getModuleIndexPath,\n getGlobalManifestPath,\n getModuleConfig,\n} from \"../../infrastructure/config\";\nimport { registry, registerBuiltInModules } from \"../../modules/registry\";\nimport { ensureIndexFresh } from \"../indexer\";\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 // Ensure index is fresh before searching (unless explicitly disabled)\n const ensureFresh = options.ensureFresh ?? DEFAULT_SEARCH_OPTIONS.ensureFresh;\n if (ensureFresh) {\n await ensureIndexFresh(rootDir, { quiet: true });\n }\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 \"raggrep 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 // Apply path filter if specified\n let filteredResults = allResults;\n if (options.pathFilter && options.pathFilter.length > 0) {\n const normalizedFilters = options.pathFilter.map((p) =>\n p.replace(/\\\\/g, \"/\").replace(/^\\//, \"\").replace(/\\/$/, \"\")\n );\n filteredResults = allResults.filter((result) => {\n const normalizedPath = result.filepath.replace(/\\\\/g, \"/\");\n return normalizedFilters.some((filter) => {\n // Check if the filter is a glob pattern\n const isGlobPattern = /[*?[\\]{}!]/.test(filter);\n\n if (isGlobPattern) {\n // Use minimatch for glob patterns\n // Support patterns like \"*.ts\", \"src/**/*.ts\", \"**/*.md\"\n const pattern = filter.startsWith(\"**/\") ? filter : `**/${filter}`;\n return minimatch(normalizedPath, pattern, { matchBase: true });\n } else {\n // Fall back to path prefix matching for non-glob patterns\n return (\n normalizedPath.startsWith(filter + \"/\") ||\n normalizedPath === filter ||\n normalizedPath.startsWith(\"./\" + filter + \"/\") ||\n normalizedPath === \"./\" + filter\n );\n }\n });\n });\n }\n\n // Sort all results by score\n filteredResults.sort((a, b) => b.score - a.score);\n\n // Return top K\n const topK = options.topK ?? 10;\n return filteredResults.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(\n dir: string,\n files: string[],\n basePath: string\n): 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(\n rootDir: string,\n config: Config\n): 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 * Get a human-friendly name for a module ID\n */\nfunction formatModuleName(moduleId: string): string {\n switch (moduleId) {\n case \"core\":\n return \"Core\";\n case \"language/typescript\":\n return \"TypeScript\";\n default:\n // Handle future modules: \"language/python\" -> \"Python\"\n if (moduleId.startsWith(\"language/\")) {\n const lang = moduleId.replace(\"language/\", \"\");\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n return moduleId;\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: ${\n chunk.type\n }`;\n\n // Show which module contributed this result\n output += ` | via ${formatModuleName(result.moduleId)}`;\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",
|
|
62
|
-
"import expand from 'brace-expansion';\nimport { assertValidPattern } from './assert-valid-pattern.js';\nimport { AST } from './ast.js';\nimport { escape } from './escape.js';\nimport { unescape } from './unescape.js';\nexport const minimatch = (p, pattern, options = {}) => {\n assertValidPattern(pattern);\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false;\n }\n return new Minimatch(pattern, options).match(p);\n};\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/;\nconst starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);\nconst starDotExtTestDot = (ext) => (f) => f.endsWith(ext);\nconst starDotExtTestNocase = (ext) => {\n ext = ext.toLowerCase();\n return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);\n};\nconst starDotExtTestNocaseDot = (ext) => {\n ext = ext.toLowerCase();\n return (f) => f.toLowerCase().endsWith(ext);\n};\nconst starDotStarRE = /^\\*+\\.\\*+$/;\nconst starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');\nconst starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');\nconst dotStarRE = /^\\.\\*+$/;\nconst dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');\nconst starRE = /^\\*+$/;\nconst starTest = (f) => f.length !== 0 && !f.startsWith('.');\nconst starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/;\nconst qmarksTestNocase = ([$0, ext = '']) => {\n const noext = qmarksTestNoExt([$0]);\n if (!ext)\n return noext;\n ext = ext.toLowerCase();\n return (f) => noext(f) && f.toLowerCase().endsWith(ext);\n};\nconst qmarksTestNocaseDot = ([$0, ext = '']) => {\n const noext = qmarksTestNoExtDot([$0]);\n if (!ext)\n return noext;\n ext = ext.toLowerCase();\n return (f) => noext(f) && f.toLowerCase().endsWith(ext);\n};\nconst qmarksTestDot = ([$0, ext = '']) => {\n const noext = qmarksTestNoExtDot([$0]);\n return !ext ? noext : (f) => noext(f) && f.endsWith(ext);\n};\nconst qmarksTest = ([$0, ext = '']) => {\n const noext = qmarksTestNoExt([$0]);\n return !ext ? noext : (f) => noext(f) && f.endsWith(ext);\n};\nconst qmarksTestNoExt = ([$0]) => {\n const len = $0.length;\n return (f) => f.length === len && !f.startsWith('.');\n};\nconst qmarksTestNoExtDot = ([$0]) => {\n const len = $0.length;\n return (f) => f.length === len && f !== '.' && f !== '..';\n};\n/* c8 ignore start */\nconst defaultPlatform = (typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix');\nconst path = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n};\n/* c8 ignore stop */\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;\nminimatch.sep = sep;\nexport const GLOBSTAR = Symbol('globstar **');\nminimatch.GLOBSTAR = GLOBSTAR;\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]';\n// * => any number of characters\nconst star = qmark + '*?';\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?';\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?';\nexport const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);\nminimatch.filter = filter;\nconst ext = (a, b = {}) => Object.assign({}, a, b);\nexport const defaults = (def) => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch;\n }\n const orig = minimatch;\n const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern, options = {}) {\n super(pattern, ext(def, options));\n }\n static defaults(options) {\n return orig.defaults(ext(def, options)).Minimatch;\n }\n },\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(type, parent, options = {}) {\n super(type, parent, ext(def, options));\n }\n /* c8 ignore stop */\n static fromGlob(pattern, options = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options));\n }\n },\n unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),\n escape: (s, options = {}) => orig.escape(s, ext(def, options)),\n filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),\n defaults: (options) => orig.defaults(ext(def, options)),\n makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),\n braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),\n match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR,\n });\n};\nminimatch.defaults = defaults;\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (pattern, options = {}) => {\n assertValidPattern(pattern);\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern];\n }\n return expand(pattern);\n};\nminimatch.braceExpand = braceExpand;\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nexport const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();\nminimatch.makeRe = makeRe;\nexport const match = (list, pattern, options = {}) => {\n const mm = new Minimatch(pattern, options);\n list = list.filter(f => mm.match(f));\n if (mm.options.nonull && !list.length) {\n list.push(pattern);\n }\n return list;\n};\nminimatch.match = match;\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/;\nconst regExpEscape = (s) => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\nexport class Minimatch {\n options;\n set;\n pattern;\n windowsPathsNoEscape;\n nonegate;\n negate;\n comment;\n empty;\n preserveMultipleSlashes;\n partial;\n globSet;\n globParts;\n nocase;\n isWindows;\n platform;\n windowsNoMagicRoot;\n regexp;\n constructor(pattern, options = {}) {\n assertValidPattern(pattern);\n options = options || {};\n this.options = options;\n this.pattern = pattern;\n this.platform = options.platform || defaultPlatform;\n this.isWindows = this.platform === 'win32';\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/');\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;\n this.regexp = null;\n this.negate = false;\n this.nonegate = !!options.nonegate;\n this.comment = false;\n this.empty = false;\n this.partial = !!options.partial;\n this.nocase = !!this.options.nocase;\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase);\n this.globSet = [];\n this.globParts = [];\n this.set = [];\n // make the set of regexps etc.\n this.make();\n }\n hasMagic() {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true;\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string')\n return true;\n }\n }\n return false;\n }\n debug(..._) { }\n make() {\n const pattern = this.pattern;\n const options = this.options;\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true;\n return;\n }\n if (!pattern) {\n this.empty = true;\n return;\n }\n // step 1: figure out negation, etc.\n this.parseNegate();\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())];\n if (options.debug) {\n this.debug = (...args) => console.error(...args);\n }\n this.debug(this.pattern, this.globSet);\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s));\n this.globParts = this.preprocess(rawGlobParts);\n this.debug(this.pattern, this.globParts);\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC = s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3]);\n const isDrive = /^[a-z]:/i.test(s[0]);\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];\n }\n else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))];\n }\n }\n return s.map(ss => this.parse(ss));\n });\n this.debug(this.pattern, set);\n // filter out everything that didn't compile properly.\n this.set = set.filter(s => s.indexOf(false) === -1);\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i];\n if (p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])) {\n p[2] = '?';\n }\n }\n }\n this.debug(this.pattern, this.set);\n }\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*';\n }\n }\n }\n }\n const { optimizationLevel = 1 } = this.options;\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts);\n globParts = this.secondPhasePreProcess(globParts);\n }\n else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts);\n }\n else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts);\n }\n return globParts;\n }\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts) {\n return globParts.map(parts => {\n let gs = -1;\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs;\n while (parts[i + 1] === '**') {\n i++;\n }\n if (i !== gs) {\n parts.splice(gs, i - gs);\n }\n }\n return parts;\n });\n }\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts) {\n return globParts.map(parts => {\n parts = parts.reduce((set, part) => {\n const prev = set[set.length - 1];\n if (part === '**' && prev === '**') {\n return set;\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop();\n return set;\n }\n }\n set.push(part);\n return set;\n }, []);\n return parts.length === 0 ? [''] : parts;\n });\n }\n levelTwoFileOptimize(parts) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts);\n }\n let didSomething = false;\n do {\n didSomething = false;\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i];\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '')\n continue;\n if (p === '.' || p === '') {\n didSomething = true;\n parts.splice(i, 1);\n i--;\n }\n }\n if (parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')) {\n didSomething = true;\n parts.pop();\n }\n }\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd = 0;\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1];\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true;\n parts.splice(dd - 1, 2);\n dd -= 2;\n }\n }\n } while (didSomething);\n return parts.length === 0 ? [''] : parts;\n }\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts) {\n let didSomething = false;\n do {\n didSomething = false;\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs = -1;\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss = gs;\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++;\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs);\n }\n let next = parts[gs + 1];\n const p = parts[gs + 2];\n const p2 = parts[gs + 3];\n if (next !== '..')\n continue;\n if (!p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..') {\n continue;\n }\n didSomething = true;\n // edit parts in place, and push the new one\n parts.splice(gs, 1);\n const other = parts.slice(0);\n other[gs] = '**';\n globParts.push(other);\n gs--;\n }\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i];\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '')\n continue;\n if (p === '.' || p === '') {\n didSomething = true;\n parts.splice(i, 1);\n i--;\n }\n }\n if (parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')) {\n didSomething = true;\n parts.pop();\n }\n }\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd = 0;\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1];\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true;\n const needDot = dd === 1 && parts[dd + 1] === '**';\n const splin = needDot ? ['.'] : [];\n parts.splice(dd - 1, 2, ...splin);\n if (parts.length === 0)\n parts.push('');\n dd -= 2;\n }\n }\n }\n } while (didSomething);\n return globParts;\n }\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts) {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);\n if (matched) {\n globParts[i] = [];\n globParts[j] = matched;\n break;\n }\n }\n }\n return globParts.filter(gs => gs.length);\n }\n partsMatch(a, b, emptyGSMatch = false) {\n let ai = 0;\n let bi = 0;\n let result = [];\n let which = '';\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai]);\n ai++;\n bi++;\n }\n else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai]);\n ai++;\n }\n else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi]);\n bi++;\n }\n else if (a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**') {\n if (which === 'b')\n return false;\n which = 'a';\n result.push(a[ai]);\n ai++;\n bi++;\n }\n else if (b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**') {\n if (which === 'a')\n return false;\n which = 'b';\n result.push(b[bi]);\n ai++;\n bi++;\n }\n else {\n return false;\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result;\n }\n parseNegate() {\n if (this.nonegate)\n return;\n const pattern = this.pattern;\n let negate = false;\n let negateOffset = 0;\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate;\n negateOffset++;\n }\n if (negateOffset)\n this.pattern = pattern.slice(negateOffset);\n this.negate = negate;\n }\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file, pattern, partial = false) {\n const options = this.options;\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);\n const fileUNC = !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3]);\n const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);\n const patternUNC = !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3]);\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd] = [file[fdi], pattern[pdi]];\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd;\n if (pdi > fdi) {\n pattern = pattern.slice(pdi);\n }\n else if (fdi > pdi) {\n file = file.slice(fdi);\n }\n }\n }\n }\n // resolve and reduce . and .. portions in the file as well.\n // dont' need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options;\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file);\n }\n this.debug('matchOne', this, { file, pattern });\n this.debug('matchOne', file.length, pattern.length);\n for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {\n this.debug('matchOne loop');\n var p = pattern[pi];\n var f = file[fi];\n this.debug(pattern, p, f);\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false;\n }\n /* c8 ignore stop */\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f]);\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi;\n var pr = pi + 1;\n if (pr === pl) {\n this.debug('** at the end');\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.'))\n return false;\n }\n return true;\n }\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr];\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee);\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee);\n // found a match.\n return true;\n }\n else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr);\n break;\n }\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue');\n fr++;\n }\n }\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr);\n if (fr === fl) {\n return true;\n }\n }\n /* c8 ignore stop */\n return false;\n }\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit;\n if (typeof p === 'string') {\n hit = f === p;\n this.debug('string match', p, f, hit);\n }\n else {\n hit = p.test(f);\n this.debug('pattern match', p, f, hit);\n }\n if (!hit)\n return false;\n }\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true;\n }\n else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial;\n }\n else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === '';\n /* c8 ignore start */\n }\n else {\n // should be unreachable.\n throw new Error('wtf?');\n }\n /* c8 ignore stop */\n }\n braceExpand() {\n return braceExpand(this.pattern, this.options);\n }\n parse(pattern) {\n assertValidPattern(pattern);\n const options = this.options;\n // shortcuts\n if (pattern === '**')\n return GLOBSTAR;\n if (pattern === '')\n return '';\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m;\n let fastTest = null;\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest;\n }\n else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest)(m[1]);\n }\n else if ((m = pattern.match(qmarksRE))) {\n fastTest = (options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest)(m);\n }\n else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest;\n }\n else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest;\n }\n const re = AST.fromGlob(pattern, this.options).toMMPattern();\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest });\n }\n return re;\n }\n makeRe() {\n if (this.regexp || this.regexp === false)\n return this.regexp;\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set;\n if (!set.length) {\n this.regexp = false;\n return this.regexp;\n }\n const options = this.options;\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot;\n const flags = new Set(options.nocase ? ['i'] : []);\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split(''))\n flags.add(f);\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src;\n });\n pp.forEach((p, i) => {\n const next = pp[i + 1];\n const prev = pp[i - 1];\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return;\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next;\n }\n else {\n pp[i] = twoStar;\n }\n }\n else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?';\n }\n else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next;\n pp[i + 1] = GLOBSTAR;\n }\n });\n return pp.filter(p => p !== GLOBSTAR).join('/');\n })\n .join('|');\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$';\n // can match anything, as long as it's not this.\n if (this.negate)\n re = '^(?!' + re + ').+$';\n try {\n this.regexp = new RegExp(re, [...flags].join(''));\n /* c8 ignore start */\n }\n catch (ex) {\n // should be impossible\n this.regexp = false;\n }\n /* c8 ignore stop */\n return this.regexp;\n }\n slashSplit(p) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/');\n }\n else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)];\n }\n else {\n return p.split(/\\/+/);\n }\n }\n match(f, partial = this.partial) {\n this.debug('match', f, this.pattern);\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false;\n }\n if (this.empty) {\n return f === '';\n }\n if (f === '/' && partial) {\n return true;\n }\n const options = this.options;\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/');\n }\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f);\n this.debug(this.pattern, 'split', ff);\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n const set = this.set;\n this.debug(this.pattern, 'set', set);\n // Find the basename of the path by looking for the last non-empty segment\n let filename = ff[ff.length - 1];\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i];\n }\n }\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i];\n let file = ff;\n if (options.matchBase && pattern.length === 1) {\n file = [filename];\n }\n const hit = this.matchOne(file, pattern, partial);\n if (hit) {\n if (options.flipNegate) {\n return true;\n }\n return !this.negate;\n }\n }\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false;\n }\n return this.negate;\n }\n static defaults(def) {\n return minimatch.defaults(def).Minimatch;\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js';\nexport { escape } from './escape.js';\nexport { unescape } from './unescape.js';\n/* c8 ignore stop */\nminimatch.AST = AST;\nminimatch.Minimatch = Minimatch;\nminimatch.escape = escape;\nminimatch.unescape = unescape;\n//# sourceMappingURL=index.js.map",
|
|
61
|
+
"// Search module - queries across all enabled modules\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { minimatch } from \"minimatch\";\nimport {\n Config,\n SearchContext,\n SearchOptions,\n SearchResult,\n FileIndex,\n IndexModule,\n GlobalManifest,\n DEFAULT_SEARCH_OPTIONS,\n} from \"../../types\";\nimport type {\n ExactMatchResults,\n HybridSearchResults,\n} from \"../../domain/entities\";\nimport {\n loadConfig,\n getModuleIndexPath,\n getGlobalManifestPath,\n getModuleConfig,\n getRaggrepDir,\n} from \"../../infrastructure/config\";\nimport { registry, registerBuiltInModules } from \"../../modules/registry\";\nimport { ensureIndexFresh } from \"../indexer\";\nimport {\n isIdentifierQuery,\n extractSearchLiteral,\n} from \"../../domain/services\";\nimport { executeExactSearch } from \"../../domain/usecases\";\nimport { NodeFileSystem } from \"../../infrastructure/filesystem\";\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 const hybridResults = await hybridSearch(rootDir, query, options);\n return hybridResults.results;\n}\n\n/**\n * Hybrid search with both semantic and exact match tracks.\n *\n * Returns:\n * - results: Semantic/BM25 results (existing behavior), with fusion boosting if applicable\n * - exactMatches: Exact match results for identifier queries (optional)\n */\nexport async function hybridSearch(\n rootDir: string,\n query: string,\n options: SearchOptions = {}\n): Promise<HybridSearchResults> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Ensure index is fresh before searching (unless explicitly disabled)\n const ensureFresh = options.ensureFresh ?? DEFAULT_SEARCH_OPTIONS.ensureFresh;\n if (ensureFresh) {\n await ensureIndexFresh(rootDir, { quiet: true });\n }\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 \"raggrep index\" first.');\n return { results: [], fusionApplied: false };\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 { results: [], fusionApplied: false };\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 // Apply path filter if specified\n let filteredResults = allResults;\n if (options.pathFilter && options.pathFilter.length > 0) {\n const normalizedFilters = options.pathFilter.map((p) =>\n p.replace(/\\\\/g, \"/\").replace(/^\\//, \"\").replace(/\\/$/, \"\")\n );\n filteredResults = allResults.filter((result) => {\n const normalizedPath = result.filepath.replace(/\\\\/g, \"/\");\n return normalizedFilters.some((filter) => {\n // Check if the filter is a glob pattern\n const isGlobPattern = /[*?[\\]{}!]/.test(filter);\n\n if (isGlobPattern) {\n // Use minimatch for glob patterns\n // Support patterns like \"*.ts\", \"src/**/*.ts\", \"**/*.md\"\n const pattern = filter.startsWith(\"**/\") ? filter : `**/${filter}`;\n return minimatch(normalizedPath, pattern, { matchBase: true });\n } else {\n // Fall back to path prefix matching for non-glob patterns\n return (\n normalizedPath.startsWith(filter + \"/\") ||\n normalizedPath === filter ||\n normalizedPath.startsWith(\"./\" + filter + \"/\") ||\n normalizedPath === \"./\" + filter\n );\n }\n });\n });\n }\n\n // Check if we should run simple search (identifier query)\n let exactMatches: ExactMatchResults | undefined;\n let fusionApplied = false;\n\n if (isIdentifierQuery(query)) {\n const literal = extractSearchLiteral(query);\n\n // Run exact match search\n exactMatches = await performExactSearch(rootDir, literal, config, options);\n\n // Apply fusion boosting: boost semantic results that also have exact matches\n if (exactMatches && exactMatches.totalMatches > 0) {\n const exactMatchFilepaths = new Set(\n exactMatches.files.map((f) => f.filepath)\n );\n\n for (const result of filteredResults) {\n // Check if this result's file has exact matches\n if (exactMatchFilepaths.has(result.filepath)) {\n // Apply fusion boost (1.5x for files with exact matches)\n result.score *= 1.5;\n\n // Mark in context\n if (!result.context) result.context = {};\n result.context.exactMatchFusion = true;\n\n fusionApplied = true;\n }\n }\n }\n }\n\n // Sort all results by score (re-sort after fusion boost)\n filteredResults.sort((a, b) => b.score - a.score);\n\n // Return top K\n const topK = options.topK ?? 10;\n\n return {\n results: filteredResults.slice(0, topK),\n exactMatches,\n fusionApplied,\n };\n}\n\n/**\n * Perform exact/literal search across all indexed files.\n *\n * This delegates to the domain use case which handles filesystem access\n * and search logic.\n */\nasync function performExactSearch(\n rootDir: string,\n literal: string,\n config: Config,\n options: SearchOptions\n): Promise<ExactMatchResults> {\n const fs = new NodeFileSystem();\n\n return executeExactSearch(\n fs,\n {\n rootDir,\n literal,\n pathFilter: options.pathFilter,\n maxFiles: 20,\n maxOccurrencesPerFile: 5,\n caseInsensitive: false,\n },\n (path: string, pattern: string) => minimatch(path, pattern, { matchBase: true })\n );\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(\n dir: string,\n files: string[],\n basePath: string\n): 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(\n rootDir: string,\n config: Config\n): 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 * Get a human-friendly name for a module ID\n */\nfunction formatModuleName(moduleId: string): string {\n switch (moduleId) {\n case \"core\":\n return \"Core\";\n case \"language/typescript\":\n return \"TypeScript\";\n default:\n // Handle future modules: \"language/python\" -> \"Python\"\n if (moduleId.startsWith(\"language/\")) {\n const lang = moduleId.replace(\"language/\", \"\");\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n return moduleId;\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: ${\n chunk.type\n }`;\n\n // Show which module contributed this result\n output += ` | via ${formatModuleName(result.moduleId)}`;\n\n // Add export indicator\n if (chunk.isExported) {\n output += \" | exported\";\n }\n\n // Add fusion indicator\n if (result.context?.exactMatchFusion) {\n output += \" | exact match\";\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\n/**\n * Format hybrid search results including exact matches.\n *\n * @param hybridResults - Results from hybridSearch\n * @returns Formatted string for console output\n */\nexport function formatHybridSearchResults(\n hybridResults: HybridSearchResults\n): string {\n let output = \"\";\n\n // Show exact matches first if present\n if (\n hybridResults.exactMatches &&\n hybridResults.exactMatches.totalMatches > 0\n ) {\n const em = hybridResults.exactMatches;\n const showingCount = Math.min(em.files.length, 10);\n\n output += `┌─ Exact Matches `;\n if (em.truncated || em.files.length < em.totalFiles) {\n output += `(showing ${showingCount} of ${em.totalFiles} files, ${em.totalMatches} total matches)`;\n } else {\n output += `(${em.totalFiles} files, ${em.totalMatches} matches)`;\n }\n output += ` ─┐\\n`;\n output += `│ Query: \"${em.query}\"\\n`;\n output += `└─────────────────────────────────────────────────────────────────────┘\\n\\n`;\n\n for (let i = 0; i < Math.min(em.files.length, 10); i++) {\n const file = em.files[i];\n output += ` ${i + 1}. ${file.filepath}`;\n if (file.matchCount > 1) {\n output += ` (${file.matchCount} matches)`;\n }\n output += \"\\n\";\n\n // Show first occurrence with context\n const firstOcc = file.occurrences[0];\n if (firstOcc) {\n // Show context before if available\n if (firstOcc.contextBefore) {\n const beforeLine = firstOcc.contextBefore.substring(0, 76);\n output += ` ${(firstOcc.line - 1).toString().padStart(4)} │ ${beforeLine}${firstOcc.contextBefore.length > 76 ? \"...\" : \"\"}\\n`;\n }\n\n // Show the matching line with highlighting marker\n const matchLine = firstOcc.lineContent.substring(0, 76);\n output += ` ► ${firstOcc.line.toString().padStart(4)} │ ${matchLine}${firstOcc.lineContent.length > 76 ? \"...\" : \"\"}\\n`;\n\n // Show context after if available\n if (firstOcc.contextAfter) {\n const afterLine = firstOcc.contextAfter.substring(0, 76);\n output += ` ${(firstOcc.line + 1).toString().padStart(4)} │ ${afterLine}${firstOcc.contextAfter.length > 76 ? \"...\" : \"\"}\\n`;\n }\n }\n\n output += \"\\n\";\n }\n\n // Separator between exact and semantic results\n if (hybridResults.results.length > 0) {\n output += \"\\n\";\n }\n }\n\n // Show semantic results\n if (hybridResults.results.length > 0) {\n if (hybridResults.exactMatches?.totalMatches) {\n output += `┌─ Semantic Results `;\n if (hybridResults.fusionApplied) {\n output += `(boosted by exact matches) `;\n }\n output += `─┐\\n`;\n output += `└─────────────────────────────────────────────────────────────────────┘\\n\\n`;\n }\n\n output += formatSearchResults(hybridResults.results);\n } else if (!hybridResults.exactMatches?.totalMatches) {\n output += \"No results found.\\n\";\n }\n\n return output;\n}\n",
|
|
62
|
+
"export const balanced = (a, b, str) => {\n const ma = a instanceof RegExp ? maybeMatch(a, str) : a;\n const mb = b instanceof RegExp ? maybeMatch(b, str) : b;\n const r = ma !== null && mb != null && range(ma, mb, str);\n return (r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + ma.length, r[1]),\n post: str.slice(r[1] + mb.length),\n });\n};\nconst maybeMatch = (reg, str) => {\n const m = str.match(reg);\n return m ? m[0] : null;\n};\nexport const range = (a, b, str) => {\n let begs, beg, left, right = undefined, result;\n let ai = str.indexOf(a);\n let bi = str.indexOf(b, ai + 1);\n let i = ai;\n if (ai >= 0 && bi > 0) {\n if (a === b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n while (i >= 0 && !result) {\n if (i === ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n }\n else if (begs.length === 1) {\n const r = begs.pop();\n if (r !== undefined)\n result = [r, bi];\n }\n else {\n beg = begs.pop();\n if (beg !== undefined && beg < left) {\n left = beg;\n right = bi;\n }\n bi = str.indexOf(b, i + 1);\n }\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n if (begs.length && right !== undefined) {\n result = [left, right];\n }\n }\n return result;\n};\n//# sourceMappingURL=index.js.map",
|
|
63
|
+
"import { balanced } from '@isaacs/balanced-match';\nconst escSlash = '\\0SLASH' + Math.random() + '\\0';\nconst escOpen = '\\0OPEN' + Math.random() + '\\0';\nconst escClose = '\\0CLOSE' + Math.random() + '\\0';\nconst escComma = '\\0COMMA' + Math.random() + '\\0';\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0';\nconst escSlashPattern = new RegExp(escSlash, 'g');\nconst escOpenPattern = new RegExp(escOpen, 'g');\nconst escClosePattern = new RegExp(escClose, 'g');\nconst escCommaPattern = new RegExp(escComma, 'g');\nconst escPeriodPattern = new RegExp(escPeriod, 'g');\nconst slashPattern = /\\\\\\\\/g;\nconst openPattern = /\\\\{/g;\nconst closePattern = /\\\\}/g;\nconst commaPattern = /\\\\,/g;\nconst periodPattern = /\\\\./g;\nfunction numeric(str) {\n return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);\n}\nfunction escapeBraces(str) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod);\n}\nfunction unescapeBraces(str) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.');\n}\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str) {\n if (!str) {\n return [''];\n }\n const parts = [];\n const m = balanced('{', '}', str);\n if (!m) {\n return str.split(',');\n }\n const { pre, body, post } = m;\n const p = pre.split(',');\n p[p.length - 1] += '{' + body + '}';\n const postParts = parseCommaParts(post);\n if (post.length) {\n ;\n p[p.length - 1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n parts.push.apply(parts, p);\n return parts;\n}\nexport function expand(str) {\n if (!str) {\n return [];\n }\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2);\n }\n return expand_(escapeBraces(str), true).map(unescapeBraces);\n}\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\nfunction expand_(str, isTop) {\n /** @type {string[]} */\n const expansions = [];\n const m = balanced('{', '}', str);\n if (!m)\n return [str];\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre;\n const post = m.post.length ? expand_(m.post, false) : [''];\n if (/\\$$/.test(m.pre)) {\n for (let k = 0; k < post.length; k++) {\n const expansion = pre + '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n }\n else {\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n const isSequence = isNumericSequence || isAlphaSequence;\n const isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand_(str);\n }\n return [str];\n }\n let n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n }\n else {\n n = parseCommaParts(m.body);\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], false).map(embrace);\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n return post.map(p => m.pre + n[0] + p);\n }\n /* c8 ignore stop */\n }\n }\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n let N;\n if (isSequence && n[0] !== undefined && n[1] !== undefined) {\n const x = numeric(n[0]);\n const y = numeric(n[1]);\n const width = Math.max(n[0].length, n[1].length);\n let incr = n.length === 3 && n[2] !== undefined ? Math.abs(numeric(n[2])) : 1;\n let test = lte;\n const reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n const pad = n.some(isPadded);\n N = [];\n for (let i = x; test(i, y); i += incr) {\n let c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\') {\n c = '';\n }\n }\n else {\n c = String(i);\n if (pad) {\n const need = width - c.length;\n if (need > 0) {\n const z = new Array(need + 1).join('0');\n if (i < 0) {\n c = '-' + z + c.slice(1);\n }\n else {\n c = z + c;\n }\n }\n }\n }\n N.push(c);\n }\n }\n else {\n N = [];\n for (let j = 0; j < n.length; j++) {\n N.push.apply(N, expand_(n[j], false));\n }\n }\n for (let j = 0; j < N.length; j++) {\n for (let k = 0; k < post.length; k++) {\n const expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion) {\n expansions.push(expansion);\n }\n }\n }\n }\n return expansions;\n}\n//# sourceMappingURL=index.js.map",
|
|
63
64
|
"const MAX_PATTERN_LENGTH = 1024 * 64;\nexport const assertValidPattern = (pattern) => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern');\n }\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long');\n }\n};\n//# sourceMappingURL=assert-valid-pattern.js.map",
|
|
64
65
|
"// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n};\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s) => s.replace(/[[\\]\\\\-]/g, '\\\\$&');\n// escape all regexp magic characters\nconst regexpEscape = (s) => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges) => ranges.join('');\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (glob, position) => {\n const pos = position;\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression');\n }\n /* c8 ignore stop */\n const ranges = [];\n const negs = [];\n let i = pos + 1;\n let sawStart = false;\n let uflag = false;\n let escaping = false;\n let negate = false;\n let endPos = pos;\n let rangeStart = '';\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i);\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true;\n i++;\n continue;\n }\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1;\n break;\n }\n sawStart = true;\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true;\n i++;\n continue;\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true];\n }\n i += cls.length;\n if (neg)\n negs.push(unip);\n else\n ranges.push(unip);\n uflag = uflag || u;\n continue WHILE;\n }\n }\n }\n // now it's just a normal character, effectively\n escaping = false;\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));\n }\n else if (c === rangeStart) {\n ranges.push(braceEscape(c));\n }\n rangeStart = '';\n i++;\n continue;\n }\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'));\n i += 2;\n continue;\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c;\n i += 2;\n continue;\n }\n // not the start of a range, just a single character\n ranges.push(braceEscape(c));\n i++;\n }\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false];\n }\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true];\n }\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];\n return [regexpEscape(r), false, endPos - pos, false];\n }\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';\n const comb = ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs;\n return [comb, uflag, endPos - pos, true];\n};\n//# sourceMappingURL=brace-expressions.js.map",
|
|
65
|
-
"/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then
|
|
66
|
-
"// parse a single path portion\nimport { parseClass } from './brace-expressions.js';\nimport { unescape } from './unescape.js';\nconst types = new Set(['!', '?', '+', '*', '@']);\nconst isExtglobType = (c) => types.has(c);\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))';\nconst startNoDot = '(?!\\\\.)';\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.']);\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.']);\nconst reSpecials = new Set('().*{}+?[]^$\\\\!');\nconst regExpEscape = (s) => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n// any single thing other than /\nconst qmark = '[^/]';\n// * => any number of characters\nconst star = qmark + '*?';\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?';\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\nexport class AST {\n type;\n #root;\n #hasMagic;\n #uflag = false;\n #parts = [];\n #parent;\n #parentIndex;\n #negs;\n #filledNegs = false;\n #options;\n #toString;\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt = false;\n constructor(type, parent, options = {}) {\n this.type = type;\n // extglobs are inherently magical\n if (type)\n this.#hasMagic = true;\n this.#parent = parent;\n this.#root = this.#parent ? this.#parent.#root : this;\n this.#options = this.#root === this ? options : this.#root.#options;\n this.#negs = this.#root === this ? [] : this.#root.#negs;\n if (type === '!' && !this.#root.#filledNegs)\n this.#negs.push(this);\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;\n }\n get hasMagic() {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined)\n return this.#hasMagic;\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string')\n continue;\n if (p.type || p.hasMagic)\n return (this.#hasMagic = true);\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic;\n }\n // reconstructs the pattern\n toString() {\n if (this.#toString !== undefined)\n return this.#toString;\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''));\n }\n else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');\n }\n }\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root)\n throw new Error('should only call on root');\n if (this.#filledNegs)\n return this;\n /* c8 ignore stop */\n // call toString() once to fill this out\n this.toString();\n this.#filledNegs = true;\n let n;\n while ((n = this.#negs.pop())) {\n if (n.type !== '!')\n continue;\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p = n;\n let pp = p.#parent;\n while (pp) {\n for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??');\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i]);\n }\n }\n p = pp;\n pp = p.#parent;\n }\n }\n return this;\n }\n push(...parts) {\n for (const p of parts) {\n if (p === '')\n continue;\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p);\n }\n /* c8 ignore stop */\n this.#parts.push(p);\n }\n }\n toJSON() {\n const ret = this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => p.toJSON())];\n if (this.isStart() && !this.type)\n ret.unshift([]);\n if (this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))) {\n ret.push({});\n }\n return ret;\n }\n isStart() {\n if (this.#root === this)\n return true;\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart())\n return false;\n if (this.#parentIndex === 0)\n return true;\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent;\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i];\n if (!(pp instanceof AST && pp.type === '!')) {\n return false;\n }\n }\n return true;\n }\n isEnd() {\n if (this.#root === this)\n return true;\n if (this.#parent?.type === '!')\n return true;\n if (!this.#parent?.isEnd())\n return false;\n if (!this.type)\n return this.#parent?.isEnd();\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0;\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1;\n }\n copyIn(part) {\n if (typeof part === 'string')\n this.push(part);\n else\n this.push(part.clone(this));\n }\n clone(parent) {\n const c = new AST(this.type, parent);\n for (const p of this.#parts) {\n c.copyIn(p);\n }\n return c;\n }\n static #parseAST(str, ast, pos, opt) {\n let escaping = false;\n let inBrace = false;\n let braceStart = -1;\n let braceNeg = false;\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos;\n let acc = '';\n while (i < str.length) {\n const c = str.charAt(i++);\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping;\n acc += c;\n continue;\n }\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true;\n }\n }\n else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false;\n }\n acc += c;\n continue;\n }\n else if (c === '[') {\n inBrace = true;\n braceStart = i;\n braceNeg = false;\n acc += c;\n continue;\n }\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc);\n acc = '';\n const ext = new AST(c, ast);\n i = AST.#parseAST(str, ext, i, opt);\n ast.push(ext);\n continue;\n }\n acc += c;\n }\n ast.push(acc);\n return i;\n }\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1;\n let part = new AST(null, ast);\n const parts = [];\n let acc = '';\n while (i < str.length) {\n const c = str.charAt(i++);\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping;\n acc += c;\n continue;\n }\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true;\n }\n }\n else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false;\n }\n acc += c;\n continue;\n }\n else if (c === '[') {\n inBrace = true;\n braceStart = i;\n braceNeg = false;\n acc += c;\n continue;\n }\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc);\n acc = '';\n const ext = new AST(c, part);\n part.push(ext);\n i = AST.#parseAST(str, ext, i, opt);\n continue;\n }\n if (c === '|') {\n part.push(acc);\n acc = '';\n parts.push(part);\n part = new AST(null, ast);\n continue;\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true;\n }\n part.push(acc);\n acc = '';\n ast.push(...parts, part);\n return i;\n }\n acc += c;\n }\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null;\n ast.#hasMagic = undefined;\n ast.#parts = [str.substring(pos - 1)];\n return i;\n }\n static fromGlob(pattern, options = {}) {\n const ast = new AST(null, undefined, options);\n AST.#parseAST(pattern, ast, 0, options);\n return ast;\n }\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern() {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root)\n return this.#root.toMMPattern();\n /* c8 ignore stop */\n const glob = this.toString();\n const [re, body, hasMagic, uflag] = this.toRegExpSource();\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic = hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase());\n if (!anyMagic) {\n return body;\n }\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n });\n }\n get options() {\n return this.#options;\n }\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(allowDot) {\n const dot = allowDot ?? !!this.#options.dot;\n if (this.#root === this)\n this.#fillNegs();\n if (!this.type) {\n const noEmpty = this.isStart() && this.isEnd();\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] = typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot);\n this.#hasMagic = this.#hasMagic || hasMagic;\n this.#uflag = this.#uflag || uflag;\n return re;\n })\n .join('');\n let start = '';\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);\n if (!dotTravAllowed) {\n const aps = addPatternStart;\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav = \n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)));\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';\n }\n }\n }\n // append the \"end of path portion\" pattern to negation tails\n let end = '';\n if (this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!') {\n end = '(?:$|\\\\/)';\n }\n const final = start + src + end;\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ];\n }\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n const repeated = this.type === '*' || this.type === '+';\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:';\n let body = this.#partsToRegExp(dot);\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString();\n this.#parts = [s];\n this.type = null;\n this.#hasMagic = undefined;\n return [s, unescape(this.toString()), false, false];\n }\n // XXX abstract out this map method\n let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true);\n if (bodyDotAllowed === body) {\n bodyDotAllowed = '';\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`;\n }\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = '';\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;\n }\n else {\n const close = this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`;\n final = start + body + close;\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ];\n }\n #partsToRegExp(dot) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??');\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);\n this.#uflag = this.#uflag || uflag;\n return re;\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|');\n }\n static #parseGlob(glob, hasMagic, noEmpty = false) {\n let escaping = false;\n let re = '';\n let uflag = false;\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i);\n if (escaping) {\n escaping = false;\n re += (reSpecials.has(c) ? '\\\\' : '') + c;\n continue;\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\';\n }\n else {\n escaping = true;\n }\n continue;\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i);\n if (consumed) {\n re += src;\n uflag = uflag || needUflag;\n i += consumed - 1;\n hasMagic = hasMagic || magic;\n continue;\n }\n }\n if (c === '*') {\n if (noEmpty && glob === '*')\n re += starNoEmpty;\n else\n re += star;\n hasMagic = true;\n continue;\n }\n if (c === '?') {\n re += qmark;\n hasMagic = true;\n continue;\n }\n re += regExpEscape(c);\n }\n return [re, unescape(glob), !!hasMagic, uflag];\n }\n}\n//# sourceMappingURL=ast.js.map",
|
|
67
|
-
"/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link
|
|
68
|
-
"/**\n * Type definitions for the RAG system\n *\n * This file re-exports domain entities and defines module interfaces.\n * For new code, prefer importing directly from 'domain/entities'.\n */\n\n// Re-export all domain entities for backwards compatibility\nexport type {\n Chunk,\n ChunkType,\n FileIndex,\n FileManifestEntry,\n ModuleManifest,\n GlobalManifest,\n FileSummary,\n Tier1Manifest,\n SearchResult,\n SearchOptions,\n SearchContributions,\n CoreContribution,\n LanguageContribution,\n IntrospectionContribution,\n Config,\n ModuleConfig,\n} from \"./domain/entities\";\n\nexport {\n createChunkId,\n DEFAULT_SEARCH_OPTIONS,\n DEFAULT_IGNORE_PATHS,\n DEFAULT_EXTENSIONS,\n createDefaultConfig,\n} from \"./domain/entities\";\n\n// ============================================================================\n// Module System Interfaces\n// ============================================================================\n\nimport type {\n Config,\n FileIndex,\n SearchResult,\n SearchOptions,\n ModuleConfig,\n} from \"./domain/entities\";\n\n/**\n * Context provided to modules during indexing\n */\nimport type { FileIntrospection } from \"./domain/entities/introspection\";\n\nexport interface IndexContext {\n rootDir: string;\n config: Config;\n /** Get the content of a file */\n readFile: (filepath: string) => Promise<string>;\n /** Get file stats */\n getFileStats: (filepath: string) => Promise<{ lastModified: string }>;\n /** Get introspection data for a file (if available) */\n getIntrospection?: (filepath: string) => FileIntrospection | undefined;\n}\n\n/**\n * Context provided to modules during search\n */\nexport interface SearchContext {\n rootDir: string;\n config: Config;\n /** Load index data for a specific file */\n loadFileIndex: (filepath: string) => Promise<FileIndex | null>;\n /** List all indexed files */\n listIndexedFiles: () => Promise<string[]>;\n}\n\n/**\n * Base interface for index modules\n *\n * Modules provide different strategies for indexing and retrieving code.\n * Examples:\n * - SemanticModule: Uses text embeddings for natural language search\n * - SymbolModule: Uses TypeScript/LSP symbol information\n * - ASTModule: Uses AST-based code structure analysis\n */\nexport interface IndexModule {\n /** Unique identifier for this module */\n readonly id: string;\n\n /** Human-readable name */\n readonly name: string;\n\n /** Description of what this module indexes */\n readonly description: string;\n\n /** Version of the module (for index compatibility) */\n readonly version: string;\n\n /**\n * Index a single file\n * @returns FileIndex with module-specific data, or null if file should be skipped\n */\n indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null>;\n\n /**\n * Search the index with a query\n * @returns Ranked search results\n */\n search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]>;\n\n /**\n * Optional: Initialize the module (e.g., load models, connect to services)\n */\n initialize?(config: ModuleConfig): Promise<void>;\n\n /**\n * Optional: Called after all files have been indexed.\n * Use for building secondary indexes (e.g., Tier 1 summaries, BM25 index).\n */\n finalize?(ctx: IndexContext): Promise<void>;\n\n /**\n * Optional: Check if this module supports a given file.\n * Used to pre-filter files before indexing to show accurate progress.\n * If not implemented, all files are passed to indexFile.\n */\n supportsFile?(filepath: string): boolean;\n\n /**\n * Optional: Cleanup resources\n */\n dispose?(): Promise<void>;\n}\n\n/**\n * Registry for managing available modules\n */\nexport interface ModuleRegistry {\n register(module: IndexModule): void;\n get(id: string): IndexModule | undefined;\n list(): IndexModule[];\n getEnabled(config: Config): IndexModule[];\n}\n",
|
|
69
|
-
"/**\n *
|
|
66
|
+
"/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\nexport const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => {\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1');\n }\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1');\n};\n//# sourceMappingURL=unescape.js.map",
|
|
67
|
+
"// parse a single path portion\nimport { parseClass } from './brace-expressions.js';\nimport { unescape } from './unescape.js';\nconst types = new Set(['!', '?', '+', '*', '@']);\nconst isExtglobType = (c) => types.has(c);\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))';\nconst startNoDot = '(?!\\\\.)';\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.']);\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.']);\nconst reSpecials = new Set('().*{}+?[]^$\\\\!');\nconst regExpEscape = (s) => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n// any single thing other than /\nconst qmark = '[^/]';\n// * => any number of characters\nconst star = qmark + '*?';\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?';\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\nexport class AST {\n type;\n #root;\n #hasMagic;\n #uflag = false;\n #parts = [];\n #parent;\n #parentIndex;\n #negs;\n #filledNegs = false;\n #options;\n #toString;\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt = false;\n constructor(type, parent, options = {}) {\n this.type = type;\n // extglobs are inherently magical\n if (type)\n this.#hasMagic = true;\n this.#parent = parent;\n this.#root = this.#parent ? this.#parent.#root : this;\n this.#options = this.#root === this ? options : this.#root.#options;\n this.#negs = this.#root === this ? [] : this.#root.#negs;\n if (type === '!' && !this.#root.#filledNegs)\n this.#negs.push(this);\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;\n }\n get hasMagic() {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined)\n return this.#hasMagic;\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string')\n continue;\n if (p.type || p.hasMagic)\n return (this.#hasMagic = true);\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic;\n }\n // reconstructs the pattern\n toString() {\n if (this.#toString !== undefined)\n return this.#toString;\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''));\n }\n else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');\n }\n }\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root)\n throw new Error('should only call on root');\n if (this.#filledNegs)\n return this;\n /* c8 ignore stop */\n // call toString() once to fill this out\n this.toString();\n this.#filledNegs = true;\n let n;\n while ((n = this.#negs.pop())) {\n if (n.type !== '!')\n continue;\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p = n;\n let pp = p.#parent;\n while (pp) {\n for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??');\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i]);\n }\n }\n p = pp;\n pp = p.#parent;\n }\n }\n return this;\n }\n push(...parts) {\n for (const p of parts) {\n if (p === '')\n continue;\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p);\n }\n /* c8 ignore stop */\n this.#parts.push(p);\n }\n }\n toJSON() {\n const ret = this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => p.toJSON())];\n if (this.isStart() && !this.type)\n ret.unshift([]);\n if (this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))) {\n ret.push({});\n }\n return ret;\n }\n isStart() {\n if (this.#root === this)\n return true;\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart())\n return false;\n if (this.#parentIndex === 0)\n return true;\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent;\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i];\n if (!(pp instanceof AST && pp.type === '!')) {\n return false;\n }\n }\n return true;\n }\n isEnd() {\n if (this.#root === this)\n return true;\n if (this.#parent?.type === '!')\n return true;\n if (!this.#parent?.isEnd())\n return false;\n if (!this.type)\n return this.#parent?.isEnd();\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0;\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1;\n }\n copyIn(part) {\n if (typeof part === 'string')\n this.push(part);\n else\n this.push(part.clone(this));\n }\n clone(parent) {\n const c = new AST(this.type, parent);\n for (const p of this.#parts) {\n c.copyIn(p);\n }\n return c;\n }\n static #parseAST(str, ast, pos, opt) {\n let escaping = false;\n let inBrace = false;\n let braceStart = -1;\n let braceNeg = false;\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos;\n let acc = '';\n while (i < str.length) {\n const c = str.charAt(i++);\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping;\n acc += c;\n continue;\n }\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true;\n }\n }\n else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false;\n }\n acc += c;\n continue;\n }\n else if (c === '[') {\n inBrace = true;\n braceStart = i;\n braceNeg = false;\n acc += c;\n continue;\n }\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc);\n acc = '';\n const ext = new AST(c, ast);\n i = AST.#parseAST(str, ext, i, opt);\n ast.push(ext);\n continue;\n }\n acc += c;\n }\n ast.push(acc);\n return i;\n }\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1;\n let part = new AST(null, ast);\n const parts = [];\n let acc = '';\n while (i < str.length) {\n const c = str.charAt(i++);\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping;\n acc += c;\n continue;\n }\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true;\n }\n }\n else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false;\n }\n acc += c;\n continue;\n }\n else if (c === '[') {\n inBrace = true;\n braceStart = i;\n braceNeg = false;\n acc += c;\n continue;\n }\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc);\n acc = '';\n const ext = new AST(c, part);\n part.push(ext);\n i = AST.#parseAST(str, ext, i, opt);\n continue;\n }\n if (c === '|') {\n part.push(acc);\n acc = '';\n parts.push(part);\n part = new AST(null, ast);\n continue;\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true;\n }\n part.push(acc);\n acc = '';\n ast.push(...parts, part);\n return i;\n }\n acc += c;\n }\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null;\n ast.#hasMagic = undefined;\n ast.#parts = [str.substring(pos - 1)];\n return i;\n }\n static fromGlob(pattern, options = {}) {\n const ast = new AST(null, undefined, options);\n AST.#parseAST(pattern, ast, 0, options);\n return ast;\n }\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern() {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root)\n return this.#root.toMMPattern();\n /* c8 ignore stop */\n const glob = this.toString();\n const [re, body, hasMagic, uflag] = this.toRegExpSource();\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic = hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase());\n if (!anyMagic) {\n return body;\n }\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n });\n }\n get options() {\n return this.#options;\n }\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(allowDot) {\n const dot = allowDot ?? !!this.#options.dot;\n if (this.#root === this)\n this.#fillNegs();\n if (!this.type) {\n const noEmpty = this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string');\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] = typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot);\n this.#hasMagic = this.#hasMagic || hasMagic;\n this.#uflag = this.#uflag || uflag;\n return re;\n })\n .join('');\n let start = '';\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);\n if (!dotTravAllowed) {\n const aps = addPatternStart;\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav = \n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)));\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';\n }\n }\n }\n // append the \"end of path portion\" pattern to negation tails\n let end = '';\n if (this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!') {\n end = '(?:$|\\\\/)';\n }\n const final = start + src + end;\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ];\n }\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n const repeated = this.type === '*' || this.type === '+';\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:';\n let body = this.#partsToRegExp(dot);\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString();\n this.#parts = [s];\n this.type = null;\n this.#hasMagic = undefined;\n return [s, unescape(this.toString()), false, false];\n }\n // XXX abstract out this map method\n let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true);\n if (bodyDotAllowed === body) {\n bodyDotAllowed = '';\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`;\n }\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = '';\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;\n }\n else {\n const close = this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`;\n final = start + body + close;\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ];\n }\n #partsToRegExp(dot) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??');\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);\n this.#uflag = this.#uflag || uflag;\n return re;\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|');\n }\n static #parseGlob(glob, hasMagic, noEmpty = false) {\n let escaping = false;\n let re = '';\n let uflag = false;\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i);\n if (escaping) {\n escaping = false;\n re += (reSpecials.has(c) ? '\\\\' : '') + c;\n continue;\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\';\n }\n else {\n escaping = true;\n }\n continue;\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i);\n if (consumed) {\n re += src;\n uflag = uflag || needUflag;\n i += consumed - 1;\n hasMagic = hasMagic || magic;\n continue;\n }\n }\n if (c === '*') {\n re += noEmpty && glob === '*' ? starNoEmpty : star;\n hasMagic = true;\n continue;\n }\n if (c === '?') {\n re += qmark;\n hasMagic = true;\n continue;\n }\n re += regExpEscape(c);\n }\n return [re, unescape(glob), !!hasMagic, uflag];\n }\n}\n//# sourceMappingURL=ast.js.map",
|
|
68
|
+
"/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&');\n }\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&');\n};\n//# sourceMappingURL=escape.js.map",
|
|
69
|
+
"import { expand } from '@isaacs/brace-expansion';\nimport { assertValidPattern } from './assert-valid-pattern.js';\nimport { AST } from './ast.js';\nimport { escape } from './escape.js';\nimport { unescape } from './unescape.js';\nexport const minimatch = (p, pattern, options = {}) => {\n assertValidPattern(pattern);\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false;\n }\n return new Minimatch(pattern, options).match(p);\n};\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/;\nconst starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);\nconst starDotExtTestDot = (ext) => (f) => f.endsWith(ext);\nconst starDotExtTestNocase = (ext) => {\n ext = ext.toLowerCase();\n return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);\n};\nconst starDotExtTestNocaseDot = (ext) => {\n ext = ext.toLowerCase();\n return (f) => f.toLowerCase().endsWith(ext);\n};\nconst starDotStarRE = /^\\*+\\.\\*+$/;\nconst starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');\nconst starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');\nconst dotStarRE = /^\\.\\*+$/;\nconst dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');\nconst starRE = /^\\*+$/;\nconst starTest = (f) => f.length !== 0 && !f.startsWith('.');\nconst starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/;\nconst qmarksTestNocase = ([$0, ext = '']) => {\n const noext = qmarksTestNoExt([$0]);\n if (!ext)\n return noext;\n ext = ext.toLowerCase();\n return (f) => noext(f) && f.toLowerCase().endsWith(ext);\n};\nconst qmarksTestNocaseDot = ([$0, ext = '']) => {\n const noext = qmarksTestNoExtDot([$0]);\n if (!ext)\n return noext;\n ext = ext.toLowerCase();\n return (f) => noext(f) && f.toLowerCase().endsWith(ext);\n};\nconst qmarksTestDot = ([$0, ext = '']) => {\n const noext = qmarksTestNoExtDot([$0]);\n return !ext ? noext : (f) => noext(f) && f.endsWith(ext);\n};\nconst qmarksTest = ([$0, ext = '']) => {\n const noext = qmarksTestNoExt([$0]);\n return !ext ? noext : (f) => noext(f) && f.endsWith(ext);\n};\nconst qmarksTestNoExt = ([$0]) => {\n const len = $0.length;\n return (f) => f.length === len && !f.startsWith('.');\n};\nconst qmarksTestNoExtDot = ([$0]) => {\n const len = $0.length;\n return (f) => f.length === len && f !== '.' && f !== '..';\n};\n/* c8 ignore start */\nconst defaultPlatform = (typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix');\nconst path = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n};\n/* c8 ignore stop */\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;\nminimatch.sep = sep;\nexport const GLOBSTAR = Symbol('globstar **');\nminimatch.GLOBSTAR = GLOBSTAR;\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]';\n// * => any number of characters\nconst star = qmark + '*?';\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?';\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?';\nexport const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);\nminimatch.filter = filter;\nconst ext = (a, b = {}) => Object.assign({}, a, b);\nexport const defaults = (def) => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch;\n }\n const orig = minimatch;\n const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern, options = {}) {\n super(pattern, ext(def, options));\n }\n static defaults(options) {\n return orig.defaults(ext(def, options)).Minimatch;\n }\n },\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(type, parent, options = {}) {\n super(type, parent, ext(def, options));\n }\n /* c8 ignore stop */\n static fromGlob(pattern, options = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options));\n }\n },\n unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),\n escape: (s, options = {}) => orig.escape(s, ext(def, options)),\n filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),\n defaults: (options) => orig.defaults(ext(def, options)),\n makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),\n braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),\n match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR,\n });\n};\nminimatch.defaults = defaults;\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (pattern, options = {}) => {\n assertValidPattern(pattern);\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern];\n }\n return expand(pattern);\n};\nminimatch.braceExpand = braceExpand;\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nexport const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();\nminimatch.makeRe = makeRe;\nexport const match = (list, pattern, options = {}) => {\n const mm = new Minimatch(pattern, options);\n list = list.filter(f => mm.match(f));\n if (mm.options.nonull && !list.length) {\n list.push(pattern);\n }\n return list;\n};\nminimatch.match = match;\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/;\nconst regExpEscape = (s) => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\nexport class Minimatch {\n options;\n set;\n pattern;\n windowsPathsNoEscape;\n nonegate;\n negate;\n comment;\n empty;\n preserveMultipleSlashes;\n partial;\n globSet;\n globParts;\n nocase;\n isWindows;\n platform;\n windowsNoMagicRoot;\n regexp;\n constructor(pattern, options = {}) {\n assertValidPattern(pattern);\n options = options || {};\n this.options = options;\n this.pattern = pattern;\n this.platform = options.platform || defaultPlatform;\n this.isWindows = this.platform === 'win32';\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/');\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;\n this.regexp = null;\n this.negate = false;\n this.nonegate = !!options.nonegate;\n this.comment = false;\n this.empty = false;\n this.partial = !!options.partial;\n this.nocase = !!this.options.nocase;\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase);\n this.globSet = [];\n this.globParts = [];\n this.set = [];\n // make the set of regexps etc.\n this.make();\n }\n hasMagic() {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true;\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string')\n return true;\n }\n }\n return false;\n }\n debug(..._) { }\n make() {\n const pattern = this.pattern;\n const options = this.options;\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true;\n return;\n }\n if (!pattern) {\n this.empty = true;\n return;\n }\n // step 1: figure out negation, etc.\n this.parseNegate();\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())];\n if (options.debug) {\n this.debug = (...args) => console.error(...args);\n }\n this.debug(this.pattern, this.globSet);\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s));\n this.globParts = this.preprocess(rawGlobParts);\n this.debug(this.pattern, this.globParts);\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC = s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3]);\n const isDrive = /^[a-z]:/i.test(s[0]);\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];\n }\n else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))];\n }\n }\n return s.map(ss => this.parse(ss));\n });\n this.debug(this.pattern, set);\n // filter out everything that didn't compile properly.\n this.set = set.filter(s => s.indexOf(false) === -1);\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i];\n if (p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])) {\n p[2] = '?';\n }\n }\n }\n this.debug(this.pattern, this.set);\n }\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*';\n }\n }\n }\n }\n const { optimizationLevel = 1 } = this.options;\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts);\n globParts = this.secondPhasePreProcess(globParts);\n }\n else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts);\n }\n else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts);\n }\n return globParts;\n }\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts) {\n return globParts.map(parts => {\n let gs = -1;\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs;\n while (parts[i + 1] === '**') {\n i++;\n }\n if (i !== gs) {\n parts.splice(gs, i - gs);\n }\n }\n return parts;\n });\n }\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts) {\n return globParts.map(parts => {\n parts = parts.reduce((set, part) => {\n const prev = set[set.length - 1];\n if (part === '**' && prev === '**') {\n return set;\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop();\n return set;\n }\n }\n set.push(part);\n return set;\n }, []);\n return parts.length === 0 ? [''] : parts;\n });\n }\n levelTwoFileOptimize(parts) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts);\n }\n let didSomething = false;\n do {\n didSomething = false;\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i];\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '')\n continue;\n if (p === '.' || p === '') {\n didSomething = true;\n parts.splice(i, 1);\n i--;\n }\n }\n if (parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')) {\n didSomething = true;\n parts.pop();\n }\n }\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd = 0;\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1];\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true;\n parts.splice(dd - 1, 2);\n dd -= 2;\n }\n }\n } while (didSomething);\n return parts.length === 0 ? [''] : parts;\n }\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts) {\n let didSomething = false;\n do {\n didSomething = false;\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs = -1;\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss = gs;\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++;\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs);\n }\n let next = parts[gs + 1];\n const p = parts[gs + 2];\n const p2 = parts[gs + 3];\n if (next !== '..')\n continue;\n if (!p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..') {\n continue;\n }\n didSomething = true;\n // edit parts in place, and push the new one\n parts.splice(gs, 1);\n const other = parts.slice(0);\n other[gs] = '**';\n globParts.push(other);\n gs--;\n }\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i];\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '')\n continue;\n if (p === '.' || p === '') {\n didSomething = true;\n parts.splice(i, 1);\n i--;\n }\n }\n if (parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')) {\n didSomething = true;\n parts.pop();\n }\n }\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd = 0;\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1];\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true;\n const needDot = dd === 1 && parts[dd + 1] === '**';\n const splin = needDot ? ['.'] : [];\n parts.splice(dd - 1, 2, ...splin);\n if (parts.length === 0)\n parts.push('');\n dd -= 2;\n }\n }\n }\n } while (didSomething);\n return globParts;\n }\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts) {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);\n if (matched) {\n globParts[i] = [];\n globParts[j] = matched;\n break;\n }\n }\n }\n return globParts.filter(gs => gs.length);\n }\n partsMatch(a, b, emptyGSMatch = false) {\n let ai = 0;\n let bi = 0;\n let result = [];\n let which = '';\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai]);\n ai++;\n bi++;\n }\n else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai]);\n ai++;\n }\n else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi]);\n bi++;\n }\n else if (a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**') {\n if (which === 'b')\n return false;\n which = 'a';\n result.push(a[ai]);\n ai++;\n bi++;\n }\n else if (b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**') {\n if (which === 'a')\n return false;\n which = 'b';\n result.push(b[bi]);\n ai++;\n bi++;\n }\n else {\n return false;\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result;\n }\n parseNegate() {\n if (this.nonegate)\n return;\n const pattern = this.pattern;\n let negate = false;\n let negateOffset = 0;\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate;\n negateOffset++;\n }\n if (negateOffset)\n this.pattern = pattern.slice(negateOffset);\n this.negate = negate;\n }\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file, pattern, partial = false) {\n const options = this.options;\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);\n const fileUNC = !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3]);\n const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);\n const patternUNC = !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3]);\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd] = [file[fdi], pattern[pdi]];\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd;\n if (pdi > fdi) {\n pattern = pattern.slice(pdi);\n }\n else if (fdi > pdi) {\n file = file.slice(fdi);\n }\n }\n }\n }\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options;\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file);\n }\n this.debug('matchOne', this, { file, pattern });\n this.debug('matchOne', file.length, pattern.length);\n for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {\n this.debug('matchOne loop');\n var p = pattern[pi];\n var f = file[fi];\n this.debug(pattern, p, f);\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false;\n }\n /* c8 ignore stop */\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f]);\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi;\n var pr = pi + 1;\n if (pr === pl) {\n this.debug('** at the end');\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.'))\n return false;\n }\n return true;\n }\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr];\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee);\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee);\n // found a match.\n return true;\n }\n else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr);\n break;\n }\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue');\n fr++;\n }\n }\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr);\n if (fr === fl) {\n return true;\n }\n }\n /* c8 ignore stop */\n return false;\n }\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit;\n if (typeof p === 'string') {\n hit = f === p;\n this.debug('string match', p, f, hit);\n }\n else {\n hit = p.test(f);\n this.debug('pattern match', p, f, hit);\n }\n if (!hit)\n return false;\n }\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true;\n }\n else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial;\n }\n else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === '';\n /* c8 ignore start */\n }\n else {\n // should be unreachable.\n throw new Error('wtf?');\n }\n /* c8 ignore stop */\n }\n braceExpand() {\n return braceExpand(this.pattern, this.options);\n }\n parse(pattern) {\n assertValidPattern(pattern);\n const options = this.options;\n // shortcuts\n if (pattern === '**')\n return GLOBSTAR;\n if (pattern === '')\n return '';\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m;\n let fastTest = null;\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest;\n }\n else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest)(m[1]);\n }\n else if ((m = pattern.match(qmarksRE))) {\n fastTest = (options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest)(m);\n }\n else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest;\n }\n else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest;\n }\n const re = AST.fromGlob(pattern, this.options).toMMPattern();\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest });\n }\n return re;\n }\n makeRe() {\n if (this.regexp || this.regexp === false)\n return this.regexp;\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set;\n if (!set.length) {\n this.regexp = false;\n return this.regexp;\n }\n const options = this.options;\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot;\n const flags = new Set(options.nocase ? ['i'] : []);\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split(''))\n flags.add(f);\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src;\n });\n pp.forEach((p, i) => {\n const next = pp[i + 1];\n const prev = pp[i - 1];\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return;\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next;\n }\n else {\n pp[i] = twoStar;\n }\n }\n else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?';\n }\n else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next;\n pp[i + 1] = GLOBSTAR;\n }\n });\n const filtered = pp.filter(p => p !== GLOBSTAR);\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes = [];\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'));\n }\n return '(?:' + prefixes.join('|') + ')';\n }\n return filtered.join('/');\n })\n .join('|');\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$';\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$';\n }\n // can match anything, as long as it's not this.\n if (this.negate)\n re = '^(?!' + re + ').+$';\n try {\n this.regexp = new RegExp(re, [...flags].join(''));\n /* c8 ignore start */\n }\n catch (ex) {\n // should be impossible\n this.regexp = false;\n }\n /* c8 ignore stop */\n return this.regexp;\n }\n slashSplit(p) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/');\n }\n else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)];\n }\n else {\n return p.split(/\\/+/);\n }\n }\n match(f, partial = this.partial) {\n this.debug('match', f, this.pattern);\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false;\n }\n if (this.empty) {\n return f === '';\n }\n if (f === '/' && partial) {\n return true;\n }\n const options = this.options;\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/');\n }\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f);\n this.debug(this.pattern, 'split', ff);\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n const set = this.set;\n this.debug(this.pattern, 'set', set);\n // Find the basename of the path by looking for the last non-empty segment\n let filename = ff[ff.length - 1];\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i];\n }\n }\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i];\n let file = ff;\n if (options.matchBase && pattern.length === 1) {\n file = [filename];\n }\n const hit = this.matchOne(file, pattern, partial);\n if (hit) {\n if (options.flipNegate) {\n return true;\n }\n return !this.negate;\n }\n }\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false;\n }\n return this.negate;\n }\n static defaults(def) {\n return minimatch.defaults(def).Minimatch;\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js';\nexport { escape } from './escape.js';\nexport { unescape } from './unescape.js';\n/* c8 ignore stop */\nminimatch.AST = AST;\nminimatch.Minimatch = Minimatch;\nminimatch.escape = escape;\nminimatch.unescape = unescape;\n//# sourceMappingURL=index.js.map",
|
|
70
|
+
"/**\n * Type definitions for the RAG system\n *\n * This file re-exports domain entities and defines module interfaces.\n * For new code, prefer importing directly from 'domain/entities'.\n */\n\n// Re-export all domain entities for backwards compatibility\nexport type {\n Chunk,\n ChunkType,\n FileIndex,\n FileManifestEntry,\n ModuleManifest,\n GlobalManifest,\n FileSummary,\n Tier1Manifest,\n SearchResult,\n SearchOptions,\n SearchContributions,\n CoreContribution,\n LanguageContribution,\n IntrospectionContribution,\n Config,\n ModuleConfig,\n // Exact match types\n ExactMatchOccurrence,\n ExactMatchFile,\n ExactMatchResults,\n HybridSearchResults,\n} from \"./domain/entities\";\n\nexport {\n createChunkId,\n DEFAULT_SEARCH_OPTIONS,\n DEFAULT_IGNORE_PATHS,\n DEFAULT_EXTENSIONS,\n createDefaultConfig,\n} from \"./domain/entities\";\n\n// ============================================================================\n// Module System Interfaces\n// ============================================================================\n\nimport type {\n Config,\n FileIndex,\n SearchResult,\n SearchOptions,\n ModuleConfig,\n} from \"./domain/entities\";\n\n/**\n * Context provided to modules during indexing\n */\nimport type { FileIntrospection } from \"./domain/entities/introspection\";\n\nexport interface IndexContext {\n rootDir: string;\n config: Config;\n /** Get the content of a file */\n readFile: (filepath: string) => Promise<string>;\n /** Get file stats */\n getFileStats: (filepath: string) => Promise<{ lastModified: string }>;\n /** Get introspection data for a file (if available) */\n getIntrospection?: (filepath: string) => FileIntrospection | undefined;\n}\n\n/**\n * Context provided to modules during search\n */\nexport interface SearchContext {\n rootDir: string;\n config: Config;\n /** Load index data for a specific file */\n loadFileIndex: (filepath: string) => Promise<FileIndex | null>;\n /** List all indexed files */\n listIndexedFiles: () => Promise<string[]>;\n}\n\n/**\n * Base interface for index modules\n *\n * Modules provide different strategies for indexing and retrieving code.\n * Examples:\n * - SemanticModule: Uses text embeddings for natural language search\n * - SymbolModule: Uses TypeScript/LSP symbol information\n * - ASTModule: Uses AST-based code structure analysis\n */\nexport interface IndexModule {\n /** Unique identifier for this module */\n readonly id: string;\n\n /** Human-readable name */\n readonly name: string;\n\n /** Description of what this module indexes */\n readonly description: string;\n\n /** Version of the module (for index compatibility) */\n readonly version: string;\n\n /**\n * Index a single file\n * @returns FileIndex with module-specific data, or null if file should be skipped\n */\n indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null>;\n\n /**\n * Search the index with a query\n * @returns Ranked search results\n */\n search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]>;\n\n /**\n * Optional: Initialize the module (e.g., load models, connect to services)\n */\n initialize?(config: ModuleConfig): Promise<void>;\n\n /**\n * Optional: Called after all files have been indexed.\n * Use for building secondary indexes (e.g., Tier 1 summaries, BM25 index).\n */\n finalize?(ctx: IndexContext): Promise<void>;\n\n /**\n * Optional: Check if this module supports a given file.\n * Used to pre-filter files before indexing to show accurate progress.\n * If not implemented, all files are passed to indexFile.\n */\n supportsFile?(filepath: string): boolean;\n\n /**\n * Optional: Cleanup resources\n */\n dispose?(): Promise<void>;\n}\n\n/**\n * Registry for managing available modules\n */\nexport interface ModuleRegistry {\n register(module: IndexModule): void;\n get(id: string): IndexModule | undefined;\n list(): IndexModule[];\n getEnabled(config: Config): IndexModule[];\n}\n",
|
|
71
|
+
"/**\n * Exact Search Use Case\n *\n * Orchestrates grep-like exact text search across source files.\n * This use case coordinates filesystem access and the simple search service.\n */\n\nimport type { FileSystem } from \"../ports\";\nimport type { ExactMatchResults } from \"../entities\";\nimport type { Config } from \"../entities\";\nimport {\n findOccurrences,\n searchFiles,\n isSearchableContent,\n} from \"../services/simpleSearch\";\n\n/**\n * Options for exact search operation.\n */\nexport interface ExactSearchOptions {\n /** Root directory to search in */\n rootDir: string;\n\n /** The literal string to search for */\n literal: string;\n\n /** Optional path filter patterns */\n pathFilter?: string[];\n\n /** Maximum number of files to return */\n maxFiles?: number;\n\n /** Maximum occurrences per file */\n maxOccurrencesPerFile?: number;\n\n /** Case-insensitive matching */\n caseInsensitive?: boolean;\n}\n\n/**\n * Default directories to ignore during exact search.\n */\nconst DEFAULT_IGNORED_DIRS = [\n \"node_modules\",\n \".git\",\n \".raggrep\",\n \"dist\",\n \"build\",\n \".next\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n];\n\n/**\n * Check if a file path matches any of the given filters.\n *\n * Supports two modes:\n * - Glob patterns: Contains wildcards like *, ?, etc.\n * - Path prefixes: Plain directory paths\n *\n * @param relativePath - File path relative to root\n * @param filters - Array of filters (glob patterns or path prefixes)\n * @param matchFn - Function to test glob patterns (e.g., minimatch)\n * @returns true if the path matches any filter\n */\nexport function matchesPathFilter(\n relativePath: string,\n filters: string[],\n matchFn: (path: string, pattern: string) => boolean\n): boolean {\n const normalizedPath = relativePath.replace(/\\\\/g, \"/\");\n\n for (const filter of filters) {\n const normalizedFilter = filter\n .replace(/\\\\/g, \"/\")\n .replace(/^\\//, \"\")\n .replace(/\\/$/, \"\");\n\n // Check if it's a glob pattern (contains wildcards)\n const isGlobPattern = /[*?[\\]{}!]/.test(normalizedFilter);\n\n if (isGlobPattern) {\n const pattern = normalizedFilter.startsWith(\"**/\")\n ? normalizedFilter\n : `**/${normalizedFilter}`;\n\n if (matchFn(normalizedPath, pattern)) {\n return true;\n }\n } else {\n // Plain path prefix matching\n if (\n normalizedPath.startsWith(normalizedFilter + \"/\") ||\n normalizedPath === normalizedFilter ||\n normalizedPath.includes(\"/\" + normalizedFilter + \"/\")\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Execute exact search across the codebase.\n *\n * This use case:\n * 1. Walks the filesystem to find searchable files\n * 2. Filters files based on path patterns\n * 3. Uses the simple search service to find exact matches\n * 4. Returns results sorted by match count\n *\n * @param fs - FileSystem implementation (injected dependency)\n * @param options - Search options\n * @param matchFn - Glob pattern matching function (e.g., minimatch)\n * @returns Exact match results\n */\nexport async function executeExactSearch(\n fs: FileSystem,\n options: ExactSearchOptions,\n matchFn: (path: string, pattern: string) => boolean\n): Promise<ExactMatchResults> {\n const {\n rootDir,\n literal,\n pathFilter = [],\n maxFiles = 20,\n maxOccurrencesPerFile = 5,\n caseInsensitive = false,\n } = options;\n\n // Collect all searchable files\n const files = new Map<string, string>();\n\n /**\n * Recursively walk directory tree and collect searchable files.\n */\n async function walkDir(dir: string, baseDir: string): Promise<void> {\n try {\n const entries = await fs.readDir(dir);\n\n for (const entry of entries) {\n const fullPath = fs.join(dir, entry);\n const relativePath = fs.relative(baseDir, fullPath);\n\n // Check if it's a directory\n let isDirectory = false;\n try {\n const stats = await fs.getStats(fullPath);\n isDirectory = stats.isDirectory ?? false;\n } catch {\n continue;\n }\n\n if (isDirectory) {\n // Skip ignored directories\n if (DEFAULT_IGNORED_DIRS.includes(entry)) {\n continue;\n }\n\n await walkDir(fullPath, baseDir);\n } else {\n // Apply path filter if specified\n if (pathFilter.length > 0) {\n if (!matchesPathFilter(relativePath, pathFilter, matchFn)) {\n continue;\n }\n }\n\n // Read file content\n try {\n const content = await fs.readFile(fullPath);\n if (isSearchableContent(content, fullPath)) {\n files.set(relativePath, content);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n }\n } catch {\n // Skip directories that can't be read\n }\n }\n\n await walkDir(rootDir, rootDir);\n\n // Perform search using domain service\n return searchFiles(files, literal, {\n maxFiles,\n maxOccurrencesPerFile,\n caseInsensitive,\n });\n}\n",
|
|
72
|
+
"/**\n * Node.js FileSystem Adapter\n * \n * Implements the FileSystem port using Node.js fs/promises and path modules.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { glob } from 'glob';\nimport type { FileSystem, FileStats } from '../../domain/ports';\n\n/**\n * Node.js implementation of the FileSystem port.\n */\nexport class NodeFileSystem implements FileSystem {\n async readFile(filepath: string): Promise<string> {\n return fs.readFile(filepath, 'utf-8');\n }\n \n async writeFile(filepath: string, content: string): Promise<void> {\n await fs.mkdir(path.dirname(filepath), { recursive: true });\n await fs.writeFile(filepath, content, 'utf-8');\n }\n \n async deleteFile(filepath: string): Promise<void> {\n try {\n await fs.unlink(filepath);\n } catch (error) {\n // Ignore if file doesn't exist\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n \n async getStats(filepath: string): Promise<FileStats> {\n const stats = await fs.stat(filepath);\n return {\n lastModified: stats.mtime.toISOString(),\n size: stats.isDirectory() ? undefined : stats.size,\n isDirectory: stats.isDirectory(),\n };\n }\n \n async exists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n \n async mkdir(dirpath: string): Promise<void> {\n await fs.mkdir(dirpath, { recursive: true });\n }\n \n async readDir(dirpath: string): Promise<string[]> {\n return fs.readdir(dirpath);\n }\n \n async findFiles(rootDir: string, patterns: string[], ignore: string[]): Promise<string[]> {\n const ignorePatterns = ignore.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 // Remove duplicates\n return [...new Set(files)];\n }\n \n join(...segments: string[]): string {\n return path.join(...segments);\n }\n \n relative(from: string, to: string): string {\n return path.relative(from, to);\n }\n \n resolve(...segments: string[]): string {\n return path.resolve(...segments);\n }\n \n dirname(filepath: string): string {\n return path.dirname(filepath);\n }\n \n extname(filepath: string): string {\n return path.extname(filepath);\n }\n}\n\n/**\n * Default singleton instance\n */\nexport const nodeFileSystem = new NodeFileSystem();\n\n",
|
|
73
|
+
"/**\n * RAGgrep - Local filesystem-based RAG system for codebases\n *\n * Provides semantic search over code using local embeddings.\n *\n * @example\n * ```ts\n * import raggrep from 'raggrep';\n *\n * // Index a directory (automatically cleans up deleted files)\n * await raggrep.index('/path/to/project');\n *\n * // Search the index\n * const results = await raggrep.search('/path/to/project', 'user authentication');\n *\n * // Reset (clear) the index completely\n * await raggrep.reset('/path/to/project');\n * ```\n *\n * @example With custom logger\n * ```ts\n * import raggrep, { createLogger, createInlineLogger } from 'raggrep';\n *\n * // Create a logger (defaults to console)\n * const logger = createLogger({ verbose: true });\n *\n * // Or use inline logger for CLI-style progress\n * const inlineLogger = createInlineLogger({ verbose: false });\n *\n * await raggrep.index('/path/to/project', { logger: inlineLogger });\n * ```\n */\n\nimport { indexDirectory, cleanupIndex, resetIndex } from \"./app/indexer\";\nimport type {\n IndexResult,\n IndexOptions,\n CleanupResult,\n CleanupOptions,\n ResetResult,\n} from \"./app/indexer\";\nimport {\n search as searchIndex,\n hybridSearch as hybridSearchIndex,\n formatSearchResults,\n formatHybridSearchResults,\n} from \"./app/search\";\nimport type { SearchOptions, SearchResult, HybridSearchResults } from \"./types\";\nimport type { Logger, LoggerFactory } from \"./domain/ports\";\nimport {\n ConsoleLogger,\n InlineProgressLogger,\n SilentLogger,\n createLogger,\n createInlineLogger,\n createSilentLogger,\n} from \"./infrastructure/logger\";\n\n// Re-export types\nexport type {\n IndexResult,\n IndexOptions,\n CleanupResult,\n CleanupOptions,\n ResetResult,\n} from \"./app/indexer\";\nexport type {\n SearchOptions,\n SearchResult,\n HybridSearchResults,\n Chunk,\n FileIndex,\n} from \"./types\";\nexport type { Logger, LoggerFactory } from \"./domain/ports\";\n\n// Re-export logger implementations and factories\nexport {\n ConsoleLogger,\n InlineProgressLogger,\n SilentLogger,\n createLogger,\n createInlineLogger,\n createSilentLogger,\n};\n\n/**\n * Index a directory for semantic search.\n *\n * Creates a `.raggrep/` folder with the index data.\n * Automatically cleans up stale entries for deleted files.\n *\n * @param directory - Path to the directory to index\n * @param options - Index options\n * @returns Array of results per module\n *\n * @example\n * ```ts\n * // Basic indexing\n * await raggrep.index('./my-project');\n *\n * // With options\n * await raggrep.index('./my-project', {\n * model: 'bge-small-en-v1.5',\n * verbose: true\n * });\n * ```\n */\nexport async function index(\n directory: string,\n options: IndexOptions = {}\n): Promise<IndexResult[]> {\n return indexDirectory(directory, options);\n}\n\n/**\n * Search the indexed codebase.\n *\n * @param directory - Path to the indexed directory\n * @param query - Natural language search query\n * @param options - Search options\n * @returns Array of search results sorted by relevance\n *\n * @example\n * ```ts\n * // Basic search\n * const results = await raggrep.search('./my-project', 'user login');\n *\n * // With options\n * const results = await raggrep.search('./my-project', 'database query', {\n * topK: 5,\n * minScore: 0.2,\n * filePatterns: ['*.ts']\n * });\n * ```\n */\nexport async function search(\n directory: string,\n query: string,\n options: SearchOptions = {}\n): Promise<SearchResult[]> {\n return searchIndex(directory, query, options);\n}\n\n/**\n * Clean up stale index entries for files that no longer exist.\n *\n * Note: Cleanup is now automatic during indexing. This function is provided\n * for explicit cleanup without re-indexing.\n *\n * @param directory - Path to the indexed directory\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n *\n * @example\n * ```ts\n * const results = await raggrep.cleanup('./my-project');\n * console.log(`Removed ${results[0].removed} stale entries`);\n * ```\n */\nexport async function cleanup(\n directory: string,\n options: CleanupOptions = {}\n): Promise<CleanupResult[]> {\n return cleanupIndex(directory, options);\n}\n\n/**\n * Reset (completely clear) the index for a directory.\n *\n * @param directory - Path to the indexed directory\n * @returns Result with success status and removed index path\n * @throws Error if no index exists for the directory\n *\n * @example\n * ```ts\n * try {\n * const result = await raggrep.reset('./my-project');\n * console.log(`Cleared index at: ${result.indexDir}`);\n * } catch (error) {\n * console.error('No index found');\n * }\n * ```\n */\nexport async function reset(directory: string): Promise<ResetResult> {\n return resetIndex(directory);\n}\n\n/**\n * Hybrid search with both semantic and exact match tracks.\n *\n * Returns semantic results with optional exact match results for identifier queries.\n * Exact matches are found using grep-like text search and are displayed separately.\n *\n * @param directory - Path to the indexed directory\n * @param query - Natural language or identifier search query\n * @param options - Search options\n * @returns Hybrid search results with both tracks\n *\n * @example\n * ```ts\n * // Search for an identifier (triggers exact match)\n * const results = await raggrep.hybridSearch('./my-project', 'AUTH_SERVICE_URL');\n *\n * // Check for exact matches\n * if (results.exactMatches) {\n * console.log(`Found ${results.exactMatches.totalMatches} exact matches`);\n * }\n *\n * // Semantic results (with fusion boost if exact matches found)\n * console.log(`${results.results.length} semantic results`);\n * ```\n */\nexport async function hybridSearch(\n directory: string,\n query: string,\n options: SearchOptions = {}\n): Promise<HybridSearchResults> {\n return hybridSearchIndex(directory, query, options);\n}\n\n/**\n * Format search results for display.\n *\n * @param results - Array of search results\n * @returns Formatted string for console output\n */\nexport { formatSearchResults };\n\n/**\n * Format hybrid search results including exact matches.\n *\n * @param results - Hybrid search results\n * @returns Formatted string for console output\n */\nexport { formatHybridSearchResults };\n\n// Default export for convenient importing\nconst raggrep = {\n index,\n search,\n hybridSearch,\n cleanup,\n reset,\n formatSearchResults,\n formatHybridSearchResults,\n};\n\nexport default raggrep;\n"
|
|
70
74
|
],
|
|
71
|
-
"mappings": "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",
|
|
72
|
-
"debugId": "
|
|
75
|
+
"mappings": "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",
|
|
76
|
+
"debugId": "CDBDCD6A83D620A864756E2164756E21",
|
|
73
77
|
"names": []
|
|
74
78
|
}
|