raggrep 0.17.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/infrastructure/embeddings/modelCatalog.ts", "../../src/infrastructure/embeddings/embeddingPaths.ts", "../../src/infrastructure/embeddings/modelCache.ts", "../../src/infrastructure/embeddings/huggingfaceEmbeddingProvider.ts", "../../src/infrastructure/embeddings/xenovaEmbeddingProvider.ts", "../../src/infrastructure/embeddings/embeddingProviderFactory.ts", "../../src/infrastructure/embeddings/globalEmbeddings.ts", "../../src/infrastructure/embeddings/index.ts", "../../src/infrastructure/logger/loggers.ts", "../../src/infrastructure/logger/progressManager.ts", "../../src/infrastructure/logger/multiModuleProgressManager.ts", "../../node_modules/fdir/dist/index.mjs", "../../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/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", "../../src/modules/registry.ts", "../../src/infrastructure/introspection/projectDetector.ts", "../../src/infrastructure/introspection/IntrospectionIndex.ts", "../../src/infrastructure/introspection/index.ts", "../../src/app/indexer/watcher.ts", "../../src/app/indexer/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/domain/usecases/index.ts", "../../src/infrastructure/filesystem/nodeFileSystem.ts", "../../src/infrastructure/filesystem/index.ts", "../../src/app/search/index.ts", "../../src/app/cli/opencode/version-check.ts", "../../src/app/cli/opencode/install-tool.ts", "../../src/app/cli/opencode/install-skill.ts", "../../src/app/cli/main.ts"],
3
+ "sources": ["../../src/infrastructure/embeddings/modelCatalog.ts", "../../src/infrastructure/embeddings/embeddingPaths.ts", "../../src/infrastructure/embeddings/modelCache.ts", "../../src/infrastructure/embeddings/huggingfaceEmbeddingProvider.ts", "../../src/infrastructure/embeddings/xenovaEmbeddingProvider.ts", "../../src/infrastructure/embeddings/embeddingProviderFactory.ts", "../../src/infrastructure/embeddings/globalEmbeddings.ts", "../../src/infrastructure/embeddings/index.ts", "../../src/infrastructure/logger/loggers.ts", "../../src/infrastructure/logger/progressManager.ts", "../../src/infrastructure/logger/multiModuleProgressManager.ts", "../../node_modules/fdir/dist/index.mjs", "../../src/domain/entities/searchResult.ts", "../../src/domain/entities/rankingWeights.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/domain/services/discriminativeTerms.ts", "../../src/domain/services/matchScales.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", "../../src/modules/registry.ts", "../../src/infrastructure/introspection/projectDetector.ts", "../../src/infrastructure/introspection/IntrospectionIndex.ts", "../../src/infrastructure/introspection/index.ts", "../../src/app/indexer/watcher.ts", "../../src/app/indexer/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/domain/usecases/index.ts", "../../src/infrastructure/filesystem/nodeFileSystem.ts", "../../src/infrastructure/filesystem/index.ts", "../../src/app/search/index.ts", "../../src/app/cli/opencode/version-check.ts", "../../src/app/cli/opencode/install-tool.ts", "../../src/app/cli/opencode/install-skill.ts", "../../src/app/cli/main.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Canonical mapping of logical embedding model names to Hugging Face model IDs\n * and output dimensions. Shared by all embedding adapters and config validation.\n */\n\nimport type { EmbeddingModelName } from \"../../domain/ports\";\n\n/** Hugging Face hub IDs (ONNX-converted models for Transformers.js) */\nexport const EMBEDDING_MODEL_IDS: 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/** Alias for imports that expect the historical name `EMBEDDING_MODELS` */\nexport const EMBEDDING_MODELS = EMBEDDING_MODEL_IDS;\n\n/**\n * Every {@link EmbeddingModelName}, in harness order.\n * Used when a full model list is required; benchmarks use {@link BENCHMARK_MODEL_NAMES}.\n */\nexport const ALL_EMBEDDING_MODEL_NAMES: readonly EmbeddingModelName[] = [\n \"all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\",\n \"nomic-embed-text-v1.5\",\n];\n\n/**\n * Models run by `bench:embeddings` and `bench:retrieval` matrix.\n * Omits `nomic-embed-text-v1.5` for now (heavy in the local harness).\n */\nexport const BENCHMARK_MODEL_NAMES: readonly EmbeddingModelName[] = [\n \"all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\",\n];\n\n/** Embedding vector dimension per model */\nexport const EMBEDDING_DIMENSIONS: Record<EmbeddingModelName, number> = {\n \"all-MiniLM-L6-v2\": 384,\n \"all-MiniLM-L12-v2\": 384,\n \"bge-small-en-v1.5\": 384,\n \"paraphrase-MiniLM-L3-v2\": 384,\n \"nomic-embed-text-v1.5\": 768,\n};\n\nexport function getEmbeddingModelId(model: EmbeddingModelName): string {\n return EMBEDDING_MODEL_IDS[model];\n}\n\nexport function getEmbeddingDimension(model: EmbeddingModelName): number {\n return EMBEDDING_DIMENSIONS[model];\n}\n",
6
6
  "/**\n * Shared filesystem locations for embedding model caches.\n * Used by all local ONNX embedding adapters.\n */\n\nimport * as os from \"os\";\nimport * as path from \"path\";\n\n/** Hugging Face / Transformers.js model cache under the user home directory */\nexport const RAGGREP_MODEL_CACHE_DIR = path.join(\n os.homedir(),\n \".cache\",\n \"raggrep\",\n \"models\"\n);\n",
@@ -14,13 +14,14 @@
14
14
  "/**\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",
15
15
  "/**\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",
16
16
  "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 };",
17
- "/**\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",
17
+ "/**\n * SearchResult Entity\n *\n * Represents a single result from a search query.\n */\n\nimport type { Chunk } from \"./chunk\";\nimport type { RankingWeightsPartial } from \"./rankingWeights\";\n\n/**\n * How to order hybrid results after modules are merged.\n */\nexport type RankBy = \"structured\" | \"semantic\" | \"combined\";\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 /** Fused hybrid relevance (module-specific scale). */\n score: number;\n\n /**\n * Embedding similarity as a [0,1] match strength (cosine mapped to a percentage scale).\n * Omitted only before enrichment in hybrid search.\n */\n semanticMatch?: number;\n\n /**\n * Structured relevance: BM25, symbols, path/literal/phrase/heading signals (non-embedding).\n * [0,1] — primary default sort key when {@link SearchOptions.rankBy} is `'structured'`.\n */\n structuredMatch?: 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 * Optional overrides for hybrid retrieval weights (merged with\n * {@link DEFAULT_RANKING_WEIGHTS}). Intended for benchmarks and tuning.\n */\n rankingWeights?: RankingWeightsPartial;\n\n /** Suppress noisy stdout during search (e.g. benchmark loops). */\n quiet?: boolean;\n\n /**\n * Final sort order for merged hybrid results.\n * @default 'structured' (BM25 / symbols / path / docs structure before embedding).\n */\n rankBy?: RankBy;\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 rankingWeights: {},\n quiet: false,\n rankBy: \"structured\",\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",
18
+ "/**\n * Hybrid retrieval ranking weights — numeric knobs only, suitable for config\n * and benchmark-driven tuning. Defaults follow golden-query sweeps on next-convex-starter-app\n * (wave 2 winner: combined TS + markdown doc-intent; bge-small-en-v1.5, core + TS + markdown).\n */\n\nimport type { LiteralMatchType, LiteralConfidence } from \"./literal\";\n\n/** BM25-IDF–guided salient-term adjustment (all embedding-backed language + markdown modules). */\nexport interface DiscriminativeWeights {\n boostCap: number;\n penaltyMax: number;\n penaltyFloor: number;\n}\n\n/** TypeScript/JS module: semantic + BM25 + vocabulary blend. */\nexport interface TypeScriptRankingWeights {\n semantic: number;\n bm25: number;\n vocab: number;\n /** Include chunk when vocab overlap exceeds this (bypass path). */\n vocabBypassThreshold: number;\n}\n\n/** Rust, Go, Python modules: two-way blend. */\nexport interface LanguageRankingWeights {\n semantic: number;\n bm25: number;\n}\n\n/** Markdown docs module. */\nexport interface MarkdownRankingWeights {\n semantic: number;\n bm25: number;\n /** Boost when query looks documentation-intent (legacy keyword list). */\n docIntentBoost: number;\n /** `headingBoost *= min + span * phraseMatch.coverage` */\n headingPhraseCoverageMin: number;\n headingPhraseCoverageSpan: number;\n}\n\n/** Per-confidence multipliers for one literal match kind (definition / reference / import). */\nexport type LiteralConfidenceMultipliers = Record<LiteralConfidence, number>;\n\n/**\n * Literal-match boosting: multipliers when identifier/path literals align with the query,\n * plus vocabulary overlap tuning (TypeScript vocabulary track).\n */\nexport interface LiteralBoostWeights {\n /** Base score when a chunk is reached only via the literal index (no BM25/semantic). */\n baseScore: number;\n multipliers: Record<LiteralMatchType, LiteralConfidenceMultipliers>;\n vocabulary: {\n baseMultiplier: number;\n perWordBonus: number;\n maxVocabularyBonus: number;\n minWordsForMatch: number;\n };\n}\n\n/** JSON data module (BM25 + literal paths). */\nexport interface JsonRankingWeights {\n bm25: number;\n /** Scales literal-only base when BM25 is zero. */\n literalBaseWeight: number;\n}\n\n/** Full resolved set used by search (every field required). */\nexport interface RankingWeightsConfig {\n discriminative: DiscriminativeWeights;\n typescript: TypeScriptRankingWeights;\n language: LanguageRankingWeights;\n markdown: MarkdownRankingWeights;\n json: JsonRankingWeights;\n /** Literal / backtick / identifier match boosting (language + JSON modules). */\n literal: LiteralBoostWeights;\n}\n\n/** Partial overrides for {@link SearchOptions} or persisted module options. */\nexport type RankingWeightsPartial = {\n [K in keyof RankingWeightsConfig]?: Partial<RankingWeightsConfig[K]>;\n};\n\nexport const DEFAULT_DISCRIMINATIVE_WEIGHTS: DiscriminativeWeights = {\n boostCap: 0.1,\n penaltyMax: 0.16,\n penaltyFloor: 0.72,\n};\n\n/** Default literal boosting (same coefficients as the original literal scorer). */\nexport const DEFAULT_LITERAL_BOOST_WEIGHTS: LiteralBoostWeights = {\n baseScore: 0.5,\n multipliers: {\n definition: { high: 2.5, medium: 2.0, low: 1.5 },\n reference: { high: 2.0, medium: 1.5, low: 1.3 },\n import: { high: 1.5, medium: 1.3, low: 1.1 },\n },\n vocabulary: {\n baseMultiplier: 1.3,\n perWordBonus: 0.1,\n maxVocabularyBonus: 0.5,\n minWordsForMatch: 2,\n },\n};\n\nexport const DEFAULT_RANKING_WEIGHTS: RankingWeightsConfig = {\n discriminative: DEFAULT_DISCRIMINATIVE_WEIGHTS,\n typescript: {\n semantic: 0.43,\n bm25: 0.42,\n vocab: 0.15,\n vocabBypassThreshold: 0.4,\n },\n language: {\n semantic: 0.7,\n bm25: 0.3,\n },\n markdown: {\n semantic: 0.62,\n bm25: 0.33,\n docIntentBoost: 0.03,\n headingPhraseCoverageMin: 0.25,\n headingPhraseCoverageSpan: 0.75,\n },\n json: {\n bm25: 0.4,\n literalBaseWeight: 0.6,\n },\n literal: DEFAULT_LITERAL_BOOST_WEIGHTS,\n};\n\n/**\n * Merge partial literal-boost overrides (including nested multipliers / vocabulary).\n */\nexport function mergeLiteralWeights(\n def: LiteralBoostWeights,\n partial?: Partial<LiteralBoostWeights>\n): LiteralBoostWeights {\n if (!partial) {\n return def;\n }\n return {\n baseScore: partial.baseScore ?? def.baseScore,\n multipliers: {\n definition: {\n ...def.multipliers.definition,\n ...partial.multipliers?.definition,\n },\n reference: {\n ...def.multipliers.reference,\n ...partial.multipliers?.reference,\n },\n import: { ...def.multipliers.import, ...partial.multipliers?.import },\n },\n vocabulary: { ...def.vocabulary, ...partial.vocabulary },\n };\n}\n\n/**\n * Deep-merge partial ranking overrides onto defaults. Pure function.\n */\nexport function mergeRankingWeights(\n partial?: RankingWeightsPartial\n): RankingWeightsConfig {\n if (!partial) {\n return DEFAULT_RANKING_WEIGHTS;\n }\n return {\n discriminative: {\n ...DEFAULT_RANKING_WEIGHTS.discriminative,\n ...partial.discriminative,\n },\n typescript: {\n ...DEFAULT_RANKING_WEIGHTS.typescript,\n ...partial.typescript,\n },\n language: {\n ...DEFAULT_RANKING_WEIGHTS.language,\n ...partial.language,\n },\n markdown: {\n ...DEFAULT_RANKING_WEIGHTS.markdown,\n ...partial.markdown,\n },\n json: {\n ...DEFAULT_RANKING_WEIGHTS.json,\n ...partial.json,\n },\n literal: mergeLiteralWeights(\n DEFAULT_RANKING_WEIGHTS.literal,\n partial.literal\n ),\n };\n}\n",
18
19
  "/**\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/** Default local embedding stack for embedding-backed modules (Transformers.js ONNX). */\nconst DEFAULT_EMBEDDING_MODULE_OPTIONS = {\n embeddingModel: \"bge-small-en-v1.5\",\n embeddingRuntime: \"huggingface\",\n} as const;\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: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n {\n id: \"language/python\",\n enabled: true,\n options: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n {\n id: \"language/go\",\n enabled: true,\n options: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n {\n id: \"language/rust\",\n enabled: true,\n options: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n {\n id: \"data/json\",\n enabled: true,\n options: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n {\n id: \"docs/markdown\",\n enabled: true,\n options: { ...DEFAULT_EMBEDDING_MODULE_OPTIONS },\n },\n ],\n };\n}\n",
19
20
  "/**\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",
20
- "/**\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",
21
+ "/**\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 RankBy,\n // Exact match types\n ExactMatchOccurrence,\n ExactMatchFile,\n ExactMatchResults,\n HybridSearchResults,\n} from \"./searchResult\";\nexport { DEFAULT_SEARCH_OPTIONS } from \"./searchResult\";\n\n// Ranking — numeric tuning inputs for hybrid search\nexport type {\n DiscriminativeWeights,\n TypeScriptRankingWeights,\n LanguageRankingWeights,\n MarkdownRankingWeights,\n JsonRankingWeights,\n LiteralBoostWeights,\n LiteralConfidenceMultipliers,\n RankingWeightsConfig,\n RankingWeightsPartial,\n} from \"./rankingWeights\";\nexport {\n DEFAULT_RANKING_WEIGHTS,\n DEFAULT_DISCRIMINATIVE_WEIGHTS,\n DEFAULT_LITERAL_BOOST_WEIGHTS,\n mergeRankingWeights,\n mergeLiteralWeights,\n} from \"./rankingWeights\";\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",
21
22
  "/**\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 crypto from \"crypto\";\nimport type { Config, ModuleConfig } from \"../../domain/entities\";\nimport { createDefaultConfig } from \"../../domain/entities\";\nimport type {\n EmbeddingConfig,\n EmbeddingModelName,\n EmbeddingRuntime,\n} from \"../../domain/ports\";\nimport { EMBEDDING_MODELS } from \"../embeddings/modelCatalog\";\n\nexport { EMBEDDING_MODELS };\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default configuration instance */\nexport const DEFAULT_CONFIG: Config = createDefaultConfig();\n\n/** Directory name for index data under the project (or CLI cwd) root */\nexport const RAGGREP_INDEX_DIR = \".raggrep\";\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 under `{rootDir}/.raggrep/`, where `rootDir` is the\n * directory being indexed (for the CLI this is the current working directory).\n *\n * @param rootDir - Absolute or resolved 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 const absoluteRoot = path.resolve(rootDir);\n return path.join(absoluteRoot, RAGGREP_INDEX_DIR);\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(absoluteRoot, RAGGREP_INDEX_DIR),\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 (inside `.raggrep` under the project root).\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 const rt = options.embeddingRuntime as string | undefined;\n let runtime: EmbeddingRuntime | undefined;\n if (rt === \"xenova\" || rt === \"huggingface\") {\n runtime = rt;\n } else if (rt !== undefined) {\n console.warn(\n `Unknown embeddingRuntime: ${rt}, falling back to default (huggingface)`\n );\n }\n\n return {\n model: modelName as EmbeddingModelName,\n ...(runtime ? { runtime } : {}),\n // Default to NO progress logs unless explicitly enabled\n showProgress: options.showProgress === true,\n };\n}\n",
22
23
  "/**\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 RAGGREP_INDEX_DIR,\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",
23
- "/**\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",
24
+ "/**\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 * IDF for a term in this index (same formula as BM25 scoring).\n * Returns 0 if the term does not appear in any indexed document.\n */\n getInverseDocumentFrequency(term: string): number {\n return this.idf(term.toLowerCase());\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",
24
25
  "/**\n * Entry Point Conventions\n *\n * Patterns for recognizing module entry points and barrel files.\n */\n\nimport * as path from \"path\";\nimport type { FileConvention } from \"../../entities/conventions\";\n\n/**\n * Get the parent folder name from a filepath.\n */\nfunction getParentFolder(filepath: string): string {\n const dir = path.dirname(filepath);\n return path.basename(dir);\n}\n\n/**\n * Entry point conventions for JavaScript/TypeScript projects.\n */\nexport const entryPointConventions: FileConvention[] = [\n {\n id: \"index-file\",\n name: \"Index/Barrel File\",\n description:\n \"Module entry point that typically re-exports from other files\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^index\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"barrel\", \"exports\", \"module\"],\n // Add parent folder as a strong keyword since \"auth/index.ts\" should match \"auth\"\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n // Don't add generic folder names\n if ([\"src\", \"lib\", \"dist\", \"build\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"main-file\",\n name: \"Main Entry Point\",\n description: \"Application main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^main\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"main\", \"entrypoint\", \"bootstrap\", \"startup\"],\n },\n\n {\n id: \"app-component\",\n name: \"Root App Component\",\n description: \"Root application component (React, Vue, etc.)\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^App\\.(tsx|jsx|vue|svelte)$/.test(filename);\n },\n keywords: [\"root\", \"app\", \"application\", \"component\", \"main\"],\n },\n\n {\n id: \"deno-mod\",\n name: \"Deno Module Entry\",\n description: \"Deno module entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"mod.ts\";\n },\n keywords: [\"entry\", \"module\", \"deno\", \"exports\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"python-init\",\n name: \"Python Package Init\",\n description: \"Python package initialization file\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"__init__.py\";\n },\n keywords: [\"entry\", \"package\", \"init\", \"python\", \"module\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"rust-lib\",\n name: \"Rust Library Entry\",\n description: \"Rust library crate entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"lib.rs\" || filename === \"main.rs\";\n },\n keywords: [\"entry\", \"crate\", \"rust\", \"module\"],\n },\n\n // ============================================================================\n // Go Entry Points\n // ============================================================================\n {\n id: \"go-main\",\n name: \"Go Main Entry\",\n description: \"Go application main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"main.go\";\n },\n keywords: [\"entry\", \"main\", \"go\", \"golang\", \"entrypoint\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n // cmd/myapp/main.go -> \"myapp\"\n if (parent && ![\"cmd\", \"src\", \".\", \"\"].includes(parent)) {\n return [parent.toLowerCase()];\n }\n return [];\n },\n },\n\n // ============================================================================\n // Python Entry Points\n // ============================================================================\n {\n id: \"python-main\",\n name: \"Python Main Module\",\n description: \"Python package main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"__main__.py\";\n },\n keywords: [\"entry\", \"main\", \"python\", \"entrypoint\", \"cli\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n {\n id: \"python-app\",\n name: \"Python App Entry\",\n description: \"Common Python application entry points\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return (\n filename === \"app.py\" || filename === \"main.py\" || filename === \"run.py\"\n );\n },\n keywords: [\"entry\", \"main\", \"python\", \"app\", \"entrypoint\"],\n },\n {\n id: \"python-manage\",\n name: \"Django Manage\",\n description: \"Django management script\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"manage.py\";\n },\n keywords: [\"entry\", \"django\", \"python\", \"manage\", \"cli\", \"admin\"],\n },\n {\n id: \"python-wsgi\",\n name: \"Python WSGI Entry\",\n description: \"Python WSGI application entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"wsgi.py\" || filename === \"asgi.py\";\n },\n keywords: [\"entry\", \"wsgi\", \"asgi\", \"python\", \"server\", \"web\"],\n },\n];\n",
25
26
  "/**\n * Configuration File Conventions\n *\n * Patterns for recognizing common configuration files.\n */\n\nimport type { FileConvention } from \"../../entities/conventions\";\n\n/**\n * Configuration file conventions.\n */\nexport const configFileConventions: FileConvention[] = [\n // ============================================================================\n // Package Management\n // ============================================================================\n {\n id: \"package-json\",\n name: \"Package.json\",\n description: \"Node.js package manifest\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"package.json\",\n keywords: [\"package\", \"dependencies\", \"npm\", \"scripts\", \"manifest\", \"node\"],\n },\n {\n id: \"pnpm-workspace\",\n name: \"PNPM Workspace\",\n description: \"PNPM monorepo workspace configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"pnpm-workspace.yaml\" || filename === \"pnpm-workspace.yml\",\n keywords: [\"workspace\", \"monorepo\", \"pnpm\", \"packages\"],\n },\n {\n id: \"yarn-lock\",\n name: \"Yarn Lock\",\n description: \"Yarn dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"yarn.lock\",\n keywords: [\"dependencies\", \"lock\", \"yarn\", \"versions\"],\n },\n {\n id: \"package-lock\",\n name: \"Package Lock\",\n description: \"NPM dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"package-lock.json\",\n keywords: [\"dependencies\", \"lock\", \"npm\", \"versions\"],\n },\n {\n id: \"bun-lockb\",\n name: \"Bun Lock\",\n description: \"Bun dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"bun.lockb\" || filename === \"bun.lock\",\n keywords: [\"dependencies\", \"lock\", \"bun\", \"versions\"],\n },\n\n // ============================================================================\n // Go\n // ============================================================================\n {\n id: \"go-mod\",\n name: \"Go Module\",\n description: \"Go module definition file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"go.mod\",\n keywords: [\n \"go\",\n \"golang\",\n \"module\",\n \"dependencies\",\n \"package\",\n \"workspace\",\n ],\n },\n {\n id: \"go-sum\",\n name: \"Go Sum\",\n description: \"Go module checksum file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"go.sum\",\n keywords: [\"go\", \"golang\", \"dependencies\", \"checksum\", \"lock\", \"versions\"],\n },\n {\n id: \"go-work\",\n name: \"Go Workspace\",\n description: \"Go workspace configuration for multi-module development\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"go.work\" || filename === \"go.work.sum\",\n keywords: [\"go\", \"golang\", \"workspace\", \"monorepo\", \"modules\"],\n },\n {\n id: \"makefile\",\n name: \"Makefile\",\n description: \"Make build automation file\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"Makefile\" ||\n filename === \"makefile\" ||\n filename === \"GNUmakefile\",\n keywords: [\"make\", \"build\", \"automation\", \"tasks\", \"compile\"],\n },\n\n // ============================================================================\n // Python\n // ============================================================================\n {\n id: \"requirements-txt\",\n name: \"Python Requirements\",\n description: \"Python pip requirements file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"requirements.txt\" ||\n filename.startsWith(\"requirements-\") ||\n filename.startsWith(\"requirements_\"),\n keywords: [\"python\", \"pip\", \"dependencies\", \"packages\", \"requirements\"],\n },\n {\n id: \"pyproject-toml\",\n name: \"Python Project\",\n description: \"Python project configuration (PEP 518/621)\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"pyproject.toml\",\n keywords: [\n \"python\",\n \"project\",\n \"config\",\n \"poetry\",\n \"build\",\n \"dependencies\",\n \"package\",\n ],\n },\n {\n id: \"setup-py\",\n name: \"Python Setup\",\n description: \"Python package setup script\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"setup.py\",\n keywords: [\"python\", \"setup\", \"package\", \"install\", \"distribution\"],\n },\n {\n id: \"setup-cfg\",\n name: \"Python Setup Config\",\n description: \"Python setup configuration file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"setup.cfg\",\n keywords: [\"python\", \"setup\", \"config\", \"package\", \"metadata\"],\n },\n {\n id: \"pipfile\",\n name: \"Pipfile\",\n description: \"Pipenv dependency file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"Pipfile\" || filename === \"Pipfile.lock\",\n keywords: [\"python\", \"pipenv\", \"dependencies\", \"packages\", \"virtualenv\"],\n },\n {\n id: \"poetry-lock\",\n name: \"Poetry Lock\",\n description: \"Poetry dependency lock file\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"poetry.lock\",\n keywords: [\"python\", \"poetry\", \"dependencies\", \"lock\", \"versions\"],\n },\n {\n id: \"tox-ini\",\n name: \"Tox Config\",\n description: \"Tox testing automation configuration\",\n category: \"test\",\n match: (filepath, filename) => filename === \"tox.ini\",\n keywords: [\"python\", \"tox\", \"testing\", \"automation\", \"environments\"],\n },\n {\n id: \"pytest-ini\",\n name: \"Pytest Config\",\n description: \"Pytest configuration file\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"pytest.ini\" || filename === \"conftest.py\",\n keywords: [\"python\", \"pytest\", \"testing\", \"test\", \"fixtures\"],\n },\n {\n id: \"mypy-ini\",\n name: \"Mypy Config\",\n description: \"Mypy type checker configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"mypy.ini\" || filename === \".mypy.ini\",\n keywords: [\"python\", \"mypy\", \"types\", \"type checking\", \"static analysis\"],\n },\n {\n id: \"flake8\",\n name: \"Flake8 Config\",\n description: \"Flake8 linter configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".flake8\",\n keywords: [\"python\", \"flake8\", \"linting\", \"lint\", \"style\"],\n },\n {\n id: \"pylintrc\",\n name: \"Pylint Config\",\n description: \"Pylint linter configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".pylintrc\" ||\n filename === \"pylintrc\" ||\n filename === \"pylint.toml\",\n keywords: [\"python\", \"pylint\", \"linting\", \"lint\", \"code quality\"],\n },\n {\n id: \"ruff-toml\",\n name: \"Ruff Config\",\n description: \"Ruff linter/formatter configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"ruff.toml\" || filename === \".ruff.toml\",\n keywords: [\"python\", \"ruff\", \"linting\", \"formatting\", \"fast\"],\n },\n {\n id: \"black-toml\",\n name: \"Black Config\",\n description: \"Black formatter configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".black.toml\",\n keywords: [\"python\", \"black\", \"formatting\", \"format\", \"style\"],\n },\n\n // ============================================================================\n // TypeScript\n // ============================================================================\n {\n id: \"tsconfig\",\n name: \"TypeScript Config\",\n description: \"TypeScript compiler configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"tsconfig.json\" ||\n (filename.startsWith(\"tsconfig.\") && filename.endsWith(\".json\")),\n keywords: [\n \"typescript\",\n \"config\",\n \"compiler\",\n \"ts\",\n \"settings\",\n \"paths\",\n \"types\",\n ],\n },\n {\n id: \"jsconfig\",\n name: \"JavaScript Config\",\n description: \"JavaScript project configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \"jsconfig.json\",\n keywords: [\"javascript\", \"config\", \"compiler\", \"js\", \"settings\", \"paths\"],\n },\n\n // ============================================================================\n // Linting & Formatting\n // ============================================================================\n {\n id: \"eslint-config\",\n name: \"ESLint Config\",\n description: \"ESLint linting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".eslintrc\" ||\n filename === \".eslintrc.js\" ||\n filename === \".eslintrc.cjs\" ||\n filename === \".eslintrc.json\" ||\n filename === \".eslintrc.yml\" ||\n filename === \".eslintrc.yaml\" ||\n filename === \"eslint.config.js\" ||\n filename === \"eslint.config.mjs\" ||\n filename === \"eslint.config.cjs\",\n keywords: [\"eslint\", \"linting\", \"lint\", \"rules\", \"code quality\"],\n },\n {\n id: \"prettier-config\",\n name: \"Prettier Config\",\n description: \"Prettier code formatting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".prettierrc\" ||\n filename === \".prettierrc.js\" ||\n filename === \".prettierrc.cjs\" ||\n filename === \".prettierrc.json\" ||\n filename === \".prettierrc.yml\" ||\n filename === \".prettierrc.yaml\" ||\n filename === \"prettier.config.js\" ||\n filename === \"prettier.config.cjs\" ||\n filename === \"prettier.config.mjs\",\n keywords: [\"prettier\", \"formatting\", \"format\", \"code style\", \"style\"],\n },\n {\n id: \"biome-config\",\n name: \"Biome Config\",\n description: \"Biome linting and formatting configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"biome.json\" || filename === \"biome.jsonc\",\n keywords: [\"biome\", \"linting\", \"formatting\", \"lint\", \"format\"],\n },\n\n // ============================================================================\n // Build Tools\n // ============================================================================\n {\n id: \"vite-config\",\n name: \"Vite Config\",\n description: \"Vite build tool configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"vite.config.ts\" ||\n filename === \"vite.config.js\" ||\n filename === \"vite.config.mjs\",\n keywords: [\"vite\", \"bundler\", \"build\", \"dev server\", \"hmr\"],\n },\n {\n id: \"webpack-config\",\n name: \"Webpack Config\",\n description: \"Webpack bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"webpack.config.js\" ||\n filename === \"webpack.config.ts\" ||\n (filename.startsWith(\"webpack.\") &&\n (filename.endsWith(\".js\") || filename.endsWith(\".ts\"))),\n keywords: [\"webpack\", \"bundler\", \"build\", \"loaders\", \"plugins\"],\n },\n {\n id: \"rollup-config\",\n name: \"Rollup Config\",\n description: \"Rollup bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"rollup.config.js\" ||\n filename === \"rollup.config.ts\" ||\n filename === \"rollup.config.mjs\",\n keywords: [\"rollup\", \"bundler\", \"build\", \"esm\", \"bundle\"],\n },\n {\n id: \"esbuild-config\",\n name: \"esbuild Config\",\n description: \"esbuild bundler configuration\",\n category: \"build\",\n match: (filepath, filename) =>\n filename === \"esbuild.config.js\" ||\n filename === \"esbuild.config.ts\" ||\n filename === \"esbuild.config.mjs\",\n keywords: [\"esbuild\", \"bundler\", \"build\", \"fast\"],\n },\n\n // ============================================================================\n // Testing\n // ============================================================================\n {\n id: \"jest-config\",\n name: \"Jest Config\",\n description: \"Jest testing framework configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"jest.config.js\" ||\n filename === \"jest.config.ts\" ||\n filename === \"jest.config.mjs\" ||\n filename === \"jest.config.cjs\" ||\n filename === \"jest.config.json\",\n keywords: [\"jest\", \"testing\", \"test\", \"unit test\", \"config\"],\n },\n {\n id: \"vitest-config\",\n name: \"Vitest Config\",\n description: \"Vitest testing framework configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"vitest.config.ts\" ||\n filename === \"vitest.config.js\" ||\n filename === \"vitest.config.mts\",\n keywords: [\"vitest\", \"testing\", \"test\", \"unit test\", \"config\"],\n },\n {\n id: \"playwright-config\",\n name: \"Playwright Config\",\n description: \"Playwright E2E testing configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"playwright.config.ts\" ||\n filename === \"playwright.config.js\",\n keywords: [\"playwright\", \"testing\", \"e2e\", \"end-to-end\", \"browser test\"],\n },\n {\n id: \"cypress-config\",\n name: \"Cypress Config\",\n description: \"Cypress E2E testing configuration\",\n category: \"test\",\n match: (filepath, filename) =>\n filename === \"cypress.config.ts\" ||\n filename === \"cypress.config.js\" ||\n filename === \"cypress.json\",\n keywords: [\"cypress\", \"testing\", \"e2e\", \"end-to-end\", \"browser test\"],\n },\n\n // ============================================================================\n // Styling\n // ============================================================================\n {\n id: \"tailwind-config\",\n name: \"Tailwind Config\",\n description: \"Tailwind CSS configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"tailwind.config.js\" ||\n filename === \"tailwind.config.ts\" ||\n filename === \"tailwind.config.cjs\" ||\n filename === \"tailwind.config.mjs\",\n keywords: [\"tailwind\", \"css\", \"styling\", \"utility\", \"design\"],\n },\n {\n id: \"postcss-config\",\n name: \"PostCSS Config\",\n description: \"PostCSS configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"postcss.config.js\" ||\n filename === \"postcss.config.cjs\" ||\n filename === \"postcss.config.mjs\" ||\n filename === \".postcssrc\" ||\n filename === \".postcssrc.json\",\n keywords: [\"postcss\", \"css\", \"styling\", \"transforms\"],\n },\n\n // ============================================================================\n // Environment & Secrets\n // ============================================================================\n {\n id: \"env-file\",\n name: \"Environment File\",\n description: \"Environment variables file\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \".env\" ||\n filename === \".env.local\" ||\n filename === \".env.development\" ||\n filename === \".env.production\" ||\n filename === \".env.test\" ||\n filename.startsWith(\".env.\"),\n keywords: [\"environment\", \"env\", \"variables\", \"secrets\", \"config\"],\n },\n {\n id: \"env-example\",\n name: \"Environment Example\",\n description: \"Example environment variables file\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename === \".env.example\" ||\n filename === \".env.sample\" ||\n filename === \".env.template\",\n keywords: [\"environment\", \"env\", \"example\", \"template\", \"setup\"],\n },\n\n // ============================================================================\n // Deployment & CI/CD\n // ============================================================================\n {\n id: \"dockerfile\",\n name: \"Dockerfile\",\n description: \"Docker container image definition\",\n category: \"deployment\",\n match: (filepath, filename) =>\n filename === \"Dockerfile\" || filename.startsWith(\"Dockerfile.\"),\n keywords: [\"docker\", \"container\", \"image\", \"deployment\", \"build\"],\n },\n {\n id: \"docker-compose\",\n name: \"Docker Compose\",\n description: \"Docker Compose multi-container configuration\",\n category: \"deployment\",\n match: (filepath, filename) =>\n filename === \"docker-compose.yml\" ||\n filename === \"docker-compose.yaml\" ||\n filename === \"compose.yml\" ||\n filename === \"compose.yaml\" ||\n filename.startsWith(\"docker-compose.\"),\n keywords: [\"docker\", \"compose\", \"containers\", \"services\", \"deployment\"],\n },\n {\n id: \"github-actions\",\n name: \"GitHub Actions Workflow\",\n description: \"GitHub Actions CI/CD workflow\",\n category: \"deployment\",\n match: (filepath) =>\n filepath.includes(\".github/workflows/\") && filepath.endsWith(\".yml\"),\n keywords: [\"github\", \"actions\", \"ci\", \"cd\", \"workflow\", \"automation\"],\n },\n {\n id: \"vercel-config\",\n name: \"Vercel Config\",\n description: \"Vercel deployment configuration\",\n category: \"deployment\",\n match: (filepath, filename) => filename === \"vercel.json\",\n keywords: [\"vercel\", \"deployment\", \"hosting\", \"serverless\"],\n },\n {\n id: \"netlify-config\",\n name: \"Netlify Config\",\n description: \"Netlify deployment configuration\",\n category: \"deployment\",\n match: (filepath, filename) => filename === \"netlify.toml\",\n keywords: [\"netlify\", \"deployment\", \"hosting\", \"functions\"],\n },\n\n // ============================================================================\n // Git\n // ============================================================================\n {\n id: \"gitignore\",\n name: \"Git Ignore\",\n description: \"Git ignored files configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".gitignore\",\n keywords: [\"git\", \"ignore\", \"version control\", \"excluded\"],\n },\n {\n id: \"gitattributes\",\n name: \"Git Attributes\",\n description: \"Git file attributes configuration\",\n category: \"configuration\",\n match: (filepath, filename) => filename === \".gitattributes\",\n keywords: [\"git\", \"attributes\", \"version control\", \"line endings\"],\n },\n\n // ============================================================================\n // Documentation\n // ============================================================================\n {\n id: \"readme\",\n name: \"README\",\n description: \"Project documentation\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"readme.md\" ||\n filename.toLowerCase() === \"readme\",\n keywords: [\n \"readme\",\n \"documentation\",\n \"docs\",\n \"overview\",\n \"getting started\",\n ],\n },\n {\n id: \"changelog\",\n name: \"Changelog\",\n description: \"Project changelog\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"changelog.md\" ||\n filename.toLowerCase() === \"changelog\",\n keywords: [\"changelog\", \"changes\", \"releases\", \"history\", \"versions\"],\n },\n {\n id: \"contributing\",\n name: \"Contributing Guide\",\n description: \"Contribution guidelines\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"contributing.md\" ||\n filename.toLowerCase() === \"contributing\",\n keywords: [\"contributing\", \"contribution\", \"guidelines\", \"development\"],\n },\n {\n id: \"license\",\n name: \"License\",\n description: \"Project license\",\n category: \"documentation\",\n match: (filepath, filename) =>\n filename.toLowerCase() === \"license\" ||\n filename.toLowerCase() === \"license.md\" ||\n filename.toLowerCase() === \"license.txt\",\n keywords: [\"license\", \"legal\", \"copyright\", \"terms\"],\n },\n];\n",
26
27
  "/**\n * Next.js Framework Conventions\n *\n * Patterns for recognizing Next.js specific files and structures.\n */\n\nimport type {\n FileConvention,\n FrameworkConventions,\n} from \"../../../entities/conventions\";\n\nconst nextjsConventions: FileConvention[] = [\n // ============================================================================\n // Configuration\n // ============================================================================\n {\n id: \"next-config\",\n name: \"Next.js Config\",\n description: \"Next.js framework configuration\",\n category: \"configuration\",\n match: (filepath, filename) =>\n filename === \"next.config.js\" ||\n filename === \"next.config.mjs\" ||\n filename === \"next.config.ts\",\n keywords: [\"nextjs\", \"next\", \"config\", \"framework\", \"settings\"],\n },\n {\n id: \"next-env\",\n name: \"Next.js Environment Types\",\n description: \"Next.js TypeScript environment declarations\",\n category: \"types\",\n match: (filepath, filename) => filename === \"next-env.d.ts\",\n keywords: [\"nextjs\", \"types\", \"typescript\", \"declarations\"],\n },\n\n // ============================================================================\n // App Router (Next.js 13+)\n // ============================================================================\n {\n id: \"next-layout\",\n name: \"Next.js Layout\",\n description: \"Next.js layout component (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"layout.tsx\" || filename === \"layout.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"layout\", \"wrapper\", \"template\", \"app router\"],\n dynamicKeywords: (filepath) => {\n // Extract route segment from path\n const match = filepath.match(/app\\/(.+?)\\/layout\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\") && !s.startsWith(\"[\"));\n return segments.map((s) => s.toLowerCase());\n }\n if (filepath === \"app/layout.tsx\" || filepath === \"app/layout.js\") {\n return [\"root\", \"main\"];\n }\n return [];\n },\n },\n {\n id: \"next-page\",\n name: \"Next.js Page\",\n description: \"Next.js page component (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"page.tsx\" || filename === \"page.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"page\", \"route\", \"view\", \"app router\"],\n dynamicKeywords: (filepath) => {\n // Extract route from path\n const match = filepath.match(/app\\/(.+?)\\/page\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\"))\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\")); // [id] -> id\n return segments.map((s) => s.toLowerCase());\n }\n if (filepath === \"app/page.tsx\" || filepath === \"app/page.js\") {\n return [\"home\", \"index\", \"root\"];\n }\n return [];\n },\n },\n {\n id: \"next-loading\",\n name: \"Next.js Loading\",\n description: \"Next.js loading UI component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"loading.tsx\" || filename === \"loading.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"loading\", \"suspense\", \"skeleton\", \"spinner\"],\n },\n {\n id: \"next-error\",\n name: \"Next.js Error\",\n description: \"Next.js error boundary component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"error.tsx\" || filename === \"error.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"error\", \"boundary\", \"fallback\", \"catch\"],\n },\n {\n id: \"next-not-found\",\n name: \"Next.js Not Found\",\n description: \"Next.js 404 page component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"not-found.tsx\" || filename === \"not-found.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"404\", \"not found\", \"missing\", \"error\"],\n },\n {\n id: \"next-template\",\n name: \"Next.js Template\",\n description: \"Next.js template component\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"template.tsx\" || filename === \"template.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"template\", \"wrapper\", \"app router\"],\n },\n\n // ============================================================================\n // API Routes (App Router)\n // ============================================================================\n {\n id: \"next-route-handler\",\n name: \"Next.js Route Handler\",\n description: \"Next.js API route handler (App Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"route.ts\" || filename === \"route.js\") &&\n (filepath.includes(\"/app/\") || filepath.startsWith(\"app/\")),\n keywords: [\"nextjs\", \"api\", \"route\", \"handler\", \"endpoint\", \"rest\"],\n dynamicKeywords: (filepath) => {\n // Extract API path\n const match = filepath.match(/app\\/api\\/(.+?)\\/route\\./);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .filter((s) => !s.startsWith(\"(\"))\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\"));\n return [\"api\", ...segments.map((s) => s.toLowerCase())];\n }\n return [\"api\"];\n },\n },\n\n // ============================================================================\n // Middleware & Special Files\n // ============================================================================\n {\n id: \"next-middleware\",\n name: \"Next.js Middleware\",\n description: \"Next.js edge middleware\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"middleware.ts\" || filename === \"middleware.js\",\n keywords: [\"nextjs\", \"middleware\", \"edge\", \"request\", \"interceptor\"],\n },\n {\n id: \"next-global-error\",\n name: \"Next.js Global Error\",\n description: \"Next.js global error handler\",\n category: \"framework\",\n match: (filepath, filename) =>\n filename === \"global-error.tsx\" || filename === \"global-error.js\",\n keywords: [\"nextjs\", \"error\", \"global\", \"boundary\", \"catch\"],\n },\n\n // ============================================================================\n // Pages Router (Legacy)\n // ============================================================================\n {\n id: \"next-pages-api\",\n name: \"Next.js API Route (Pages)\",\n description: \"Next.js API route (Pages Router)\",\n category: \"framework\",\n match: (filepath) =>\n filepath.includes(\"/pages/api/\") || filepath.startsWith(\"pages/api/\"),\n keywords: [\"nextjs\", \"api\", \"route\", \"handler\", \"endpoint\", \"pages router\"],\n dynamicKeywords: (filepath) => {\n const match = filepath.match(/pages\\/api\\/(.+?)\\.(ts|js)/);\n if (match) {\n const segments = match[1]\n .split(\"/\")\n .map((s) => s.replace(/^\\[(.+?)\\]$/, \"$1\"));\n return [\"api\", ...segments.map((s) => s.toLowerCase())];\n }\n return [\"api\"];\n },\n },\n {\n id: \"next-pages-document\",\n name: \"Next.js Document\",\n description: \"Next.js custom document (Pages Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"_document.tsx\" || filename === \"_document.js\") &&\n (filepath.includes(\"/pages/\") || filepath.startsWith(\"pages/\")),\n keywords: [\"nextjs\", \"document\", \"html\", \"head\", \"body\", \"pages router\"],\n },\n {\n id: \"next-pages-app\",\n name: \"Next.js App (Pages)\",\n description: \"Next.js custom app (Pages Router)\",\n category: \"framework\",\n match: (filepath, filename) =>\n (filename === \"_app.tsx\" || filename === \"_app.js\") &&\n (filepath.includes(\"/pages/\") || filepath.startsWith(\"pages/\")),\n keywords: [\"nextjs\", \"app\", \"wrapper\", \"provider\", \"pages router\"],\n },\n];\n\n/**\n * Next.js framework conventions provider.\n */\nexport const nextjsFramework: FrameworkConventions = {\n id: \"nextjs\",\n name: \"Next.js\",\n detect: (filepath) => {\n // Detect if this is likely a Next.js project\n return (\n filepath === \"next.config.js\" ||\n filepath === \"next.config.mjs\" ||\n filepath === \"next.config.ts\" ||\n filepath.includes(\"/app/page.\") ||\n filepath.includes(\"/pages/_app.\")\n );\n },\n conventions: nextjsConventions,\n};\n",
@@ -30,35 +31,37 @@
30
31
  "/**\n * Introspection Service\n *\n * Pure functions for extracting file metadata from paths and content.\n * No I/O operations - all functions operate on provided data.\n */\n\nimport * as path from \"path\";\nimport type {\n FileIntrospection,\n Project,\n ProjectStructure,\n Scope,\n ProjectType,\n} from \"../entities/introspection\";\nimport { getConventionKeywords } from \"./conventions\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * README filenames to look for (in order of priority).\n */\nconst README_FILENAMES = [\n \"README.md\",\n \"readme.md\",\n \"Readme.md\",\n \"README.MD\",\n \"index.md\",\n \"INDEX.md\",\n];\n\n/**\n * Layer detection patterns.\n */\nconst LAYER_PATTERNS: Record<string, string[]> = {\n controller: [\"controller\", \"api\", \"routes\", \"route\", \"handler\"],\n service: [\"service\", \"logic\", \"usecase\", \"usecases\", \"handler\"],\n repository: [\"repository\", \"repo\", \"dao\", \"store\", \"persistence\"],\n model: [\n \"model\",\n \"models\",\n \"entity\",\n \"entities\",\n \"schema\",\n \"schemas\",\n \"types\",\n \"type\",\n ],\n util: [\"util\", \"utils\", \"helper\", \"helpers\", \"common\", \"lib\"],\n config: [\"config\", \"configuration\", \"settings\"],\n middleware: [\"middleware\", \"middlewares\"],\n domain: [\"domain\"],\n infrastructure: [\"infrastructure\", \"infra\"],\n application: [\"application\", \"app\"],\n presentation: [\n \"presentation\",\n \"ui\",\n \"views\",\n \"view\",\n \"component\",\n \"components\",\n ],\n test: [\"test\", \"tests\", \"spec\", \"specs\", \"__tests__\", \"e2e\"],\n};\n\n/**\n * Domain detection patterns (feature areas).\n */\nconst DOMAIN_PATTERNS = [\n \"auth\",\n \"authentication\",\n \"user\",\n \"users\",\n \"account\",\n \"accounts\",\n \"profile\",\n \"profiles\",\n \"product\",\n \"products\",\n \"item\",\n \"items\",\n \"catalog\",\n \"order\",\n \"orders\",\n \"cart\",\n \"checkout\",\n \"payment\",\n \"payments\",\n \"billing\",\n \"subscription\",\n \"subscriptions\",\n \"notification\",\n \"notifications\",\n \"email\",\n \"sms\",\n \"report\",\n \"reports\",\n \"analytics\",\n \"metrics\",\n \"dashboard\",\n \"admin\",\n \"settings\",\n \"search\",\n \"chat\",\n \"message\",\n \"messages\",\n \"feed\",\n \"post\",\n \"posts\",\n \"comment\",\n \"comments\",\n \"media\",\n \"upload\",\n \"file\",\n \"files\",\n \"storage\",\n \"cache\",\n \"session\",\n \"log\",\n \"logs\",\n \"audit\",\n];\n\n/**\n * Framework detection from imports.\n */\nconst FRAMEWORK_INDICATORS: Record<string, string[]> = {\n nextjs: [\"next\", \"next/\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n react: [\"react\"],\n vue: [\"vue\"],\n angular: [\"@angular/\"],\n nestjs: [\"@nestjs/\"],\n koa: [\"koa\"],\n};\n\n/**\n * Language detection from file extension.\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".py\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n \".kt\": \"kotlin\",\n \".swift\": \"swift\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".cs\": \"csharp\",\n \".cpp\": \"cpp\",\n \".c\": \"c\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n \".md\": \"markdown\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".txt\": \"text\",\n};\n\n/**\n * Keywords for detecting scope from project name or path.\n */\nconst SCOPE_KEYWORDS: Record<Scope, string[]> = {\n frontend: [\n \"web\",\n \"webapp\",\n \"frontend\",\n \"client\",\n \"ui\",\n \"app\",\n \"mobile\",\n \"react\",\n \"vue\",\n \"angular\",\n \"next\",\n \"nuxt\",\n ],\n backend: [\n \"api\",\n \"server\",\n \"backend\",\n \"service\",\n \"worker\",\n \"lambda\",\n \"functions\",\n ],\n shared: [\"shared\", \"common\", \"utils\", \"lib\", \"core\", \"types\", \"models\"],\n tooling: [\"scripts\", \"tools\", \"cli\", \"devtools\", \"build\", \"config\", \"infra\"],\n unknown: [],\n};\n\n/**\n * Patterns for detecting project directories.\n */\nconst PROJECT_PATTERNS: Array<{\n pattern: RegExp;\n type: ProjectType;\n defaultScope: Scope;\n}> = [\n { pattern: /^apps\\/([^/]+)/, type: \"app\", defaultScope: \"unknown\" },\n { pattern: /^packages\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n { pattern: /^libs\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n { pattern: /^services\\/([^/]+)/, type: \"service\", defaultScope: \"backend\" },\n { pattern: /^scripts\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n { pattern: /^tools\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n];\n\n// ============================================================================\n// Public Functions\n// ============================================================================\n\n/**\n * Options for introspecting a file.\n */\nexport interface IntrospectFileOptions {\n /** File content for framework detection */\n fileContent?: string;\n\n /**\n * Function to check if a file exists.\n * Used for README discovery without I/O in the domain layer.\n */\n fileExists?: (filepath: string) => boolean;\n}\n\n/**\n * Extract introspection metadata for a file.\n *\n * @param filepath - Relative file path\n * @param structure - Project structure (from detectProjectStructure)\n * @param options - Optional configuration including file content and file existence checker\n */\nexport function introspectFile(\n filepath: string,\n structure: ProjectStructure,\n options?: IntrospectFileOptions | string\n): FileIntrospection {\n // Handle backward compatibility: if options is a string, it's fileContent\n const opts: IntrospectFileOptions =\n typeof options === \"string\" ? { fileContent: options } : options || {};\n\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const segments = normalizedPath.split(\"/\").filter((s) => s.length > 0);\n const filename = segments[segments.length - 1] || \"\";\n const ext = path.extname(filename);\n\n const project = findProjectForFile(normalizedPath, structure);\n const language = EXTENSION_TO_LANGUAGE[ext] || \"unknown\";\n const layer = detectLayer(segments, filename);\n const domain = detectDomain(segments);\n const scope = detectScope(segments, project, layer);\n const framework = opts.fileContent\n ? detectFramework(opts.fileContent)\n : undefined;\n\n // Find nearest README if file existence checker is provided\n const nearestReadme = opts.fileExists\n ? findNearestReadme(normalizedPath, opts.fileExists)\n : undefined;\n\n return {\n filepath: normalizedPath,\n project,\n scope,\n layer,\n domain,\n language,\n framework,\n depth: segments.length - 1,\n pathSegments: segments.slice(0, -1),\n nearestReadme,\n };\n}\n\n/**\n * Find the nearest README file by traversing up the directory hierarchy.\n *\n * @param filepath - Relative file path (normalized with forward slashes)\n * @param fileExists - Function to check if a file exists\n * @returns Relative path to the nearest README, or undefined if none found\n */\nexport function findNearestReadme(\n filepath: string,\n fileExists: (filepath: string) => boolean\n): string | undefined {\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const segments = normalizedPath.split(\"/\").filter((s) => s.length > 0);\n\n // Start from the file's directory and traverse up\n for (let i = segments.length - 1; i >= 0; i--) {\n const dirPath = segments.slice(0, i).join(\"/\");\n\n for (const readmeName of README_FILENAMES) {\n const readmePath = dirPath ? `${dirPath}/${readmeName}` : readmeName;\n\n if (fileExists(readmePath)) {\n return readmePath;\n }\n }\n }\n\n // Check root directory\n for (const readmeName of README_FILENAMES) {\n if (fileExists(readmeName)) {\n return readmeName;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract keywords from introspection for search boosting.\n */\nexport function introspectionToKeywords(intro: FileIntrospection): string[] {\n const keywords: string[] = [];\n\n // Add filename keywords (without extension)\n const filename = path.basename(intro.filepath);\n const filenameWithoutExt = filename.replace(/\\.[^.]+$/, \"\");\n const filenameParts = filenameWithoutExt\n .split(/[-_.]/)\n .flatMap((part) => part.split(/(?=[A-Z])/))\n .map((part) => part.toLowerCase())\n .filter((part) => part.length > 1);\n keywords.push(...filenameParts);\n keywords.push(filenameWithoutExt.toLowerCase());\n\n // Add project name keywords\n if (intro.project.name && intro.project.name !== \"root\") {\n keywords.push(intro.project.name.toLowerCase());\n }\n\n // Add scope, layer, domain, language, framework\n if (intro.scope !== \"unknown\") keywords.push(intro.scope);\n if (intro.layer) keywords.push(intro.layer);\n if (intro.domain) keywords.push(intro.domain);\n if (intro.language !== \"unknown\") keywords.push(intro.language);\n if (intro.framework) keywords.push(intro.framework);\n\n // Add path segments (filtered)\n const skipSegments = new Set([\"src\", \"lib\", \"index\"]);\n for (const segment of intro.pathSegments) {\n if (!skipSegments.has(segment.toLowerCase()) && segment.length > 2) {\n keywords.push(segment.toLowerCase());\n }\n }\n\n // Add convention-based keywords\n const conventionKeywords = getConventionKeywords(intro.filepath);\n keywords.push(...conventionKeywords);\n\n return [...new Set(keywords)];\n}\n\n/**\n * Detect scope from project name.\n */\nexport function detectScopeFromName(name: string): Scope {\n const nameLower = name.toLowerCase();\n\n for (const [scope, keywords] of Object.entries(SCOPE_KEYWORDS)) {\n if (scope === \"unknown\") continue;\n for (const keyword of keywords) {\n if (nameLower.includes(keyword)) {\n return scope as Scope;\n }\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Find which project a file belongs to.\n */\nexport function findProjectForFile(\n filepath: string,\n structure: ProjectStructure\n): Project {\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const matches: Project[] = [];\n\n // Check against detected projects\n for (const project of structure.projects) {\n if (\n normalizedPath === project.root ||\n normalizedPath.startsWith(project.root + \"/\")\n ) {\n matches.push(project);\n }\n }\n\n // Return the most specific match (longest root path)\n if (matches.length > 0) {\n return matches.reduce((best, current) =>\n current.root.length > best.root.length ? current : best\n );\n }\n\n // Fallback: pattern matching\n for (const { pattern, type } of PROJECT_PATTERNS) {\n const match = normalizedPath.match(pattern);\n if (match) {\n return { name: match[1], root: match[0], type };\n }\n }\n\n // Default: root project\n return { name: \"root\", root: \"\", type: structure.rootType ?? \"unknown\" };\n}\n\n/**\n * Calculate search boost based on introspection and query.\n */\nexport function calculateIntrospectionBoost(\n intro: FileIntrospection,\n query: string\n): number {\n let boost = 1.0;\n const queryTerms = query.toLowerCase().split(/\\s+/);\n\n // Domain match: +10%\n if (\n intro.domain &&\n queryTerms.some(\n (t) => intro.domain!.includes(t) || t.includes(intro.domain!)\n )\n ) {\n boost *= 1.1;\n }\n\n // Layer match: +5%\n if (\n intro.layer &&\n queryTerms.some((t) => intro.layer!.includes(t) || t.includes(intro.layer!))\n ) {\n boost *= 1.05;\n }\n\n // Scope match for backend queries: +5%\n const backendTerms = [\"api\", \"server\", \"backend\", \"endpoint\", \"route\"];\n if (\n queryTerms.some((t) => backendTerms.includes(t)) &&\n intro.scope === \"backend\"\n ) {\n boost *= 1.05;\n }\n\n // Scope match for frontend queries: +5%\n const frontendTerms = [\n \"ui\",\n \"component\",\n \"page\",\n \"view\",\n \"frontend\",\n \"client\",\n ];\n if (\n queryTerms.some((t) => frontendTerms.includes(t)) &&\n intro.scope === \"frontend\"\n ) {\n boost *= 1.05;\n }\n\n // Path segment match: +3% per match\n for (const segment of intro.pathSegments) {\n if (queryTerms.some((t) => segment.toLowerCase().includes(t))) {\n boost *= 1.03;\n }\n }\n\n // Project name match: +5%\n if (\n intro.project.name !== \"root\" &&\n queryTerms.some((t) => intro.project.name.toLowerCase().includes(t))\n ) {\n boost *= 1.05;\n }\n\n return boost;\n}\n\n// ============================================================================\n// Internal Helper Functions\n// ============================================================================\n\nfunction detectLayer(segments: string[], filename: string): string | undefined {\n const filenameLower = filename.toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n if (filenameLower.includes(pattern)) return layer;\n }\n }\n\n for (let i = segments.length - 2; i >= 0; i--) {\n const segment = segments[i].toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n if (patterns.includes(segment)) return layer;\n }\n }\n\n return undefined;\n}\n\nfunction detectDomain(segments: string[]): string | undefined {\n const skipSegments = new Set([\n \"src\",\n \"lib\",\n \"app\",\n \"apps\",\n \"packages\",\n \"services\",\n \"modules\",\n \"features\",\n ...Object.values(LAYER_PATTERNS).flat(),\n ]);\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if (skipSegments.has(segmentLower)) continue;\n\n if (DOMAIN_PATTERNS.includes(segmentLower)) return segmentLower;\n\n for (const domain of DOMAIN_PATTERNS) {\n if (segmentLower.startsWith(domain) || segmentLower.endsWith(domain)) {\n return domain;\n }\n }\n }\n\n return undefined;\n}\n\nfunction detectScope(\n segments: string[],\n project: Project,\n layer?: string\n): Scope {\n const projectScope = detectScopeFromName(project.name);\n if (projectScope !== \"unknown\") return projectScope;\n\n if (layer) {\n switch (layer) {\n case \"controller\":\n case \"repository\":\n case \"middleware\":\n return \"backend\";\n case \"presentation\":\n return \"frontend\";\n case \"util\":\n case \"model\":\n return \"shared\";\n case \"test\":\n return \"tooling\";\n }\n }\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if ([\"server\", \"api\", \"backend\"].includes(segmentLower)) return \"backend\";\n if ([\"client\", \"web\", \"frontend\", \"ui\"].includes(segmentLower))\n return \"frontend\";\n if ([\"shared\", \"common\", \"lib\", \"libs\"].includes(segmentLower))\n return \"shared\";\n }\n\n return \"unknown\";\n}\n\nfunction detectFramework(content: string): string | undefined {\n for (const [framework, indicators] of Object.entries(FRAMEWORK_INDICATORS)) {\n for (const indicator of indicators) {\n if (\n content.includes(`from '${indicator}`) ||\n content.includes(`from \"${indicator}`) ||\n content.includes(`require('${indicator}`) ||\n content.includes(`require(\"${indicator}`)\n ) {\n return framework;\n }\n }\n }\n return undefined;\n}\n\n\n\n\n\n\n\n",
31
32
  "/**\n * Regex-based Symbol Extraction\n *\n * Extracts symbols from code using regular expressions.\n * Language-agnostic but optimized for common patterns.\n */\n\nexport type SymbolType =\n | \"function\"\n | \"class\"\n | \"variable\"\n | \"interface\"\n | \"type\"\n | \"enum\"\n | \"method\"\n | \"other\";\n\nexport interface ExtractedSymbol {\n name: string;\n type: SymbolType;\n line: number;\n isExported: boolean;\n}\n\n/**\n * Patterns for extracting symbols from code.\n * Order matters - more specific patterns should come first.\n */\nconst SYMBOL_PATTERNS: Array<{\n type: SymbolType;\n pattern: RegExp;\n exported: boolean;\n}> = [\n // Exported function declarations\n {\n type: \"function\",\n pattern: /^export\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported arrow functions\n {\n type: \"function\",\n pattern: /^export\\s+(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: true,\n },\n // Exported classes\n {\n type: \"class\",\n pattern: /^export\\s+(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported interfaces (TypeScript)\n {\n type: \"interface\",\n pattern: /^export\\s+interface\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported types (TypeScript)\n {\n type: \"type\",\n pattern: /^export\\s+type\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported enums\n {\n type: \"enum\",\n pattern: /^export\\s+(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported variables\n {\n type: \"variable\",\n pattern: /^export\\s+(?:const|let|var)\\s+(\\w+)\\s*(?::|=)/gm,\n exported: true,\n },\n // Default exports\n {\n type: \"function\",\n pattern: /^export\\s+default\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n {\n type: \"class\",\n pattern: /^export\\s+default\\s+class\\s+(\\w+)/gm,\n exported: true,\n },\n\n // Non-exported declarations\n {\n type: \"function\",\n pattern: /^(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"function\",\n pattern: /^(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^interface\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n\n // Python patterns\n {\n type: \"function\",\n pattern: /^def\\s+(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^class\\s+(\\w+)(?:\\s*\\(|:)/gm,\n exported: false,\n },\n\n // Go patterns\n {\n type: \"function\",\n pattern: /^func\\s+(?:\\([^)]+\\)\\s+)?(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)\\s+(?:struct|interface)/gm,\n exported: false,\n },\n\n // Rust patterns\n {\n type: \"function\",\n pattern: /^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^(?:pub\\s+)?struct\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:pub\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^(?:pub\\s+)?trait\\s+(\\w+)/gm,\n exported: false,\n },\n];\n\n/**\n * Extract symbols from code content using regex patterns.\n *\n * @param content - The source code content\n * @returns Array of extracted symbols with their locations\n */\nexport function extractSymbols(content: string): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n const seenSymbols = new Set<string>(); // Track seen symbols to avoid duplicates\n\n // Split content into lines for line number calculation\n const lines = content.split(\"\\n\");\n\n for (const { type, pattern, exported } of SYMBOL_PATTERNS) {\n // Reset regex state\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const name = match[1];\n const symbolKey = `${name}:${type}`;\n\n // Skip if we've already seen this symbol (from a more specific pattern)\n if (seenSymbols.has(symbolKey)) continue;\n seenSymbols.add(symbolKey);\n\n // Calculate line number\n const beforeMatch = content.substring(0, match.index);\n const line = beforeMatch.split(\"\\n\").length;\n\n symbols.push({\n name,\n type,\n line,\n isExported: exported,\n });\n }\n }\n\n // Sort by line number\n return symbols.sort((a, b) => a.line - b.line);\n}\n\n/**\n * Extract symbol names as keywords for BM25 indexing.\n *\n * @param symbols - Array of extracted symbols\n * @returns Array of unique symbol names\n */\nexport function symbolsToKeywords(symbols: ExtractedSymbol[]): string[] {\n const keywords = new Set<string>();\n\n for (const symbol of symbols) {\n // Add the full name\n keywords.add(symbol.name.toLowerCase());\n\n // Split camelCase/PascalCase into parts\n const parts = symbol.name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/\\s+/);\n\n for (const part of parts) {\n if (part.length > 2) {\n keywords.add(part);\n }\n }\n }\n\n return Array.from(keywords);\n}\n\n",
32
33
  "/**\n * Core Index Module\n *\n * Language-agnostic text search using:\n * - Regex-based symbol extraction\n * - BM25 keyword matching\n * - Line-based chunking\n *\n * Index location: .raggrep/index/core/\n *\n * This module provides fast, deterministic search without embeddings.\n * It complements language-specific modules by catching symbol matches.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n} from \"../../types\";\nimport type {\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from \"../../domain/entities\";\nimport {\n BM25Index,\n tokenize,\n normalizeScore,\n} from \"../../domain/services/bm25\";\nimport { getRaggrepDir } from \"../../infrastructure/config\";\nimport { introspectionToKeywords } from \"../../domain/services/introspection\";\nimport {\n extractSymbols,\n symbolsToKeywords,\n type ExtractedSymbol,\n} from \"./symbols\";\n\n/** Default minimum score for core search results */\nconst DEFAULT_MIN_SCORE = 0.1;\n\n/** Default number of results */\nconst DEFAULT_TOP_K = 20;\n\n/** Lines per chunk for basic chunking */\nconst LINES_PER_CHUNK = 50;\n\n/** Overlap between chunks */\nconst CHUNK_OVERLAP = 10;\n\n/**\n * Core module-specific data stored with file index\n */\nexport interface CoreModuleData {\n /** Extracted symbols */\n symbols: ExtractedSymbol[];\n /** BM25 tokens for this file */\n tokens: string[];\n [key: string]: unknown;\n}\n\n/**\n * Stored symbol index for fast lookup\n */\ninterface SymbolIndexEntry {\n filepath: string;\n symbols: ExtractedSymbol[];\n tokens: string[];\n}\n\nexport class CoreModule implements IndexModule {\n readonly id = \"core\";\n readonly name = \"Core Search\";\n readonly description = \"Language-agnostic text search with symbol extraction\";\n readonly version = \"1.0.0\";\n\n /**\n * Core module accepts all files (it's the fallback).\n */\n supportsFile(_filepath: string): boolean {\n return true;\n }\n\n private symbolIndex: Map<string, SymbolIndexEntry> = new Map();\n private bm25Index: BM25Index | null = null;\n private rootDir: string = \"\";\n\n async initialize(_config: ModuleConfig): Promise<void> {\n // Core module needs no initialization\n }\n\n /**\n * Index a single file.\n */\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n this.rootDir = ctx.rootDir;\n\n // Extract symbols using regex\n const symbols = extractSymbols(content);\n const symbolKeywords = symbolsToKeywords(symbols);\n\n // Tokenize content for BM25\n const contentTokens = tokenize(content);\n\n // Get introspection keywords (includes filename, path segments, etc.)\n const intro = ctx.getIntrospection?.(filepath);\n const introKeywords = intro ? introspectionToKeywords(intro) : [];\n\n const allTokens = [\n ...new Set([...contentTokens, ...symbolKeywords, ...introKeywords]),\n ];\n\n // Create line-based chunks\n const chunks = this.createChunks(filepath, content, symbols);\n\n // Get file stats\n const stats = await ctx.getFileStats(filepath);\n\n // Store in memory for finalize\n this.symbolIndex.set(filepath, {\n filepath,\n symbols,\n tokens: allTokens,\n });\n\n // Build module data\n const moduleData: CoreModuleData = {\n symbols,\n tokens: allTokens,\n };\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n /**\n * Create line-based chunks from content.\n */\n private createChunks(\n filepath: string,\n content: string,\n symbols: ExtractedSymbol[]\n ): Chunk[] {\n const lines = content.split(\"\\n\");\n const chunks: Chunk[] = [];\n\n // Create overlapping chunks\n for (\n let start = 0;\n start < lines.length;\n start += LINES_PER_CHUNK - CHUNK_OVERLAP\n ) {\n const end = Math.min(start + LINES_PER_CHUNK, lines.length);\n const chunkLines = lines.slice(start, end);\n const chunkContent = chunkLines.join(\"\\n\");\n\n // Find symbols in this chunk\n const chunkSymbols = symbols.filter(\n (s) => s.line >= start + 1 && s.line <= end\n );\n\n // Determine chunk type based on symbols\n let chunkType: ChunkType = \"block\";\n let chunkName: string | undefined;\n let isExported = false;\n\n if (chunkSymbols.length > 0) {\n const primarySymbol = chunkSymbols[0];\n chunkType = this.symbolTypeToChunkType(primarySymbol.type);\n chunkName = primarySymbol.name;\n isExported = primarySymbol.isExported;\n }\n\n const chunkId = `${filepath}:${start + 1}-${end}`;\n\n chunks.push({\n id: chunkId,\n content: chunkContent,\n startLine: start + 1,\n endLine: end,\n type: chunkType,\n name: chunkName,\n isExported,\n });\n\n // Stop if we've reached the end\n if (end >= lines.length) break;\n }\n\n return chunks;\n }\n\n /**\n * Convert symbol type to chunk type.\n */\n private symbolTypeToChunkType(symbolType: string): ChunkType {\n switch (symbolType) {\n case \"function\":\n case \"method\":\n return \"function\";\n case \"class\":\n return \"class\";\n case \"interface\":\n return \"interface\";\n case \"type\":\n return \"type\";\n case \"enum\":\n return \"enum\";\n case \"variable\":\n return \"variable\";\n default:\n return \"block\";\n }\n }\n\n /**\n * Finalize indexing - build BM25 index and save symbol index.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const config = ctx.config;\n const coreDir = path.join(\n getRaggrepDir(ctx.rootDir, config),\n \"index\",\n \"core\"\n );\n\n // Ensure directory exists\n await fs.mkdir(coreDir, { recursive: true });\n\n // Build BM25 index from all tokens\n this.bm25Index = new BM25Index();\n for (const [filepath, entry] of this.symbolIndex) {\n this.bm25Index.addDocument(filepath, entry.tokens);\n }\n\n // Save symbol index\n const symbolIndexData = {\n version: this.version,\n lastUpdated: new Date().toISOString(),\n files: Object.fromEntries(this.symbolIndex),\n bm25Data: this.bm25Index.serialize(),\n };\n\n await fs.writeFile(\n path.join(coreDir, \"symbols.json\"),\n JSON.stringify(symbolIndexData, null, 2)\n );\n }\n\n /**\n * Search the index.\n */\n async search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n const config = ctx.config;\n const topK = options?.topK ?? DEFAULT_TOP_K;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n\n // Load symbol index if not in memory\n if (this.symbolIndex.size === 0) {\n await this.loadSymbolIndex(ctx.rootDir, config);\n }\n\n if (!this.bm25Index || this.symbolIndex.size === 0) {\n return [];\n }\n\n // Tokenize query\n const queryTokens = tokenize(query);\n\n // Get BM25 scores\n const bm25Results = this.bm25Index.search(query, topK * 2);\n const bm25Scores = new Map(bm25Results.map((r) => [r.id, r.score]));\n\n // Check for symbol name matches (exact or partial)\n const symbolMatches = this.findSymbolMatches(queryTokens);\n\n // Combine results\n const results: SearchResult[] = [];\n\n for (const filepath of this.symbolIndex.keys()) {\n const entry = this.symbolIndex.get(filepath)!;\n const bm25Score = bm25Scores.get(filepath) ?? 0;\n const symbolScore = symbolMatches.get(filepath) ?? 0;\n\n // Skip if no match\n if (bm25Score === 0 && symbolScore === 0) continue;\n\n // Combined score: symbol matches are highly weighted\n const combinedScore = 0.6 * normalizeScore(bm25Score) + 0.4 * symbolScore;\n\n if (combinedScore >= minScore) {\n // Load file index to get chunks\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n // Find best matching chunk\n const bestChunk = this.findBestChunk(\n fileIndex.chunks,\n queryTokens,\n entry.symbols\n );\n\n results.push({\n filepath,\n chunk: bestChunk,\n score: combinedScore,\n moduleId: this.id,\n context: {\n bm25Score: normalizeScore(bm25Score),\n symbolScore,\n },\n });\n }\n }\n\n // Sort by score and limit\n return results.sort((a, b) => b.score - a.score).slice(0, topK);\n }\n\n /**\n * Find symbol name matches for query tokens.\n */\n private findSymbolMatches(queryTokens: string[]): Map<string, number> {\n const matches = new Map<string, number>();\n\n for (const [filepath, entry] of this.symbolIndex) {\n let matchScore = 0;\n\n for (const symbol of entry.symbols) {\n const symbolName = symbol.name.toLowerCase();\n const symbolParts = symbolsToKeywords([symbol]);\n\n for (const token of queryTokens) {\n // Exact match on symbol name\n if (symbolName === token) {\n matchScore += symbol.isExported ? 1.0 : 0.8;\n }\n // Partial match on symbol name\n else if (symbolName.includes(token) || token.includes(symbolName)) {\n matchScore += symbol.isExported ? 0.5 : 0.4;\n }\n // Match on symbol parts (camelCase split)\n else if (symbolParts.some((p) => p === token)) {\n matchScore += symbol.isExported ? 0.3 : 0.2;\n }\n }\n }\n\n if (matchScore > 0) {\n // Normalize by number of query tokens\n matches.set(filepath, Math.min(1, matchScore / queryTokens.length));\n }\n }\n\n return matches;\n }\n\n /**\n * Find the best matching chunk based on query tokens.\n */\n private findBestChunk(\n chunks: Chunk[],\n queryTokens: string[],\n symbols: ExtractedSymbol[]\n ): Chunk {\n let bestChunk = chunks[0];\n let bestScore = 0;\n\n for (const chunk of chunks) {\n let score = 0;\n const chunkContent = chunk.content.toLowerCase();\n\n // Score based on query token presence\n for (const token of queryTokens) {\n if (chunkContent.includes(token)) {\n score += 1;\n }\n }\n\n // Bonus for named chunks matching query\n if (chunk.name) {\n const nameLower = chunk.name.toLowerCase();\n for (const token of queryTokens) {\n if (nameLower.includes(token)) {\n score += 2;\n }\n }\n }\n\n // Bonus for exported symbols\n if (chunk.isExported) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestChunk = chunk;\n }\n }\n\n return bestChunk;\n }\n\n /**\n * Load the symbol index from disk.\n */\n private async loadSymbolIndex(rootDir: string, config: any): Promise<void> {\n const coreDir = path.join(getRaggrepDir(rootDir, config), \"index\", \"core\");\n const symbolsPath = path.join(coreDir, \"symbols.json\");\n\n try {\n const content = await fs.readFile(symbolsPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Restore symbol index\n this.symbolIndex = new Map(Object.entries(data.files));\n\n // Restore BM25 index\n if (data.bm25Data) {\n this.bm25Index = BM25Index.deserialize(data.bm25Data);\n }\n } catch (error) {\n // Index doesn't exist yet\n this.symbolIndex = new Map();\n this.bm25Index = null;\n }\n }\n\n async dispose(): Promise<void> {\n this.symbolIndex.clear();\n this.bm25Index = null;\n }\n}\n",
34
+ "/**\n * Discriminative query-term scoring using the session BM25 corpus.\n *\n * Rare query terms (high IDF among indexed query tokens) are treated as\n * salient: chunks that match more salient term mass rank higher; chunks that\n * miss them are slightly down-ranked. Pure logic — no I/O.\n */\n\nimport { BM25Index, tokenize } from \"./bm25\";\nimport type { DiscriminativeWeights } from \"../entities/rankingWeights\";\nimport { DEFAULT_DISCRIMINATIVE_WEIGHTS } from \"../entities/rankingWeights\";\n\n/** @deprecated Use {@link DEFAULT_DISCRIMINATIVE_WEIGHTS} from entities. */\nexport const DISCRIMINATIVE_CONSTANTS = DEFAULT_DISCRIMINATIVE_WEIGHTS;\n\nexport interface DiscriminativeTermResult {\n /** Additive boost ∈ [0, boostCap] */\n boost: number;\n /** Multiply hybrid score by this after additive boosts (≤ 1 when penalty applies) */\n penaltyFactor: number;\n /** Query tokens (indexed in BM25) with IDF ≥ median among indexed tokens */\n salientTerms: string[];\n matchedSalient: string[];\n missingSalient: string[];\n /** Σ IDF(matched salient) / Σ IDF(salient), or 1 if no salient set */\n salientCoverage: number;\n}\n\nfunction medianSorted(sorted: number[]): number {\n const n = sorted.length;\n if (n === 0) return 0;\n const mid = Math.floor(n / 2);\n return n % 2 === 1\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n}\n\nconst PREFIX_MATCH_MIN_LEN = 4;\n\n/** Token or prefix overlap (handles document vs documentation style drift). */\nfunction salientTermHitsChunk(\n term: string,\n haystack: string,\n tokenSet: Set<string>\n): boolean {\n if (tokenSet.has(term) || haystack.includes(term)) {\n return true;\n }\n if (term.length < PREFIX_MATCH_MIN_LEN) {\n return false;\n }\n for (const w of tokenSet) {\n if (w.length < PREFIX_MATCH_MIN_LEN) continue;\n if (term.startsWith(w) || w.startsWith(term)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Score how well chunk text hits corpus-rare query terms using an already-built\n * {@link BM25Index} over the same chunk set used for retrieval.\n */\nexport function scoreDiscriminativeTerms(\n bm25Index: BM25Index,\n query: string,\n chunkText: string,\n chunkName?: string,\n weights: DiscriminativeWeights = DEFAULT_DISCRIMINATIVE_WEIGHTS\n): DiscriminativeTermResult {\n const empty = (): DiscriminativeTermResult => ({\n boost: 0,\n penaltyFactor: 1,\n salientTerms: [],\n matchedSalient: [],\n missingSalient: [],\n salientCoverage: 1,\n });\n\n const uniqueTerms = [...new Set(tokenize(query))];\n if (uniqueTerms.length === 0) {\n return empty();\n }\n\n const indexed: { term: string; idf: number }[] = [];\n for (const term of uniqueTerms) {\n const idf = bm25Index.getInverseDocumentFrequency(term);\n if (idf > 0) {\n indexed.push({ term, idf });\n }\n }\n\n if (indexed.length === 0) {\n return empty();\n }\n\n const idfSorted = [...indexed.map((x) => x.idf)].sort((a, b) => a - b);\n const medianIdf = medianSorted(idfSorted);\n\n const salientEntries = indexed.filter((x) => x.idf >= medianIdf);\n const salientTerms = [...new Set(salientEntries.map((x) => x.term))];\n\n const idfByTerm = new Map<string, number>();\n for (const { term, idf } of salientEntries) {\n idfByTerm.set(term, Math.max(idfByTerm.get(term) ?? 0, idf));\n }\n\n let totalW = 0;\n for (const idf of idfByTerm.values()) {\n totalW += idf;\n }\n\n const haystack = [chunkName ?? \"\", chunkText].join(\"\\n\").toLowerCase();\n const tokenSet = new Set(tokenize(chunkName ? `${chunkName}\\n${chunkText}` : chunkText));\n\n const matchedSalient: string[] = [];\n for (const term of salientTerms) {\n const idf = idfByTerm.get(term) ?? 0;\n if (idf <= 0) continue;\n if (salientTermHitsChunk(term, haystack, tokenSet)) {\n matchedSalient.push(term);\n }\n }\n\n const matchedSet = new Set(matchedSalient);\n const missingSalient = salientTerms.filter((t) => !matchedSet.has(t));\n\n let matchedW = 0;\n for (const term of matchedSalient) {\n matchedW += idfByTerm.get(term) ?? 0;\n }\n\n const salientCoverage = totalW > 0 ? matchedW / totalW : 1;\n\n const { boostCap, penaltyMax, penaltyFloor } = weights;\n const boost = boostCap * salientCoverage;\n let penaltyFactor = 1 - penaltyMax * (1 - salientCoverage);\n if (penaltyFactor < penaltyFloor) {\n penaltyFactor = penaltyFloor;\n }\n\n return {\n boost,\n penaltyFactor,\n salientTerms,\n matchedSalient,\n missingSalient,\n salientCoverage,\n };\n}\n",
35
+ "/**\n * Separates hybrid retrieval into two comparable [0,1] scales:\n * - **semantic**: embedding cosine mapped to a match percentage\n * - **structured**: BM25 / symbols / path / phrase / docs headings (non-embedding signals)\n *\n * Used for display and for default hybrid ranking (structured primary).\n */\n\nimport type { RankBy, SearchResult } from \"../entities/searchResult\";\nimport type { RankingWeightsConfig } from \"../entities/rankingWeights\";\n\n/** Map cosine similarity [-1, 1] to [0, 1] for display / sorting. */\nexport function semanticPctFromCosine(cosine: number): number {\n return clamp01((cosine + 1) / 2);\n}\n\nexport function clamp01(x: number): number {\n if (Number.isNaN(x) || !Number.isFinite(x)) return 0;\n return Math.max(0, Math.min(1, x));\n}\n\nfunction num(ctx: Record<string, unknown>, key: string): number {\n const v = ctx[key];\n return typeof v === \"number\" && Number.isFinite(v) ? v : 0;\n}\n\nfunction additiveStructuredBoost(ctx: Record<string, unknown>): number {\n return (\n num(ctx, \"pathBoost\") +\n num(ctx, \"fileTypeBoost\") +\n num(ctx, \"chunkTypeBoost\") +\n num(ctx, \"exportBoost\")\n );\n}\n\n/**\n * Populate {@link SearchResult.semanticMatch} and {@link SearchResult.structuredMatch}\n * from existing module `context` and merged ranking weights.\n */\nexport function attachMatchScales(\n result: SearchResult,\n rw: RankingWeightsConfig\n): SearchResult {\n const ctx = (result.context ?? {}) as Record<string, unknown>;\n const mid = result.moduleId;\n\n let semanticMatch = 0;\n let structuredMatch = 0;\n\n if (mid === \"language/typescript\") {\n const cos = num(ctx, \"semanticScore\");\n const bm25 = num(ctx, \"bm25Score\");\n const vocab = num(ctx, \"vocabScore\");\n const phraseCov = num(ctx, \"phraseCoverage\");\n const tw = rw.typescript;\n semanticMatch = semanticPctFromCosine(cos);\n const denom = tw.bm25 + tw.vocab + 1e-9;\n const lexCore = (tw.bm25 * bm25 + tw.vocab * vocab) / denom;\n structuredMatch = clamp01(\n lexCore +\n Math.min(0.35, additiveStructuredBoost(ctx)) +\n Math.min(0.15, phraseCov * 0.25)\n );\n } else if (mid.startsWith(\"language/\")) {\n const cos = num(ctx, \"semanticScore\");\n const bm25 = num(ctx, \"bm25Score\");\n semanticMatch = semanticPctFromCosine(cos);\n structuredMatch = clamp01(\n bm25 +\n Math.min(0.3, additiveStructuredBoost(ctx)) +\n Math.min(0.12, num(ctx, \"phraseCoverage\") * 0.2)\n );\n } else if (mid === \"docs/markdown\") {\n const cos = num(ctx, \"semanticScore\");\n const bm25 = num(ctx, \"bm25Score\");\n const docBoost = num(ctx, \"docBoost\");\n const headingBoost = num(ctx, \"headingBoost\");\n const phraseCov = num(ctx, \"phraseCoverage\");\n const mw = rw.markdown;\n semanticMatch = semanticPctFromCosine(cos);\n structuredMatch = clamp01(\n mw.bm25 * bm25 +\n docBoost +\n headingBoost +\n Math.min(0.2, phraseCov * 0.15)\n );\n } else if (mid === \"core\") {\n semanticMatch = 0;\n const nBm = num(ctx, \"bm25Score\");\n const sym = num(ctx, \"symbolScore\");\n structuredMatch = clamp01(0.6 * nBm + 0.4 * sym);\n } else if (mid === \"data/json\") {\n semanticMatch = 0;\n const bm25 = num(ctx, \"bm25Score\");\n const litM = num(ctx, \"literalMultiplier\");\n structuredMatch = clamp01(\n bm25 > 0.02 ? bm25 : Math.min(1, 0.35 + Math.min(0.65, (litM - 1) * 0.35))\n );\n } else {\n semanticMatch = 0;\n structuredMatch = clamp01(result.score);\n }\n\n return { ...result, semanticMatch, structuredMatch };\n}\n\n/** Compare results for final hybrid ordering. Default: structured → semantic → fused score. */\nexport function compareSearchResultsByRankBy(\n a: SearchResult,\n b: SearchResult,\n rankBy: RankBy\n): number {\n if (rankBy === \"combined\") {\n return b.score - a.score;\n }\n\n const sa = a.semanticMatch ?? 0;\n const sb = b.semanticMatch ?? 0;\n const ta = a.structuredMatch ?? 0;\n const tb = b.structuredMatch ?? 0;\n\n if (rankBy === \"semantic\") {\n if (Math.abs(sb - sa) > 1e-9) return sb - sa;\n if (Math.abs(tb - ta) > 1e-9) return tb - ta;\n return b.score - a.score;\n }\n\n // structured (default)\n if (Math.abs(tb - ta) > 1e-9) return tb - ta;\n if (Math.abs(sb - sa) > 1e-9) return sb - sa;\n return b.score - a.score;\n}\n",
33
36
  "/**\n * Keyword Extraction Service\n * \n * Pure domain service for extracting keywords from code.\n * No external dependencies - operates only on string data.\n */\n\n/**\n * Common programming keywords to exclude from keyword extraction.\n * These appear in almost every code file and don't add search value.\n */\nexport const COMMON_KEYWORDS = new Set([\n // JavaScript/TypeScript\n 'const', 'let', 'var', 'function', 'class', 'interface', 'type', 'enum',\n 'export', 'import', 'from', 'return', 'async', 'await', 'new', 'this',\n 'true', 'false', 'null', 'undefined', 'if', 'else', 'for', 'while',\n 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally',\n 'throw', 'typeof', 'instanceof', 'void', 'delete', 'in', 'of',\n 'string', 'number', 'boolean', 'any', 'unknown', 'never', 'object',\n 'public', 'private', 'protected', 'static', 'readonly', 'abstract',\n 'implements', 'extends', 'super', 'get', 'set', 'constructor',\n // Common words\n 'the', 'and', 'for', 'not', 'with', 'are', 'was', 'has', 'have',\n]);\n\n/**\n * Common architectural layer patterns in file names/paths.\n * Used to detect the layer a file belongs to.\n */\nexport const LAYER_PATTERNS: Record<string, string[]> = {\n 'controller': ['controller', 'controllers', 'handler', 'handlers', 'route', 'routes', 'api'],\n 'service': ['service', 'services', 'usecase', 'usecases', 'application'],\n 'repository': ['repository', 'repositories', 'repo', 'repos', 'dao', 'store', 'storage'],\n 'model': ['model', 'models', 'entity', 'entities', 'schema', 'schemas'],\n 'util': ['util', 'utils', 'utility', 'utilities', 'helper', 'helpers', 'common', 'shared'],\n 'config': ['config', 'configs', 'configuration', 'settings'],\n 'middleware': ['middleware', 'middlewares', 'interceptor', 'interceptors'],\n 'domain': ['domain', 'core', 'business'],\n 'infrastructure': ['infrastructure', 'infra', 'external', 'adapters'],\n 'presentation': ['presentation', 'view', 'views', 'component', 'components', 'ui'],\n 'test': ['test', 'tests', 'spec', 'specs', '__tests__', '__test__'],\n};\n\n/**\n * Extract keywords from code content and optional name.\n * \n * @param content - Code content to extract keywords from\n * @param name - Optional name (function name, class name, etc.)\n * @param maxKeywords - Maximum keywords to return (default: 50)\n * @returns Array of unique lowercase keywords\n */\nexport function extractKeywords(\n content: string, \n name?: string,\n maxKeywords: number = 50\n): string[] {\n const keywords = new Set<string>();\n \n // Add the name if present\n if (name) {\n keywords.add(name.toLowerCase());\n \n // Also add camelCase parts (e.g., \"getUserById\" → [\"get\", \"user\", \"by\", \"id\"])\n const parts = name.split(/(?=[A-Z])/).map(p => p.toLowerCase());\n parts.forEach(p => p.length > 2 && keywords.add(p));\n }\n \n // Extract identifiers from content\n const identifierRegex = /\\b([a-zA-Z_][a-zA-Z0-9_]{2,})\\b/g;\n let match;\n \n while ((match = identifierRegex.exec(content)) !== null) {\n const word = match[1].toLowerCase();\n \n // Skip common keywords and very short words\n if (!COMMON_KEYWORDS.has(word) && word.length > 2) {\n keywords.add(word);\n }\n }\n \n return Array.from(keywords).slice(0, maxKeywords);\n}\n\n/**\n * Split a string by camelCase, PascalCase, snake_case, and kebab-case.\n */\nfunction splitIdentifier(str: string): string[] {\n return str\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n .split(/\\s+/)\n .map(s => s.toLowerCase())\n .filter(s => s.length > 1);\n}\n\n/**\n * Extract keywords from a file path.\n * \n * Enhanced extraction that:\n * - Splits camelCase/PascalCase filenames\n * - Extracts directory segments\n * - Recognizes common patterns (Service, Controller, etc.)\n * \n * @param filepath - File path to extract keywords from\n * @returns Array of keywords from path segments\n */\nexport function extractPathKeywords(filepath: string): string[] {\n const keywords = new Set<string>();\n \n // Split path into segments (excluding extension)\n const pathWithoutExt = filepath.replace(/\\.[^.]+$/, '');\n const segments = pathWithoutExt.split(/[/\\\\]/);\n \n for (const segment of segments) {\n if (segment.length < 2) continue;\n \n // Add the full segment\n const lower = segment.toLowerCase();\n if (!COMMON_KEYWORDS.has(lower) && lower.length > 2) {\n keywords.add(lower);\n }\n \n // Split camelCase/PascalCase/snake_case and add parts\n const parts = splitIdentifier(segment);\n for (const part of parts) {\n if (!COMMON_KEYWORDS.has(part) && part.length > 2) {\n keywords.add(part);\n }\n }\n }\n \n return Array.from(keywords);\n}\n\n/**\n * Path context information extracted from a file path.\n */\nexport interface PathContext {\n /** Directory segments (excluding filename) */\n segments: string[];\n /** Detected architectural layer (service, controller, repository, etc.) */\n layer?: string;\n /** Detected feature domain (auth, users, payments, etc.) */\n domain?: string;\n /** Path depth (number of directory levels) */\n depth: number;\n /** Keywords extracted from the path */\n keywords: string[];\n}\n\n/**\n * Parse a file path and extract structural context.\n * \n * This helps with:\n * - Boosting files in related directories\n * - Understanding architectural layer\n * - Grouping by feature domain\n * \n * @param filepath - File path to parse\n * @returns Parsed path context\n */\nexport function parsePathContext(filepath: string): PathContext {\n const pathWithoutExt = filepath.replace(/\\.[^.]+$/, '');\n const allSegments = pathWithoutExt.split(/[/\\\\]/);\n const filename = allSegments[allSegments.length - 1];\n const dirSegments = allSegments.slice(0, -1);\n \n // Extract keywords from all segments\n const keywords = extractPathKeywords(filepath);\n \n // Detect layer from filename and path\n let layer: string | undefined;\n const allLower = [...dirSegments, filename].map(s => s.toLowerCase()).join(' ');\n const filenameLower = filename.toLowerCase();\n \n for (const [layerName, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n // Check filename first (higher priority)\n if (filenameLower.includes(pattern)) {\n layer = layerName;\n break;\n }\n // Check path segments\n if (dirSegments.some(s => s.toLowerCase() === pattern)) {\n layer = layerName;\n break;\n }\n }\n if (layer) break;\n }\n \n // Detect domain from non-layer directory names\n // e.g., src/services/auth/authService.ts → domain = \"auth\"\n // Traverse from innermost to outermost to find the most specific domain\n let domain: string | undefined;\n const layerPatternSet = new Set(Object.values(LAYER_PATTERNS).flat());\n \n // Create a reversed copy to traverse from innermost to outermost\n const reversedSegments = [...dirSegments].reverse();\n for (const segment of reversedSegments) {\n const lower = segment.toLowerCase();\n // Skip common non-domain directories\n if (['src', 'lib', 'app', 'packages', 'modules'].includes(lower)) continue;\n // Skip layer directories\n if (layerPatternSet.has(lower)) continue;\n // This is likely the domain\n if (lower.length > 2) {\n domain = lower;\n break;\n }\n }\n \n return {\n segments: dirSegments,\n layer,\n domain,\n depth: dirSegments.length,\n keywords,\n };\n}\n\n/**\n * Generate a path context string for embedding.\n * This is prepended to content to give the embedding model path awareness.\n * \n * @param pathContext - Parsed path context\n * @returns A string representation of the path context\n */\nexport function formatPathContextForEmbedding(pathContext: PathContext): string {\n const parts: string[] = [];\n \n if (pathContext.domain) {\n parts.push(pathContext.domain);\n }\n \n if (pathContext.layer) {\n parts.push(pathContext.layer);\n }\n \n // Add significant path segments (limit to avoid noise)\n const significantSegments = pathContext.segments\n .slice(-3) // Last 3 directories\n .filter(s => s.length > 2 && !['src', 'lib', 'app'].includes(s.toLowerCase()));\n \n if (significantSegments.length > 0) {\n parts.push(...significantSegments.map(s => s.toLowerCase()));\n }\n \n if (parts.length === 0) return '';\n \n // Deduplicate\n const unique = [...new Set(parts)];\n return `[${unique.join(' ')}]`;\n}\n\n",
34
37
  "/**\n * Similarity Service\n *\n * Pure mathematical functions for computing vector similarity.\n * No external dependencies.\n */\n\n/**\n * Calculate cosine similarity between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Similarity score between -1 and 1 (1 = identical, 0 = orthogonal, -1 = opposite)\n * @throws Error if vectors have different lengths\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/**\n * Calculate Euclidean distance between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Distance (0 = identical, larger = more different)\n */\nexport function euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = a[i] - b[i];\n sum += diff * diff;\n }\n\n return Math.sqrt(sum);\n}\n\n",
35
38
  "/**\n * Query Intent Detection Service\n *\n * Detects whether a search query is looking for implementation code\n * or documentation, and calculates appropriate boosts.\n */\n\nimport * as path from \"path\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Implementation-related query terms that boost source code files */\nexport const IMPLEMENTATION_TERMS = [\n \"function\",\n \"method\",\n \"class\",\n \"interface\",\n \"implement\",\n \"implementation\",\n \"endpoint\",\n \"route\",\n \"handler\",\n \"controller\",\n \"module\",\n \"code\",\n];\n\n/** Documentation-related query terms that boost documentation files */\nexport const DOCUMENTATION_TERMS = [\n \"documentation\",\n \"docs\",\n \"guide\",\n \"tutorial\",\n \"readme\",\n \"how\",\n \"what\",\n \"why\",\n \"explain\",\n \"overview\",\n \"getting\",\n \"started\",\n \"requirements\",\n \"setup\",\n \"install\",\n \"configure\",\n \"configuration\",\n];\n\n/** Source code file extensions */\nexport const SOURCE_CODE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n];\n\n/** Documentation file extensions */\nexport const DOC_EXTENSIONS = [\".md\", \".txt\", \".rst\"];\n\n/** Data/config file extensions */\nexport const DATA_EXTENSIONS = [\".json\", \".yaml\", \".yml\", \".toml\"];\n\n// ============================================================================\n// Query Intent Detection\n// ============================================================================\n\n/** Query intent types */\nexport type QueryIntent = \"implementation\" | \"documentation\" | \"neutral\";\n\n/**\n * Detect query intent based on terms.\n * Returns: 'implementation' | 'documentation' | 'neutral'\n *\n * @param queryTerms - Array of query terms (lowercase)\n * @returns The detected intent\n */\nexport function detectQueryIntent(queryTerms: string[]): QueryIntent {\n const hasImplementationTerm = queryTerms.some((term) =>\n IMPLEMENTATION_TERMS.includes(term)\n );\n const hasDocumentationTerm = queryTerms.some((term) =>\n DOCUMENTATION_TERMS.includes(term)\n );\n\n // Documentation terms take precedence if both are present\n // (e.g., \"api documentation\" should favor docs)\n if (hasDocumentationTerm) {\n return \"documentation\";\n }\n\n if (hasImplementationTerm) {\n return \"implementation\";\n }\n\n return \"neutral\";\n}\n\n/**\n * Extract query terms from a search query.\n *\n * @param query - The search query string\n * @returns Array of lowercase terms (length > 2)\n */\nexport function extractQueryTerms(query: string): string[] {\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n// ============================================================================\n// File Type Boosts\n// ============================================================================\n\n/**\n * Determine if a file is a source code file based on extension.\n */\nexport function isSourceCodeFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return SOURCE_CODE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Determine if a file is a documentation file based on extension.\n */\nexport function isDocFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return DOC_EXTENSIONS.includes(ext);\n}\n\n/**\n * Determine if a file is a data/config file based on extension.\n */\nexport function isDataFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return DATA_EXTENSIONS.includes(ext);\n}\n\n/**\n * Calculate boost based on file type and query context.\n * Bidirectional: boosts code for implementation queries, docs for documentation queries.\n * Only applies when query intent is clear.\n *\n * @param filepath - The file path\n * @param queryTerms - Array of query terms (lowercase)\n * @returns Boost value (0 to ~0.1)\n */\nexport function calculateFileTypeBoost(\n filepath: string,\n queryTerms: string[]\n): number {\n const isSourceCode = isSourceCodeFile(filepath);\n const isDoc = isDocFile(filepath);\n\n const intent = detectQueryIntent(queryTerms);\n\n // For implementation-focused queries, boost source code\n if (intent === \"implementation\") {\n if (isSourceCode) {\n return 0.06; // Moderate boost for source code\n }\n // No penalty for docs - they might still be relevant\n return 0;\n }\n\n // For documentation-focused queries, boost documentation files\n if (intent === \"documentation\") {\n if (isDoc) {\n return 0.08; // Boost documentation files\n }\n // No penalty for code - they might still be relevant\n return 0;\n }\n\n // Neutral queries: no boost either way\n return 0;\n}\n\n\n\n\n\n",
36
39
  "/**\n * Text Chunking Service\n *\n * Provides generic text chunking strategies for indexing.\n * These are language-agnostic and work with any text content.\n */\n\nimport type { ChunkType } from \"../entities\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Represents a chunk of text with location information.\n */\nexport interface TextChunk {\n /** The text 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 chunk */\n type: ChunkType;\n /** Optional name for the chunk */\n name?: string;\n}\n\n/**\n * Options for line-based chunking.\n */\nexport interface ChunkingOptions {\n /** Lines per chunk (default: 30) */\n chunkSize?: number;\n /** Overlap between chunks (default: 5) */\n overlap?: number;\n /** Minimum lines to create multiple chunks (default: chunkSize) */\n minLinesForMultipleChunks?: number;\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/** Default lines per chunk */\nexport const DEFAULT_CHUNK_SIZE = 30;\n\n/** Default overlap between chunks */\nexport const DEFAULT_OVERLAP = 5;\n\n// ============================================================================\n// Chunking Functions\n// ============================================================================\n\n/**\n * Split text into overlapping chunks based on line boundaries.\n *\n * This is a generic chunking strategy that works with any text content.\n * It creates overlapping chunks to ensure context is preserved across\n * chunk boundaries.\n *\n * @param content - The text content to chunk\n * @param options - Chunking options\n * @returns Array of text chunks\n */\nexport function createLineBasedChunks(\n content: string,\n options: ChunkingOptions = {}\n): TextChunk[] {\n const {\n chunkSize = DEFAULT_CHUNK_SIZE,\n overlap = DEFAULT_OVERLAP,\n minLinesForMultipleChunks = chunkSize,\n } = options;\n\n const lines = content.split(\"\\n\");\n const chunks: TextChunk[] = [];\n\n // If file is small, treat as single chunk\n if (lines.length <= minLinesForMultipleChunks) {\n return [\n {\n content: content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n },\n ];\n }\n\n // Split into overlapping chunks\n for (let i = 0; i < lines.length; i += chunkSize - overlap) {\n const endIdx = Math.min(i + chunkSize, lines.length);\n chunks.push({\n content: lines.slice(i, endIdx).join(\"\\n\"),\n startLine: i + 1,\n endLine: endIdx,\n type: \"block\",\n });\n\n if (endIdx >= lines.length) break;\n }\n\n return chunks;\n}\n\n/**\n * Create a single chunk from entire content.\n * Useful for small files or when chunking isn't needed.\n *\n * @param content - The text content\n * @returns A single file chunk\n */\nexport function createSingleChunk(content: string): TextChunk {\n const lines = content.split(\"\\n\");\n return {\n content,\n startLine: 1,\n endLine: lines.length,\n type: \"file\",\n };\n}\n\n/**\n * Generate a unique chunk ID from filepath and line numbers.\n *\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\n\n\n\n\n",
37
40
  "/**\n * Query Literal Parser\n *\n * Parses search queries to extract literals for exact-match boosting.\n * Supports explicit detection (backticks, quotes) and implicit detection (casing patterns).\n *\n * This is a pure domain service with no external dependencies.\n */\n\nimport type {\n DetectedLiteral,\n QueryLiteralParseResult,\n LiteralType,\n LiteralConfidence,\n LiteralDetectionMethod,\n} from \"../entities/literal\";\n\n/**\n * Pattern definitions for implicit literal detection.\n */\ninterface ImplicitPattern {\n /** Regex pattern to match */\n pattern: RegExp;\n /** Confidence level for matches */\n confidence: LiteralConfidence;\n /** Inferred type for matches */\n inferredType: LiteralType;\n /** Minimum length for valid match */\n minLength?: number;\n}\n\n/**\n * Implicit detection patterns ordered by specificity.\n *\n * PascalCase: AuthService, UserRepository (2+ capital transitions)\n * camelCase: getUserById, handleLogin (lowercase start, then capital)\n * SCREAMING_SNAKE: MAX_RETRIES, API_KEY (all caps with underscores)\n * snake_case: user_auth, get_user (lowercase with underscores)\n * kebab-case: auth-service, user-auth (lowercase with hyphens)\n */\nconst IMPLICIT_PATTERNS: ImplicitPattern[] = [\n // PascalCase: Must have at least one capital after the first letter\n // e.g., AuthService, UserRepository, MyClass\n {\n pattern: /\\b([A-Z][a-z]+(?:[A-Z][a-z0-9]*)+)\\b/g,\n confidence: \"medium\",\n inferredType: \"className\",\n minLength: 3,\n },\n // camelCase: Starts lowercase, has at least one capital\n // e.g., getUserById, handleLogin, myFunction\n {\n pattern: /\\b([a-z][a-z0-9]*(?:[A-Z][a-zA-Z0-9]*)+)\\b/g,\n confidence: \"medium\",\n inferredType: \"functionName\",\n minLength: 3,\n },\n // SCREAMING_SNAKE_CASE: All caps with underscores\n // e.g., MAX_RETRIES, API_KEY, DEFAULT_TIMEOUT\n {\n pattern: /\\b([A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+)\\b/g,\n confidence: \"medium\",\n inferredType: \"variableName\",\n minLength: 3,\n },\n // snake_case: All lowercase with underscores\n // e.g., user_auth, get_user_by_id\n {\n pattern: /\\b([a-z][a-z0-9]*(?:_[a-z0-9]+)+)\\b/g,\n confidence: \"low\",\n inferredType: \"identifier\",\n minLength: 3,\n },\n // kebab-case: All lowercase with hyphens\n // e.g., auth-service, user-auth-middleware\n // Exclude patterns that look like URLs or file paths\n {\n pattern: /(?<![/:.])\\b([a-z][a-z0-9]*(?:-[a-z0-9]+)+)\\b(?![/:])/g,\n confidence: \"low\",\n inferredType: \"packageName\",\n minLength: 3,\n },\n];\n\n/**\n * Parse a search query to extract literals.\n *\n * Detects:\n * - Explicit literals: `backticks` or \"quotes\"\n * - Implicit literals: PascalCase, camelCase, SCREAMING_SNAKE, snake_case, kebab-case\n *\n * @param query - The search query to parse\n * @returns Detected literals and remaining query for semantic search\n */\nexport function parseQueryLiterals(query: string): QueryLiteralParseResult {\n if (!query || query.trim() === \"\") {\n return { literals: [], remainingQuery: \"\" };\n }\n\n const literals: DetectedLiteral[] = [];\n let remainingQuery = query;\n\n // Track positions that have been matched to avoid duplicates\n const matchedPositions = new Set<string>();\n\n // 1. Extract explicit backtick literals\n const backtickResult = extractExplicitLiterals(\n remainingQuery,\n /`([^`]+)`/g,\n \"explicit-backtick\",\n matchedPositions\n );\n literals.push(...backtickResult.literals);\n remainingQuery = backtickResult.remainingQuery;\n\n // 2. Extract explicit quoted literals\n const quoteResult = extractExplicitLiterals(\n remainingQuery,\n /\"([^\"]+)\"/g,\n \"explicit-quote\",\n matchedPositions\n );\n literals.push(...quoteResult.literals);\n remainingQuery = quoteResult.remainingQuery;\n\n // 3. Extract implicit literals from the ORIGINAL query\n // (we keep implicit literals in remainingQuery for semantic search)\n const implicitLiterals = extractImplicitLiterals(query, matchedPositions);\n literals.push(...implicitLiterals);\n\n return {\n literals,\n remainingQuery: remainingQuery.trim(),\n };\n}\n\n/**\n * Extract explicit literals (backticks or quotes) from query.\n */\nfunction extractExplicitLiterals(\n query: string,\n pattern: RegExp,\n method: LiteralDetectionMethod,\n matchedPositions: Set<string>\n): { literals: DetectedLiteral[]; remainingQuery: string } {\n const literals: DetectedLiteral[] = [];\n let remainingQuery = query;\n\n // Reset regex state\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n const replacements: Array<{ start: number; end: number; text: string }> = [];\n\n while ((match = pattern.exec(query)) !== null) {\n const value = match[1];\n const rawValue = match[0];\n\n // Skip empty matches\n if (!value || value.trim() === \"\") {\n continue;\n }\n\n // Track this position to avoid implicit detection of same term\n const posKey = `${match.index}:${match.index + rawValue.length}`;\n matchedPositions.add(posKey);\n\n // Also track the value itself to help avoid duplicates\n matchedPositions.add(`value:${value.toLowerCase()}`);\n\n literals.push({\n value,\n rawValue,\n confidence: \"high\",\n detectionMethod: method,\n // Don't infer type for explicit - user knows what they want\n inferredType: inferTypeFromValue(value),\n });\n\n replacements.push({\n start: match.index,\n end: match.index + rawValue.length,\n text: \"\",\n });\n }\n\n // Apply replacements in reverse order to maintain positions\n replacements\n .sort((a, b) => b.start - a.start)\n .forEach((r) => {\n remainingQuery =\n remainingQuery.slice(0, r.start) + r.text + remainingQuery.slice(r.end);\n });\n\n return { literals, remainingQuery };\n}\n\n/**\n * Extract implicit literals based on casing patterns.\n */\nfunction extractImplicitLiterals(\n query: string,\n matchedPositions: Set<string>\n): DetectedLiteral[] {\n const literals: DetectedLiteral[] = [];\n const seenValues = new Set<string>();\n\n for (const patternDef of IMPLICIT_PATTERNS) {\n // Reset regex state\n patternDef.pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = patternDef.pattern.exec(query)) !== null) {\n const value = match[1];\n\n // Skip if too short\n if (patternDef.minLength && value.length < patternDef.minLength) {\n continue;\n }\n\n // Skip if this position was already matched by explicit pattern\n const posKey = `${match.index}:${match.index + value.length}`;\n if (matchedPositions.has(posKey)) {\n continue;\n }\n\n // Skip if value was already matched explicitly\n if (matchedPositions.has(`value:${value.toLowerCase()}`)) {\n continue;\n }\n\n // Skip if we've already seen this value (from another pattern)\n const lowerValue = value.toLowerCase();\n if (seenValues.has(lowerValue)) {\n continue;\n }\n seenValues.add(lowerValue);\n\n // Skip common false positives\n if (isCommonWord(value)) {\n continue;\n }\n\n literals.push({\n value,\n rawValue: value,\n confidence: patternDef.confidence,\n detectionMethod: \"implicit-casing\",\n inferredType: patternDef.inferredType,\n });\n }\n }\n\n return literals;\n}\n\n/**\n * Infer type from value pattern (for explicit literals).\n */\nfunction inferTypeFromValue(value: string): LiteralType | undefined {\n // Check each pattern\n if (/^[A-Z][a-z]+(?:[A-Z][a-z0-9]*)+$/.test(value)) {\n return \"className\";\n }\n if (/^[a-z][a-z0-9]*(?:[A-Z][a-zA-Z0-9]*)+$/.test(value)) {\n return \"functionName\";\n }\n if (/^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$/.test(value)) {\n return \"variableName\";\n }\n if (/^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/.test(value)) {\n return \"identifier\";\n }\n if (/^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/.test(value)) {\n return \"packageName\";\n }\n // Can't infer type\n return undefined;\n}\n\n/**\n * Check if a word is a common English word that shouldn't be detected as a literal.\n *\n * This helps avoid false positives for words like \"Find\", \"The\", etc.\n * that might be capitalized at the start of a sentence.\n */\nfunction isCommonWord(word: string): boolean {\n const commonWords = new Set([\n // Common sentence starters\n \"find\",\n \"the\",\n \"a\",\n \"an\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"what\",\n \"where\",\n \"when\",\n \"how\",\n \"why\",\n \"which\",\n \"who\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"and\",\n \"or\",\n \"but\",\n \"for\",\n \"with\",\n \"from\",\n \"to\",\n \"in\",\n \"on\",\n \"at\",\n \"by\",\n \"of\",\n \"all\",\n \"any\",\n \"some\",\n // Common programming terms that shouldn't be literals alone\n \"get\",\n \"set\",\n \"new\",\n \"class\",\n \"function\",\n \"const\",\n \"let\",\n \"var\",\n \"type\",\n \"interface\",\n \"import\",\n \"export\",\n \"default\",\n \"return\",\n \"async\",\n \"await\",\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n ]);\n\n return commonWords.has(word.toLowerCase());\n}\n",
38
41
  "/**\n * Literal Extractor\n *\n * Extracts literals from code chunks for indexing.\n * For TypeScript/JavaScript, uses the chunk name from AST parsing.\n *\n * This is a pure domain service with no external dependencies.\n */\n\nimport type { Chunk } from \"../entities/chunk\";\nimport type { ExtractedLiteral, LiteralType } from \"../entities/literal\";\n\n// ============================================================================\n// Vocabulary Extraction\n// ============================================================================\n\n/**\n * Extract vocabulary words from a literal (identifier) name.\n *\n * Handles multiple naming conventions:\n * - camelCase: getUserById → [\"get\", \"user\", \"by\", \"id\"]\n * - PascalCase: AuthService → [\"auth\", \"service\"]\n * - snake_case: get_user_by_id → [\"get\", \"user\", \"by\", \"id\"]\n * - kebab-case: get-user-by-id → [\"get\", \"user\", \"by\", \"id\"]\n * - SCREAMING_SNAKE_CASE: MAX_RETRY_COUNT → [\"max\", \"retry\", \"count\"]\n *\n * @param literal - The identifier name to extract vocabulary from\n * @returns Array of unique vocabulary words (lowercase, length > 1)\n */\nexport function extractVocabulary(literal: string): string[] {\n if (!literal || literal.length === 0) {\n return [];\n }\n\n const words: string[] = [];\n\n // Handle snake_case and kebab-case first by splitting on delimiters\n const delimitedParts = literal.split(/[-_]/);\n\n for (const part of delimitedParts) {\n if (!part) continue;\n\n // Handle camelCase / PascalCase by splitting on uppercase letters\n // Keep sequences of uppercase letters together (e.g., \"XMLParser\" → \"XML\", \"Parser\")\n const camelSplit = part.split(/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/);\n\n for (const word of camelSplit) {\n if (word) {\n words.push(word.toLowerCase());\n }\n }\n }\n\n // Filter out single characters and deduplicate\n const filtered = words.filter((w) => w.length > 1);\n return [...new Set(filtered)];\n}\n\n/**\n * Split a word by common abbreviations.\n * (Reserved for future use with known abbreviations)\n */\nconst COMMON_ABBREVIATIONS = new Set([\n \"id\",\n \"api\",\n \"url\",\n \"uri\",\n \"db\",\n \"sql\",\n \"http\",\n \"https\",\n \"json\",\n \"xml\",\n \"html\",\n \"css\",\n \"js\",\n \"ts\",\n \"ui\",\n \"io\",\n \"os\",\n]);\n\n/**\n * Check if a word is a common stop word that should be filtered.\n */\nconst STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"the\",\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 \"to\",\n \"of\",\n \"in\",\n \"for\",\n \"on\",\n \"at\",\n \"by\",\n \"or\",\n \"as\",\n \"if\",\n]);\n\n/**\n * Extended stop words for query vocabulary extraction.\n * Includes question words and common query patterns.\n */\nconst QUERY_STOP_WORDS = new Set([\n ...STOP_WORDS,\n // Question words\n \"what\",\n \"where\",\n \"when\",\n \"how\",\n \"why\",\n \"which\",\n \"who\",\n // Query patterns\n \"find\",\n \"show\",\n \"get\",\n \"list\",\n \"search\",\n // Common connectors\n \"and\",\n \"but\",\n \"with\",\n \"from\",\n \"that\",\n \"this\",\n \"these\",\n \"those\",\n \"it\",\n \"its\",\n // Code-related generic words (too common)\n \"code\",\n \"file\",\n \"function\",\n \"class\",\n \"method\",\n \"variable\",\n]);\n\n/**\n * Extract vocabulary words from a natural language query.\n *\n * Unlike extractVocabulary (for identifiers), this:\n * 1. Tokenizes the query into words\n * 2. Filters out stop words\n * 3. Handles both natural language and embedded identifiers\n * 4. Returns unique, normalized vocabulary words\n *\n * @param query - The search query string\n * @returns Array of unique vocabulary words (lowercase, length > 1)\n *\n * @example\n * extractQueryVocabulary(\"where is user session validated\")\n * // → [\"user\", \"session\", \"validated\"]\n *\n * extractQueryVocabulary(\"find the authenticateUser function\")\n * // → [\"authenticate\", \"user\"] (identifier decomposed)\n */\nexport function extractQueryVocabulary(query: string): string[] {\n if (!query || query.trim() === \"\") {\n return [];\n }\n\n const vocabularySet = new Set<string>();\n\n // Tokenize query into words\n const tokens = query\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \") // Replace punctuation with spaces\n .split(/\\s+/)\n .filter((t) => t.length > 1);\n\n for (const token of tokens) {\n // Skip stop words\n if (QUERY_STOP_WORDS.has(token)) {\n continue;\n }\n\n // Check if token looks like an identifier (has internal capitals or underscores)\n const looksLikeIdentifier =\n /[A-Z]/.test(token) || token.includes(\"_\") || token.includes(\"-\");\n\n if (looksLikeIdentifier) {\n // Decompose identifier into vocabulary words\n const vocabWords = extractVocabulary(token);\n for (const word of vocabWords) {\n if (!QUERY_STOP_WORDS.has(word)) {\n vocabularySet.add(word);\n }\n }\n } else {\n // Add as-is (already lowercase)\n vocabularySet.add(token);\n }\n }\n\n return Array.from(vocabularySet);\n}\n\n/**\n * Map from ChunkType to LiteralType for named chunks.\n */\nconst CHUNK_TYPE_TO_LITERAL_TYPE: Record<string, LiteralType> = {\n class: \"className\",\n function: \"functionName\",\n interface: \"interfaceName\",\n type: \"typeName\",\n enum: \"enumName\",\n variable: \"variableName\",\n};\n\n/**\n * Extract literals from a code chunk.\n *\n * For TypeScript/JavaScript chunks, this extracts the chunk's name\n * as a \"definition\" literal. The name comes from proper AST parsing,\n * so it's accurate and reliable.\n *\n * Also extracts vocabulary words from the literal for partial matching.\n *\n * @param chunk - The code chunk to extract literals from\n * @returns Array of extracted literals (typically just the definition)\n */\nexport function extractLiterals(chunk: Chunk): ExtractedLiteral[] {\n const literals: ExtractedLiteral[] = [];\n\n // Extract the chunk's own name as a definition\n // This name comes from TypeScript AST parsing, so it's accurate\n if (chunk.name) {\n const literalType = CHUNK_TYPE_TO_LITERAL_TYPE[chunk.type] || \"identifier\";\n const vocabulary = extractVocabulary(chunk.name);\n\n literals.push({\n value: chunk.name,\n type: literalType,\n matchType: \"definition\",\n vocabulary,\n });\n }\n\n return literals;\n}\n\n/**\n * Extract literals from a code chunk with additional reference extraction.\n *\n * This version also extracts references from the chunk content using\n * pattern matching. Use this for modules that want deeper literal indexing.\n *\n * @param chunk - The code chunk to extract literals from\n * @param options - Extraction options\n * @returns Array of extracted literals\n */\nexport function extractLiteralsWithReferences(\n chunk: Chunk,\n options: { includeImports?: boolean; includeTypeRefs?: boolean } = {}\n): ExtractedLiteral[] {\n const literals: ExtractedLiteral[] = [];\n const seenValues = new Set<string>();\n\n // 1. Extract the chunk's own name as a definition\n if (chunk.name) {\n const literalType = CHUNK_TYPE_TO_LITERAL_TYPE[chunk.type] || \"identifier\";\n const vocabulary = extractVocabulary(chunk.name);\n\n literals.push({\n value: chunk.name,\n type: literalType,\n matchType: \"definition\",\n vocabulary,\n });\n seenValues.add(chunk.name.toLowerCase());\n }\n\n // 2. Optionally extract imports\n if (options.includeImports) {\n const imports = extractImportLiterals(chunk.content);\n for (const lit of imports) {\n if (!seenValues.has(lit.value.toLowerCase())) {\n literals.push(lit);\n seenValues.add(lit.value.toLowerCase());\n }\n }\n }\n\n // 3. Optionally extract type references\n if (options.includeTypeRefs) {\n const refs = extractTypeReferences(chunk.content, chunk.name);\n for (const lit of refs) {\n if (!seenValues.has(lit.value.toLowerCase())) {\n literals.push(lit);\n seenValues.add(lit.value.toLowerCase());\n }\n }\n }\n\n return literals;\n}\n\n/**\n * Extract literals from import statements.\n * Only extracts PascalCase identifiers (likely classes/types).\n */\nfunction extractImportLiterals(content: string): ExtractedLiteral[] {\n const literals: ExtractedLiteral[] = [];\n const seen = new Set<string>();\n\n // Named imports: import { Foo, Bar as Baz } from 'module'\n const namedImportPattern = /import\\s*\\{([^}]+)\\}\\s*from/g;\n let match: RegExpExecArray | null;\n\n while ((match = namedImportPattern.exec(content)) !== null) {\n const importList = match[1];\n const identifiers = importList.split(\",\").map((s) => s.trim());\n\n for (const id of identifiers) {\n const parts = id.split(/\\s+as\\s+/);\n const name = parts[0].trim();\n\n // Only extract PascalCase identifiers\n if (/^[A-Z][a-zA-Z0-9]*$/.test(name) && !seen.has(name.toLowerCase())) {\n seen.add(name.toLowerCase());\n literals.push({\n value: name,\n type: \"className\",\n matchType: \"import\",\n vocabulary: extractVocabulary(name),\n });\n }\n }\n }\n\n // Default imports: import Foo from 'module'\n const defaultImportPattern = /import\\s+([A-Z][a-zA-Z0-9]*)\\s+from/g;\n while ((match = defaultImportPattern.exec(content)) !== null) {\n if (!seen.has(match[1].toLowerCase())) {\n seen.add(match[1].toLowerCase());\n literals.push({\n value: match[1],\n type: \"className\",\n matchType: \"import\",\n vocabulary: extractVocabulary(match[1]),\n });\n }\n }\n\n return literals;\n}\n\n/**\n * Extract type reference literals (extends, implements).\n */\nfunction extractTypeReferences(\n content: string,\n chunkName?: string\n): ExtractedLiteral[] {\n const literals: ExtractedLiteral[] = [];\n const seen = new Set<string>();\n\n if (chunkName) {\n seen.add(chunkName.toLowerCase());\n }\n\n // Match: extends Foo, implements Bar\n const extendsPattern = /(?:extends|implements)\\s+([A-Z][a-zA-Z0-9]*)/g;\n let match: RegExpExecArray | null;\n\n while ((match = extendsPattern.exec(content)) !== null) {\n const value = match[1];\n if (!seen.has(value.toLowerCase()) && !isBuiltInType(value)) {\n seen.add(value.toLowerCase());\n literals.push({\n value,\n type: \"className\",\n matchType: \"reference\",\n vocabulary: extractVocabulary(value),\n });\n }\n }\n\n return literals;\n}\n\n/**\n * Check if a type name is a built-in TypeScript type.\n */\nfunction isBuiltInType(name: string): boolean {\n const builtIns = new Set([\n \"String\",\n \"Number\",\n \"Boolean\",\n \"Object\",\n \"Array\",\n \"Function\",\n \"Symbol\",\n \"BigInt\",\n \"Promise\",\n \"Map\",\n \"Set\",\n \"WeakMap\",\n \"WeakSet\",\n \"Date\",\n \"RegExp\",\n \"Error\",\n \"Partial\",\n \"Required\",\n \"Readonly\",\n \"Record\",\n \"Pick\",\n \"Omit\",\n \"Exclude\",\n \"Extract\",\n \"NonNullable\",\n \"ReturnType\",\n \"InstanceType\",\n \"Parameters\",\n \"ConstructorParameters\",\n \"Awaited\",\n ]);\n return builtIns.has(name);\n}\n",
39
- "/**\n * Literal Scorer\n *\n * Calculates multiplicative score boosts for literal matches.\n * Implements the three-source merge strategy for literal boosting.\n *\n * This is a pure domain service with no external dependencies.\n */\n\nimport type {\n LiteralMatch,\n LiteralMatchType,\n LiteralConfidence,\n LITERAL_SCORING,\n} from \"../entities/literal\";\n\n/**\n * Scoring constants for literal boosting.\n */\nexport const LITERAL_SCORING_CONSTANTS = {\n /** Base score for chunks found only via literal index */\n BASE_SCORE: 0.5,\n\n /** Multipliers by match type and confidence */\n MULTIPLIERS: {\n definition: { high: 2.5, medium: 2.0, low: 1.5 },\n reference: { high: 2.0, medium: 1.5, low: 1.3 },\n import: { high: 1.5, medium: 1.3, low: 1.1 },\n } as Record<LiteralMatchType, Record<LiteralConfidence, number>>,\n\n /** Vocabulary match scoring */\n VOCABULARY: {\n /** Base multiplier for vocabulary-only matches (no exact literal match) */\n BASE_MULTIPLIER: 1.3,\n /** Bonus per additional vocabulary word matched (up to a limit) */\n PER_WORD_BONUS: 0.1,\n /** Maximum vocabulary bonus */\n MAX_VOCABULARY_BONUS: 0.5,\n /** Minimum vocabulary words required for a match to count */\n MIN_WORDS_FOR_MATCH: 2,\n },\n};\n\n/**\n * Calculate the literal multiplier for a given match type and confidence.\n *\n * @param matchType - How the chunk relates to the literal (definition/reference/import)\n * @param confidence - Detection confidence of the query literal\n * @returns Multiplier to apply to the base score\n */\nexport function calculateLiteralMultiplier(\n matchType: LiteralMatchType,\n confidence: LiteralConfidence\n): number {\n return LITERAL_SCORING_CONSTANTS.MULTIPLIERS[matchType][confidence];\n}\n\n/**\n * Calculate the maximum multiplier for a set of literal matches.\n *\n * When a chunk has multiple literal matches, use the highest multiplier.\n *\n * @param matches - Array of literal matches for a chunk\n * @returns The maximum multiplier, or 1.0 if no matches\n */\nexport function calculateMaxMultiplier(matches: LiteralMatch[]): number {\n if (!matches || matches.length === 0) {\n return 1.0;\n }\n\n return Math.max(\n ...matches.map((m) =>\n calculateLiteralMultiplier(\n m.indexedLiteral.matchType,\n m.queryLiteral.confidence\n )\n )\n );\n}\n\n/**\n * Result of vocabulary-based matching.\n */\nexport interface VocabularyMatchResult {\n /** Number of vocabulary words that matched */\n matchedWordCount: number;\n /** The vocabulary words that matched */\n matchedWords: string[];\n /** Multiplier to apply based on vocabulary match */\n multiplier: number;\n /** Whether this is a meaningful match (above threshold) */\n isSignificant: boolean;\n}\n\n/**\n * Calculate vocabulary-based scoring for a chunk.\n *\n * This is used for partial matching when no exact literal match exists.\n * E.g., query \"user authentication\" might match chunk with \"getUserAuth\" literal.\n *\n * @param queryVocabulary - Vocabulary words extracted from the query\n * @param chunkVocabulary - Vocabulary words extracted from chunk literals\n * @returns Vocabulary match result with multiplier\n */\nexport function calculateVocabularyMatch(\n queryVocabulary: string[],\n chunkVocabulary: string[]\n): VocabularyMatchResult {\n if (\n !queryVocabulary ||\n queryVocabulary.length === 0 ||\n !chunkVocabulary ||\n chunkVocabulary.length === 0\n ) {\n return {\n matchedWordCount: 0,\n matchedWords: [],\n multiplier: 1.0,\n isSignificant: false,\n };\n }\n\n // Find matching vocabulary words\n const querySet = new Set(queryVocabulary.map((w) => w.toLowerCase()));\n const matchedWords: string[] = [];\n\n for (const word of chunkVocabulary) {\n if (querySet.has(word.toLowerCase())) {\n matchedWords.push(word);\n }\n }\n\n const matchedWordCount = matchedWords.length;\n\n // Check if match is significant\n const isSignificant =\n matchedWordCount >= LITERAL_SCORING_CONSTANTS.VOCABULARY.MIN_WORDS_FOR_MATCH;\n\n // Calculate multiplier\n let multiplier = 1.0;\n if (isSignificant) {\n multiplier = LITERAL_SCORING_CONSTANTS.VOCABULARY.BASE_MULTIPLIER;\n // Add bonus for additional words (above minimum)\n const extraWords =\n matchedWordCount - LITERAL_SCORING_CONSTANTS.VOCABULARY.MIN_WORDS_FOR_MATCH;\n const bonus = Math.min(\n extraWords * LITERAL_SCORING_CONSTANTS.VOCABULARY.PER_WORD_BONUS,\n LITERAL_SCORING_CONSTANTS.VOCABULARY.MAX_VOCABULARY_BONUS\n );\n multiplier += bonus;\n }\n\n return {\n matchedWordCount,\n matchedWords,\n multiplier,\n isSignificant,\n };\n}\n\n/**\n * Score contribution from literal matches.\n * Used for debugging and explainability.\n */\nexport interface LiteralScoreContribution {\n /** The multiplier applied */\n multiplier: number;\n\n /** Whether this is a literal-only match (not found by semantic/BM25) */\n literalOnly: boolean;\n\n /** Match type of the best match */\n bestMatchType?: LiteralMatchType;\n\n /** Confidence of the best match */\n bestConfidence?: LiteralConfidence;\n\n /** Number of literal matches */\n matchCount: number;\n}\n\n/**\n * Calculate the literal score contribution for a chunk.\n *\n * @param matches - Literal matches for the chunk (may be empty)\n * @param hasSemanticOrBm25 - Whether the chunk was found by semantic or BM25 search\n * @returns Score contribution details\n */\nexport function calculateLiteralContribution(\n matches: LiteralMatch[],\n hasSemanticOrBm25: boolean\n): LiteralScoreContribution {\n if (!matches || matches.length === 0) {\n return {\n multiplier: 1.0,\n literalOnly: false,\n matchCount: 0,\n };\n }\n\n // Find the best match (highest multiplier)\n let bestMatch: LiteralMatch | null = null;\n let bestMultiplier = 0;\n\n for (const match of matches) {\n const mult = calculateLiteralMultiplier(\n match.indexedLiteral.matchType,\n match.queryLiteral.confidence\n );\n if (mult > bestMultiplier) {\n bestMultiplier = mult;\n bestMatch = match;\n }\n }\n\n return {\n multiplier: bestMultiplier,\n literalOnly: !hasSemanticOrBm25,\n bestMatchType: bestMatch?.indexedLiteral.matchType,\n bestConfidence: bestMatch?.queryLiteral.confidence,\n matchCount: matches.length,\n };\n}\n\n/**\n * Apply literal boosting to a base score.\n *\n * Scoring rules:\n * - If chunk has both semantic/BM25 and literal match: multiply base by multiplier\n * - If chunk has only literal match: use BASE_SCORE\n * - If chunk has no literal match: use base score as-is\n *\n * @param baseScore - Score from semantic/BM25 search (0 if not found)\n * @param matches - Literal matches for the chunk\n * @param hasSemanticOrBm25 - Whether the chunk was found by semantic or BM25\n * @returns Final score after literal boosting\n */\nexport function applyLiteralBoost(\n baseScore: number,\n matches: LiteralMatch[],\n hasSemanticOrBm25: boolean\n): number {\n // No literal matches - return base score\n if (!matches || matches.length === 0) {\n return baseScore;\n }\n\n const multiplier = calculateMaxMultiplier(matches);\n\n // Literal match but no semantic/BM25 - use base score\n if (!hasSemanticOrBm25) {\n return LITERAL_SCORING_CONSTANTS.BASE_SCORE * multiplier;\n }\n\n // Has both - multiply the base score\n return baseScore * multiplier;\n}\n\n/**\n * Merge results from three search sources with literal boosting.\n *\n * @param semanticBm25Results - Results from semantic and BM25 search\n * @param literalMatches - Map from chunk ID to literal matches\n * @returns Results with literal boosting applied\n */\nexport interface MergeInput {\n /** Chunk ID */\n chunkId: string;\n /** Score from semantic/BM25 search */\n baseScore: number;\n}\n\nexport interface MergeOutput extends MergeInput {\n /** Final score after literal boosting */\n finalScore: number;\n /** Literal contribution details */\n literalContribution: LiteralScoreContribution;\n}\n\nexport function mergeWithLiteralBoost(\n semanticBm25Results: MergeInput[],\n literalMatchMap: Map<string, LiteralMatch[]>\n): MergeOutput[] {\n const results: MergeOutput[] = [];\n const processedChunks = new Set<string>();\n\n // Process results that have semantic/BM25 scores\n for (const result of semanticBm25Results) {\n const matches = literalMatchMap.get(result.chunkId) || [];\n const contribution = calculateLiteralContribution(matches, true);\n const finalScore = applyLiteralBoost(result.baseScore, matches, true);\n\n results.push({\n ...result,\n finalScore,\n literalContribution: contribution,\n });\n processedChunks.add(result.chunkId);\n }\n\n // Add literal-only results (not found by semantic/BM25)\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunks.has(chunkId)) {\n continue;\n }\n\n const contribution = calculateLiteralContribution(matches, false);\n const finalScore = applyLiteralBoost(0, matches, false);\n\n results.push({\n chunkId,\n baseScore: 0,\n finalScore,\n literalContribution: contribution,\n });\n }\n\n return results;\n}\n",
42
+ "/**\n * Literal Scorer\n *\n * Calculates multiplicative score boosts for literal matches.\n * Implements the three-source merge strategy for literal boosting.\n *\n * This is a pure domain service with no external dependencies.\n */\n\nimport type { LiteralMatch, LiteralMatchType, LiteralConfidence } from \"../entities/literal\";\nimport type { LiteralBoostWeights } from \"../entities/rankingWeights\";\nimport { DEFAULT_RANKING_WEIGHTS } from \"../entities/rankingWeights\";\n\nconst DEFAULT_LW: LiteralBoostWeights = DEFAULT_RANKING_WEIGHTS.literal;\n\n/**\n * Scoring constants for literal boosting.\n * @deprecated Prefer {@link DEFAULT_LITERAL_BOOST_WEIGHTS} / `rankingWeights.literal` from search options.\n */\nexport const LITERAL_SCORING_CONSTANTS: LiteralBoostWeights = DEFAULT_LW;\n\n/**\n * Calculate the literal multiplier for a given match type and confidence.\n *\n * @param matchType - How the chunk relates to the literal (definition/reference/import)\n * @param confidence - Detection confidence of the query literal\n * @returns Multiplier to apply to the base score\n */\nexport function calculateLiteralMultiplier(\n matchType: LiteralMatchType,\n confidence: LiteralConfidence,\n weights: LiteralBoostWeights = DEFAULT_LW\n): number {\n return weights.multipliers[matchType][confidence];\n}\n\n/**\n * Calculate the maximum multiplier for a set of literal matches.\n *\n * When a chunk has multiple literal matches, use the highest multiplier.\n *\n * @param matches - Array of literal matches for a chunk\n * @returns The maximum multiplier, or 1.0 if no matches\n */\nexport function calculateMaxMultiplier(\n matches: LiteralMatch[],\n weights: LiteralBoostWeights = DEFAULT_LW\n): number {\n if (!matches || matches.length === 0) {\n return 1.0;\n }\n\n return Math.max(\n ...matches.map((m) =>\n calculateLiteralMultiplier(\n m.indexedLiteral.matchType,\n m.queryLiteral.confidence,\n weights\n )\n )\n );\n}\n\n/**\n * Result of vocabulary-based matching.\n */\nexport interface VocabularyMatchResult {\n /** Number of vocabulary words that matched */\n matchedWordCount: number;\n /** The vocabulary words that matched */\n matchedWords: string[];\n /** Multiplier to apply based on vocabulary match */\n multiplier: number;\n /** Whether this is a meaningful match (above threshold) */\n isSignificant: boolean;\n}\n\n/**\n * Calculate vocabulary-based scoring for a chunk.\n *\n * This is used for partial matching when no exact literal match exists.\n * E.g., query \"user authentication\" might match chunk with \"getUserAuth\" literal.\n *\n * @param queryVocabulary - Vocabulary words extracted from the query\n * @param chunkVocabulary - Vocabulary words extracted from chunk literals\n * @returns Vocabulary match result with multiplier\n */\nexport function calculateVocabularyMatch(\n queryVocabulary: string[],\n chunkVocabulary: string[],\n weights: LiteralBoostWeights = DEFAULT_LW\n): VocabularyMatchResult {\n const voc = weights.vocabulary;\n\n if (\n !queryVocabulary ||\n queryVocabulary.length === 0 ||\n !chunkVocabulary ||\n chunkVocabulary.length === 0\n ) {\n return {\n matchedWordCount: 0,\n matchedWords: [],\n multiplier: 1.0,\n isSignificant: false,\n };\n }\n\n // Find matching vocabulary words\n const querySet = new Set(queryVocabulary.map((w) => w.toLowerCase()));\n const matchedWords: string[] = [];\n\n for (const word of chunkVocabulary) {\n if (querySet.has(word.toLowerCase())) {\n matchedWords.push(word);\n }\n }\n\n const matchedWordCount = matchedWords.length;\n\n // Check if match is significant\n const isSignificant = matchedWordCount >= voc.minWordsForMatch;\n\n // Calculate multiplier\n let multiplier = 1.0;\n if (isSignificant) {\n multiplier = voc.baseMultiplier;\n // Add bonus for additional words (above minimum)\n const extraWords = matchedWordCount - voc.minWordsForMatch;\n const bonus = Math.min(\n extraWords * voc.perWordBonus,\n voc.maxVocabularyBonus\n );\n multiplier += bonus;\n }\n\n return {\n matchedWordCount,\n matchedWords,\n multiplier,\n isSignificant,\n };\n}\n\n/**\n * Score contribution from literal matches.\n * Used for debugging and explainability.\n */\nexport interface LiteralScoreContribution {\n /** The multiplier applied */\n multiplier: number;\n\n /** Whether this is a literal-only match (not found by semantic/BM25) */\n literalOnly: boolean;\n\n /** Match type of the best match */\n bestMatchType?: LiteralMatchType;\n\n /** Confidence of the best match */\n bestConfidence?: LiteralConfidence;\n\n /** Number of literal matches */\n matchCount: number;\n}\n\n/**\n * Calculate the literal score contribution for a chunk.\n *\n * @param matches - Literal matches for the chunk (may be empty)\n * @param hasSemanticOrBm25 - Whether the chunk was found by semantic or BM25 search\n * @returns Score contribution details\n */\nexport function calculateLiteralContribution(\n matches: LiteralMatch[],\n hasSemanticOrBm25: boolean,\n weights: LiteralBoostWeights = DEFAULT_LW\n): LiteralScoreContribution {\n if (!matches || matches.length === 0) {\n return {\n multiplier: 1.0,\n literalOnly: false,\n matchCount: 0,\n };\n }\n\n // Find the best match (highest multiplier)\n let bestMatch: LiteralMatch | null = null;\n let bestMultiplier = 0;\n\n for (const match of matches) {\n const mult = calculateLiteralMultiplier(\n match.indexedLiteral.matchType,\n match.queryLiteral.confidence,\n weights\n );\n if (mult > bestMultiplier) {\n bestMultiplier = mult;\n bestMatch = match;\n }\n }\n\n return {\n multiplier: bestMultiplier,\n literalOnly: !hasSemanticOrBm25,\n bestMatchType: bestMatch?.indexedLiteral.matchType,\n bestConfidence: bestMatch?.queryLiteral.confidence,\n matchCount: matches.length,\n };\n}\n\n/**\n * Apply literal boosting to a base score.\n *\n * Scoring rules:\n * - If chunk has both semantic/BM25 and literal match: multiply base by multiplier\n * - If chunk has only literal match: use BASE_SCORE\n * - If chunk has no literal match: use base score as-is\n *\n * @param baseScore - Score from semantic/BM25 search (0 if not found)\n * @param matches - Literal matches for the chunk\n * @param hasSemanticOrBm25 - Whether the chunk was found by semantic or BM25\n * @returns Final score after literal boosting\n */\nexport function applyLiteralBoost(\n baseScore: number,\n matches: LiteralMatch[],\n hasSemanticOrBm25: boolean,\n weights: LiteralBoostWeights = DEFAULT_LW\n): number {\n // No literal matches - return base score\n if (!matches || matches.length === 0) {\n return baseScore;\n }\n\n const multiplier = calculateMaxMultiplier(matches, weights);\n\n // Literal match but no semantic/BM25 - use base score\n if (!hasSemanticOrBm25) {\n return weights.baseScore * multiplier;\n }\n\n // Has both - multiply the base score\n return baseScore * multiplier;\n}\n\n/**\n * Merge results from three search sources with literal boosting.\n *\n * @param semanticBm25Results - Results from semantic and BM25 search\n * @param literalMatches - Map from chunk ID to literal matches\n * @returns Results with literal boosting applied\n */\nexport interface MergeInput {\n /** Chunk ID */\n chunkId: string;\n /** Score from semantic/BM25 search */\n baseScore: number;\n}\n\nexport interface MergeOutput extends MergeInput {\n /** Final score after literal boosting */\n finalScore: number;\n /** Literal contribution details */\n literalContribution: LiteralScoreContribution;\n}\n\nexport function mergeWithLiteralBoost(\n semanticBm25Results: MergeInput[],\n literalMatchMap: Map<string, LiteralMatch[]>,\n weights: LiteralBoostWeights = DEFAULT_LW\n): MergeOutput[] {\n const results: MergeOutput[] = [];\n const processedChunks = new Set<string>();\n\n // Process results that have semantic/BM25 scores\n for (const result of semanticBm25Results) {\n const matches = literalMatchMap.get(result.chunkId) || [];\n const contribution = calculateLiteralContribution(matches, true, weights);\n const finalScore = applyLiteralBoost(\n result.baseScore,\n matches,\n true,\n weights\n );\n\n results.push({\n ...result,\n finalScore,\n literalContribution: contribution,\n });\n processedChunks.add(result.chunkId);\n }\n\n // Add literal-only results (not found by semantic/BM25)\n for (const [chunkId, matches] of literalMatchMap) {\n if (processedChunks.has(chunkId)) {\n continue;\n }\n\n const contribution = calculateLiteralContribution(\n matches,\n false,\n weights\n );\n const finalScore = applyLiteralBoost(0, matches, false, weights);\n\n results.push({\n chunkId,\n baseScore: 0,\n finalScore,\n literalContribution: contribution,\n });\n }\n\n return results;\n}\n",
40
43
  "/**\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",
41
44
  "/**\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",
42
45
  "/**\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",
43
46
  "/**\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",
44
47
  "/**\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",
45
- "/**\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",
48
+ "/**\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// Discriminative term re-ranking (BM25 IDF–guided)\nexport {\n scoreDiscriminativeTerms,\n DISCRIMINATIVE_CONSTANTS,\n type DiscriminativeTermResult,\n} from \"./discriminativeTerms\";\n\nexport {\n attachMatchScales,\n compareSearchResultsByRankBy,\n clamp01,\n semanticPctFromCosine,\n} from \"./matchScales\";\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",
46
49
  "/**\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",
47
50
  "/**\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';\nimport { RAGGREP_INDEX_DIR } from '../config';\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_INDEX_DIR) {\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",
48
51
  "/**\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",
49
52
  "/**\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",
50
53
  "/**\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",
51
- "/**\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",
54
+ "/**\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 // 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 scoreDiscriminativeTerms,\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\";\nimport { mergeRankingWeights } 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/** 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 const rw = mergeRankingWeights(options.rankingWeights);\n const tw = rw.typescript;\n const lt = rw.literal;\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 tw.semantic * semanticScore +\n tw.bm25 * bm25Score +\n tw.vocab * vocabScore;\n\n // Apply literal boosting (multiplicative)\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true, // hasSemanticOrBm25\n lt\n );\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n true,\n lt\n );\n\n // Final score = boosted base score + additive boosts\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunk.id);\n\n if (\n adjustedScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0 ||\n vocabScore > tw.vocabBypassThreshold || // 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: adjustedScore,\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 discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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 lt\n );\n\n const baseScore =\n semanticScore > 0\n ? tw.semantic * semanticScore +\n tw.bm25 * bm25Score +\n tw.vocab * vocabScore\n : lt.baseScore;\n\n const boostedScore = applyLiteralBoost(\n baseScore,\n chunkLiteralMatches,\n semanticScore > 0,\n lt\n );\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: adjustedScore,\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 discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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",
52
55
  "/**\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",
53
56
  "/**\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",
54
57
  "/**\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",
55
58
  "/**\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",
56
59
  "/**\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",
57
- "/**\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",
58
- "/**\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",
59
- "/**\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",
60
- "/**\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",
61
- "/**\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",
60
+ "/**\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 expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n scoreDiscriminativeTerms,\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\";\nimport { mergeRankingWeights } 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/** 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 rw = mergeRankingWeights(options.rankingWeights);\n const lw = rw.language;\n const lt = rw.literal;\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 lw.semantic * semanticScore + lw.bm25 * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true,\n lt\n );\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n true,\n lt\n );\n\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunk.id);\n\n if (\n adjustedScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: adjustedScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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, lt);\n\n const baseScore =\n semanticScore > 0\n ? lw.semantic * semanticScore + lw.bm25 * bm25Score\n : lt.baseScore;\n\n const boostedScore = applyLiteralBoost(\n baseScore,\n matches,\n semanticScore > 0,\n lt\n );\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunkId);\n\n results.push({\n filepath,\n chunk,\n score: adjustedScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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",
61
+ "/**\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 expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n scoreDiscriminativeTerms,\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\";\nimport { mergeRankingWeights } 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/** 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 rw = mergeRankingWeights(options.rankingWeights);\n const lw = rw.language;\n const lt = rw.literal;\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 lw.semantic * semanticScore + lw.bm25 * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true,\n lt\n );\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n true,\n lt\n );\n\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunk.id);\n\n if (\n adjustedScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: adjustedScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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",
62
+ "/**\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 expandQuery,\n // Path context injection (unified utility)\n prepareChunkForEmbedding,\n scoreDiscriminativeTerms,\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\";\nimport { mergeRankingWeights } 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/** 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 rw = mergeRankingWeights(options.rankingWeights);\n const lw = rw.language;\n const lt = rw.literal;\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 lw.semantic * semanticScore + lw.bm25 * bm25Score;\n\n const literalMatches = literalMatchMap.get(chunk.id) || [];\n const literalContribution = calculateLiteralContribution(\n literalMatches,\n true,\n lt\n );\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n true,\n lt\n );\n\n const finalScore = boostedScore + additiveBoost;\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const adjustedScore = (finalScore + disc.boost) * disc.penaltyFactor;\n\n processedChunkIds.add(chunk.id);\n\n if (\n adjustedScore >= minScore ||\n bm25Score > 0.3 ||\n literalMatches.length > 0\n ) {\n results.push({\n filepath,\n chunk,\n score: adjustedScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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",
63
+ "/**\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 // 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\";\nimport { mergeRankingWeights } 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/** 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 const rw = mergeRankingWeights(options.rankingWeights);\n const jw = rw.json;\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 = jw.bm25 * bm25Score;\n\n // Apply literal boosting\n const boostedScore = applyLiteralBoost(\n baseScore,\n literalMatches,\n bm25Score > 0,\n rw.literal\n );\n\n // Add literal contribution if no BM25 score\n const literalBase =\n literalMatches.length > 0 && bm25Score === 0\n ? rw.literal.baseScore * jw.literalBaseWeight\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 = rw.literal.baseScore * 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",
64
+ "/**\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 scoreDiscriminativeTerms,\n extractPathKeywordsForFileSummary,\n getPathContextForFileSummary,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { mergeRankingWeights } from \"../../../domain/entities\";\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/**\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 rw = mergeRankingWeights(options.rankingWeights);\n const mw = rw.markdown;\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 = mw.docIntentBoost;\n }\n\n const rawHeadingBoost = calculateHeadingLevelBoost(chunk);\n const headingBoost =\n rawHeadingBoost *\n (mw.headingPhraseCoverageMin +\n mw.headingPhraseCoverageSpan *\n (phraseMatch.totalTokenCount > 0 ? phraseMatch.coverage : 1));\n\n const hybridScore =\n mw.semantic * semanticScore +\n mw.bm25 * bm25Score +\n docBoost +\n headingBoost +\n phraseMatch.boost; // Add phrase match boost\n\n const disc = scoreDiscriminativeTerms(\n bm25Index,\n query,\n chunk.content,\n chunk.name,\n rw.discriminative\n );\n const finalScore = (hybridScore + disc.boost) * disc.penaltyFactor;\n\n if (\n finalScore >= 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: finalScore,\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 discriminativeCoverage: disc.salientCoverage,\n discriminativePenaltyFactor: disc.penaltyFactor,\n discriminativeBoost: disc.boost,\n matchedSalientTerms: disc.matchedSalient,\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",
62
65
  "// 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",
63
66
  "/**\n * Project Structure Detection\n *\n * Auto-detects monorepo structure and project types from:\n * - Folder layout (apps/, packages/, etc.)\n * - package.json files (for TypeScript/JavaScript projects)\n *\n * This module performs file I/O to scan the filesystem.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type {\n Project,\n ProjectType,\n ProjectStructure,\n} from \"../../domain/entities/introspection\";\n\n/** Maximum depth to scan for package.json files */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Directories to skip when scanning for package.json */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".raggrep\",\n]);\n\n/**\n * Parsed information from a package.json file.\n */\ninterface PackageJsonInfo {\n name: string;\n relativePath: string;\n type: ProjectType;\n hasWorkspaces: boolean;\n}\n\n/**\n * Scan for package.json files and extract project info.\n */\nasync function scanForPackageJsons(\n rootDir: string,\n currentDir: string = \"\",\n depth: number = 0\n): Promise<PackageJsonInfo[]> {\n if (depth > MAX_SCAN_DEPTH) return [];\n\n const results: PackageJsonInfo[] = [];\n const fullDir = currentDir ? path.join(rootDir, currentDir) : rootDir;\n\n try {\n const entries = await fs.readdir(fullDir, { withFileTypes: true });\n\n // Check for package.json in current directory\n const hasPackageJson = entries.some(\n (e) => e.isFile() && e.name === \"package.json\"\n );\n\n if (hasPackageJson && currentDir) {\n const info = await parsePackageJson(rootDir, currentDir);\n if (info) results.push(info);\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const subPath = currentDir ? `${currentDir}/${entry.name}` : entry.name;\n const subResults = await scanForPackageJsons(rootDir, subPath, depth + 1);\n results.push(...subResults);\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Parse a package.json file and extract project metadata.\n */\nasync function parsePackageJson(\n rootDir: string,\n relativePath: string\n): Promise<PackageJsonInfo | null> {\n try {\n const packageJsonPath = path.join(rootDir, relativePath, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n const name = pkg.name || path.basename(relativePath);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n let type: ProjectType = \"unknown\";\n\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"] || deps[\"svelte\"]) {\n type = \"app\";\n } else if (\n deps[\"express\"] ||\n deps[\"fastify\"] ||\n deps[\"koa\"] ||\n deps[\"hono\"]\n ) {\n type = \"service\";\n } else if (pkg.main || pkg.exports) {\n type = \"library\";\n }\n\n const hasWorkspaces = Boolean(pkg.workspaces);\n return { name, relativePath, type, hasWorkspaces };\n } catch {\n return null;\n }\n}\n\n/**\n * Get project type from pattern directory name.\n */\nfunction getProjectType(patternDir: string): ProjectType {\n switch (patternDir) {\n case \"apps\":\n return \"app\";\n case \"packages\":\n case \"libs\":\n return \"library\";\n case \"services\":\n return \"service\";\n case \"scripts\":\n case \"tools\":\n return \"script\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Detect project structure in a workspace.\n *\n * Uses two strategies:\n * 1. Folder pattern detection (apps/, packages/, etc.)\n * 2. package.json scanning for more accurate project boundaries\n */\nexport async function detectProjectStructure(\n rootDir: string\n): Promise<ProjectStructure> {\n const projectMap = new Map<string, Project>();\n let isMonorepo = false;\n\n try {\n const entries = await fs.readdir(rootDir, { withFileTypes: true });\n const dirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n // Strategy 1: Check for standard monorepo patterns\n const monorepoPatterns = [\"apps\", \"packages\", \"libs\", \"services\"];\n const hasMonorepoStructure = monorepoPatterns.some((p) =>\n dirNames.includes(p)\n );\n\n if (hasMonorepoStructure) {\n isMonorepo = true;\n\n for (const pattern of monorepoPatterns) {\n if (!dirNames.includes(pattern)) continue;\n\n const patternDir = path.join(rootDir, pattern);\n try {\n const subDirs = await fs.readdir(patternDir, { withFileTypes: true });\n\n for (const subDir of subDirs) {\n if (!subDir.isDirectory()) continue;\n\n const projectRoot = `${pattern}/${subDir.name}`;\n const type = getProjectType(pattern);\n\n projectMap.set(projectRoot, {\n name: subDir.name,\n root: projectRoot,\n type,\n });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n }\n\n // Strategy 2: Scan for package.json files\n const packageJsons = await scanForPackageJsons(rootDir);\n\n for (const pkg of packageJsons) {\n if (pkg.hasWorkspaces) isMonorepo = true;\n if (packageJsons.length > 1) isMonorepo = true;\n\n projectMap.set(pkg.relativePath, {\n name: pkg.name,\n root: pkg.relativePath,\n type: pkg.type,\n });\n }\n\n // Check root package.json\n let rootType: ProjectType = \"unknown\";\n try {\n const rootPkgPath = path.join(rootDir, \"package.json\");\n const rootPkg = JSON.parse(await fs.readFile(rootPkgPath, \"utf-8\"));\n\n if (rootPkg.workspaces) isMonorepo = true;\n\n const deps = { ...rootPkg.dependencies, ...rootPkg.devDependencies };\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"]) {\n rootType = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"]) {\n rootType = \"service\";\n }\n } catch {\n // No package.json\n }\n\n const projects = Array.from(projectMap.values()).sort(\n (a, b) => a.root.length - b.root.length\n );\n\n return {\n projects,\n isMonorepo,\n rootType: isMonorepo ? undefined : rootType,\n };\n } catch {\n return {\n projects: [],\n isMonorepo: false,\n rootType: \"unknown\",\n };\n }\n}\n\n\n\n\n\n\n\n\n",
64
67
  "/**\n * Introspection Index Storage\n *\n * Manages file metadata for context-aware search boosting.\n * Handles saving and loading introspection data to/from disk.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as fsSync from \"fs\";\nimport type {\n FileIntrospection,\n ProjectStructure,\n IntrospectionConfig,\n Scope,\n Config,\n} from \"../../domain/entities\";\nimport { detectProjectStructure } from \"./projectDetector\";\nimport { introspectFile } from \"../../domain/services/introspection\";\nimport { getRaggrepDir } from \"../config\";\n\n/**\n * Introspection index for a workspace.\n */\nexport class IntrospectionIndex {\n private rootDir: string;\n private structure: ProjectStructure | null = null;\n private files: Map<string, FileIntrospection> = new Map();\n private config: IntrospectionConfig = {};\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /**\n * Initialize by detecting project structure.\n */\n async initialize(): Promise<void> {\n this.structure = await detectProjectStructure(this.rootDir);\n\n // Try to load config overrides\n try {\n const configPath = path.join(this.rootDir, \".raggrep\", \"config.json\");\n const configContent = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(configContent);\n this.config = config.introspection || {};\n } catch {\n // No config or introspection section\n }\n }\n\n /**\n * Get project structure.\n */\n getStructure(): ProjectStructure | null {\n return this.structure;\n }\n\n /**\n * Introspect a file and add to index.\n *\n * @param filepath - Relative file path\n * @param content - Optional file content for framework detection\n * @param enableReadmeContext - Whether to look for README files (default: true)\n */\n addFile(\n filepath: string,\n content?: string,\n enableReadmeContext = true\n ): FileIntrospection {\n if (!this.structure) {\n throw new Error(\"IntrospectionIndex not initialized\");\n }\n\n // Create a file existence checker for README discovery\n const fileExists = enableReadmeContext\n ? (relativePath: string) => {\n try {\n const absolutePath = path.join(this.rootDir, relativePath);\n return fsSync.existsSync(absolutePath);\n } catch {\n return false;\n }\n }\n : undefined;\n\n const intro = introspectFile(filepath, this.structure, {\n fileContent: content,\n fileExists,\n });\n\n // Apply config overrides\n this.applyOverrides(intro);\n\n this.files.set(filepath, intro);\n return intro;\n }\n\n /**\n * Get introspection for a file.\n */\n getFile(filepath: string): FileIntrospection | undefined {\n return this.files.get(filepath);\n }\n\n /**\n * Get all introspected files.\n */\n getAllFiles(): FileIntrospection[] {\n return Array.from(this.files.values());\n }\n\n /**\n * Apply config overrides to introspection.\n */\n private applyOverrides(intro: FileIntrospection): void {\n if (!this.config.projects) return;\n\n for (const [projectPath, overrides] of Object.entries(\n this.config.projects\n )) {\n if (\n intro.filepath.startsWith(projectPath + \"/\") ||\n intro.project.root === projectPath\n ) {\n if (overrides.scope) {\n intro.scope = overrides.scope as Scope;\n }\n if (overrides.framework) {\n intro.framework = overrides.framework;\n }\n break;\n }\n }\n }\n\n /**\n * Save introspection index to disk.\n */\n async save(config: Config): Promise<void> {\n const introDir = path.join(\n getRaggrepDir(this.rootDir, config),\n \"introspection\"\n );\n await fs.mkdir(introDir, { recursive: true });\n\n // Save project structure\n const projectPath = path.join(introDir, \"_project.json\");\n await fs.writeFile(\n projectPath,\n JSON.stringify(\n {\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n structure: this.structure,\n },\n null,\n 2\n )\n );\n\n // Save file introspections in directory structure\n for (const [filepath, intro] of this.files) {\n const introFilePath = path.join(\n introDir,\n \"files\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n await fs.mkdir(path.dirname(introFilePath), { recursive: true });\n await fs.writeFile(introFilePath, JSON.stringify(intro, null, 2));\n }\n }\n\n /**\n * Load introspection index from disk.\n */\n async load(config: Config): Promise<void> {\n const introDir = path.join(\n getRaggrepDir(this.rootDir, config),\n \"introspection\"\n );\n\n try {\n // Load project structure\n const projectPath = path.join(introDir, \"_project.json\");\n const projectContent = await fs.readFile(projectPath, \"utf-8\");\n const projectData = JSON.parse(projectContent);\n this.structure = projectData.structure;\n\n // Load file introspections\n await this.loadFilesRecursive(path.join(introDir, \"files\"), \"\");\n } catch {\n // No introspection index yet\n this.structure = null;\n this.files.clear();\n }\n }\n\n /**\n * Recursively load file introspections.\n */\n private async loadFilesRecursive(\n basePath: string,\n prefix: string\n ): Promise<void> {\n try {\n const entries = await fs.readdir(basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(basePath, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n await this.loadFilesRecursive(entryPath, relativePath);\n } else if (entry.name.endsWith(\".json\")) {\n const content = await fs.readFile(entryPath, \"utf-8\");\n const intro: FileIntrospection = JSON.parse(content);\n this.files.set(intro.filepath, intro);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.files.clear();\n this.structure = null;\n }\n}\n",
@@ -73,18 +76,18 @@
73
76
  "// 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",
74
77
  "/**\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",
75
78
  "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",
76
- "/**\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",
79
+ "/**\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 RankBy,\n Config,\n ModuleConfig,\n // Exact match types\n ExactMatchOccurrence,\n ExactMatchFile,\n ExactMatchResults,\n HybridSearchResults,\n RankingWeightsPartial,\n RankingWeightsConfig,\n LiteralBoostWeights,\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",
77
80
  "/**\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",
78
81
  "/**\n * Application Use Cases\n * \n * Business logic orchestration layer.\n * Use cases coordinate domain entities and infrastructure services.\n */\n\n// Index Directory\nexport { \n indexDirectory, \n type IndexResult, \n type IndexDirectoryOptions, \n type IndexDirectoryDependencies \n} from './indexDirectory';\n\n// Search Index\nexport { \n searchIndex, \n formatSearchResults,\n type SearchIndexOptions, \n type SearchIndexDependencies \n} from './searchIndex';\n\n// Cleanup Index\nexport { \n cleanupIndex, \n type CleanupResult, \n type CleanupIndexOptions, \n type CleanupIndexDependencies \n} from './cleanupIndex';\n\n// Exact Search\nexport {\n executeExactSearch,\n matchesPathFilter,\n type ExactSearchOptions,\n} from './exactSearch';\n",
79
82
  "/**\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",
80
83
  "/**\n * FileSystem Infrastructure\n */\n\nexport { NodeFileSystem, nodeFileSystem } from './nodeFileSystem';\n\n",
81
- "// 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",
84
+ "// 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 {\n attachMatchScales,\n clamp01,\n compareSearchResultsByRankBy,\n} from \"../../domain/services/matchScales\";\nimport { mergeRankingWeights } from \"../../domain/entities\";\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: Enriched with `semanticMatch` / `structuredMatch` in [0,1]; ordering follows\n * `SearchOptions.rankBy` (default `structured`).\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 if (!options.quiet) {\n console.log(`Searching for: \"${query}\"`);\n }\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 const rw = mergeRankingWeights(options.rankingWeights);\n let ranked = filteredResults.map((r) => attachMatchScales(r, rw));\n\n for (const r of ranked) {\n if (r.context?.exactMatchFusion) {\n r.structuredMatch = clamp01((r.structuredMatch ?? 0) * 1.5);\n }\n }\n\n const rankBy = options.rankBy ?? DEFAULT_SEARCH_OPTIONS.rankBy;\n ranked.sort((a, b) => compareSearchResultsByRankBy(a, b, rankBy));\n\n // Return top K\n const topK = options.topK ?? 10;\n\n return {\n results: ranked.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 const sm =\n result.semanticMatch != null\n ? ` | Semantic: ${(result.semanticMatch * 100).toFixed(1)}%`\n : \"\";\n const st =\n result.structuredMatch != null\n ? ` | Structured: ${(result.structuredMatch * 100).toFixed(1)}%`\n : \"\";\n output += ` Score: ${(result.score * 100).toFixed(1)}%${st}${sm} | 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",
82
85
  "/**\n * OpenCode Version Checker\n * \n * Determines whether to use tool or skill installation based on OpenCode version.\n * \n * Version Compatibility:\n * - OpenCode versions < v1.0.186: Use tool-based installation\n * - OpenCode versions >= v1.0.186: Use skill-based installation\n */\n\nexport interface OpenCodeVersion {\n major: number;\n minor: number;\n patch: number;\n}\n\n/**\n * Parse OpenCode version string into comparable components\n */\nexport function parseOpenCodeVersion(version: string): OpenCodeVersion | null {\n // Handle versions like \"v1.0.186\", \"1.0.186\", \"v1.2.0\", etc.\n const match = version.match(/v?(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n };\n}\n\n/**\n * Check if OpenCode version supports skills (v1.0.186+)\n */\nexport function supportsSkills(version: string): boolean {\n const parsed = parseOpenCodeVersion(version);\n if (!parsed) {\n // If we can't parse the version, assume it supports skills (newer approach)\n return true;\n }\n\n // v1.0.186+ supports skills\n if (parsed.major > 1) return true;\n if (parsed.major === 1 && parsed.minor > 0) return true;\n if (parsed.major === 1 && parsed.minor === 0 && parsed.patch >= 186) return true;\n\n return false;\n}\n\n/**\n * Get installation method recommendation based on OpenCode version\n */\nexport function getInstallationMethod(openCodeVersion?: string): 'tool' | 'skill' {\n if (!openCodeVersion) {\n // If no version specified, default to skill (newer approach)\n return 'skill';\n }\n\n return supportsSkills(openCodeVersion) ? 'skill' : 'tool';\n}\n\n/**\n * Detect OpenCode version by checking common installation locations\n */\nexport async function detectOpenCodeVersion(): Promise<string | null> {\n try {\n const os = await import(\"os\");\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const homeDir = os.homedir();\n \n // Check common OpenCode installation paths\n const possiblePaths = [\n path.join(homeDir, \".local\", \"share\", \"opencode\", \"package.json\"),\n path.join(homeDir, \".config\", \"opencode\", \"package.json\"),\n path.join(homeDir, \".npm\", \"global\", \"node_modules\", \"opencode\", \"package.json\"),\n ];\n\n for (const packagePath of possiblePaths) {\n try {\n const content = await fs.readFile(packagePath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.version) {\n return pkg.version;\n }\n } catch {\n // Continue to next path\n }\n }\n\n // Try to get version from opencode command if available\n try {\n const { spawn } = await import(\"child_process\");\n return new Promise((resolve) => {\n const proc = spawn(\"opencode\", [\"--version\"], { stdio: \"pipe\" });\n \n let version = \"\";\n proc.stdout.on(\"data\", (data) => {\n version += data.toString();\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n // Extract version from output like \"OpenCode v1.0.190\"\n const match = version.match(/v?(\\d+\\.\\d+\\.\\d+)/);\n resolve(match ? match[1] : null);\n } else {\n resolve(null);\n }\n });\n\n // Timeout after 3 seconds\n setTimeout(() => {\n proc.kill();\n resolve(null);\n }, 3000);\n });\n } catch {\n // opencode command not available\n }\n\n return null;\n } catch {\n return null;\n }\n}",
83
86
  "/**\n * OpenCode Tool Installation (Legacy)\n * \n * Version Compatibility: OpenCode versions < v1.0.186\n * \n * This module installs raggrep as an OpenCode tool for older versions of OpenCode\n * that do not support the skill system. Tools are TypeScript files placed in\n * ~/.config/opencode/tool/ that provide direct execution capabilities.\n * \n * Migration Note:\n * - Users should upgrade to OpenCode v1.0.186+ to use the newer skill-based approach\n * - This tool-based approach will be deprecated in future versions\n */\n\nimport type { Logger } from \"../../../domain/ports\";\n\nexport interface ToolInstallOptions {\n logger?: Logger;\n checkForOldSkill?: boolean;\n}\n\nexport interface ToolInstallResult {\n success: boolean;\n toolPath?: string;\n message: string;\n removedOldSkill?: boolean;\n}\n\n/**\n * Install raggrep as an OpenCode tool for older versions\n */\nexport async function installTool(options: ToolInstallOptions = {}): Promise<ToolInstallResult> {\n const { logger, checkForOldSkill = true } = options;\n const os = await import(\"os\");\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const homeDir = os.homedir();\n const toolDir = path.join(homeDir, \".config\", \"opencode\", \"tool\");\n const toolPath = path.join(toolDir, \"raggrep.ts\");\n\n let removedOldSkill = false;\n\n const toolContent = `import { tool } from \"@opencode-ai/plugin\";\n\n/**\n * Check if raggrep is installed globally\n */\nasync function isRagrepInstalled(): Promise<boolean> {\n try {\n const proc = Bun.spawn(['raggrep', '--version'], { stdout: 'pipe', stderr: 'pipe' });\n await proc.exited;\n return proc.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nexport default tool({\n description:\n \"Semantic code search powered by RAG - understands INTENT, not just literal text. Parses code using AST to extract functions, classes, and symbols with full context. Finds relevant code even when exact keywords don't match. Superior to grep for exploratory searches like 'authentication logic', 'error handling patterns', or 'configuration loading'.\\\\\\\\n\\\\\\\\n🎯 USE THIS TOOL FIRST when you need to:\\\\\\\\n• Find WHERE code is located (functions, components, services)\\\\\\\\n• Understand HOW code is structured\\\\\\\\n• Discover RELATED code across multiple files\\\\\\\\n• Get a QUICK overview of a topic\\\\\\\\n\\\\\\\\n❌ DON'T read multiple files manually when you can:\\\\\\\\n raggrep(\\\\\"user authentication\\\\\", { filter: [\\\\\"src/\\\\\"] })\\\\\\\\n\\\\\\\\n✅ INSTEAD of reading files one-by-one, search semantically:\\\\\\\\n • \\\\\"Find the auth middleware\\\\\" vs read: auth.ts, middleware.ts, index.ts...\\\\\\\\n • \\\\\"Where are React components?\\\\\" vs read: App.tsx, components/*, pages/*...\\\\\\\\n • \\\\\"Database connection logic?\\\\\" vs read: db.ts, config.ts, models/*...\\\\\\\\n • \\\\\"Error handling patterns\\\\\" vs read: error.ts, middleware.ts, handlers/*...\\\\\\\\n\\\\\\\\nThis saves ~10x tool calls and provides BETTER context by showing related code across the entire codebase.\",\n args: {\n query: tool.schema\n .string()\n .describe(\n \"Natural language search query describing what you want to find. Be specific: 'auth middleware that checks JWT', 'React hooks for data fetching', 'database connection pool config'. This is MUCH faster than reading files manually.\"\n ),\n filter: tool.schema\n .array(tool.schema.string())\n .describe(\n \"Array of path prefixes or glob patterns to narrow search scope (OR logic). If user mentions a directory, use it. Otherwise infer from context. Common patterns: ['src/auth'], ['*.tsx', 'components/'], ['api/', 'routes/'], ['docs/', '*.md'], ['*.test.ts']. For broad search use ['src/'] or ['**/*'].\"\n ),\n top: tool.schema\n .number()\n .optional()\n .describe(\"Number of results to return (default: 10)\"),\n minScore: tool.schema\n .number()\n .optional()\n .describe(\"Minimum similarity score 0-1 (default: 0.15)\"),\n type: tool.schema\n .string()\n .optional()\n .describe(\n \"Filter by single file extension without dot (e.g., 'ts', 'tsx', 'js', 'md'). Prefer using 'filter' with glob patterns like '*.ts' for more flexibility.\"\n ),\n },\n async execute(args) {\n const installed = await isRagrepInstalled();\n\n if (!installed) {\n return \\`Error: raggrep is not installed globally.\n\nPlease install raggrep globally:\n npm install -g raggrep@latest\n\n(Adapt the command for your preferred package manager)\\`;\n }\n\n const cmdArgs = [args.query];\n\n if (args.top !== undefined) {\n cmdArgs.push(\"--top\", String(args.top));\n }\n if (args.minScore !== undefined) {\n cmdArgs.push(\"--min-score\", String(args.minScore));\n }\n if (args.type !== undefined) {\n cmdArgs.push(\"--type\", args.type);\n }\n if (args.filter !== undefined && args.filter.length > 0) {\n for (const f of args.filter) {\n cmdArgs.push(\"--filter\", f);\n }\n }\n\n const proc = Bun.spawn(['raggrep', 'query', ...cmdArgs], { stdout: 'pipe' });\n const result = await new Response(proc.stdout).text();\n return result.trim();\n },\n});\n`;\n\n try {\n // Check for old skill file for mutual exclusivity\n if (checkForOldSkill) {\n const oldSkillDir = path.join(homeDir, \".config\", \"opencode\", \"skill\", \"raggrep\");\n const oldSkillPath = path.join(oldSkillDir, \"SKILL.md\");\n \n let oldSkillExists = false;\n try {\n await fs.access(oldSkillPath);\n oldSkillExists = true;\n } catch {\n // Old skill file doesn't exist\n }\n\n if (oldSkillExists) {\n const message = \"Found existing raggrep skill from previous installation.\";\n const locationMessage = ` Location: ${oldSkillPath}`;\n \n if (logger) {\n logger.info(message);\n logger.info(locationMessage);\n } else {\n console.log(message);\n console.log(locationMessage);\n }\n \n const readline = await import(\"readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Remove the existing skill and install tool? (Y/n): \", resolve);\n });\n \n rl.close();\n\n const shouldDelete = answer.toLowerCase() !== 'n';\n \n if (shouldDelete) {\n try {\n await fs.unlink(oldSkillPath);\n \n // Explicitly check if directory is empty before attempting removal\n const skillDirContents = await fs.readdir(oldSkillDir);\n if (skillDirContents.length === 0) {\n try {\n await fs.rmdir(oldSkillDir);\n console.log(\"✓ Removed old skill directory.\");\n } catch (rmdirError) {\n console.log(\"✓ Removed old skill file. (Directory not empty or other error)\");\n }\n } else {\n console.log(\"✓ Removed old skill file. (Directory not empty, keeping structure)\");\n }\n \n removedOldSkill = true;\n \n const successMessage = \"✓ Removed old skill file.\";\n if (logger) {\n logger.info(successMessage);\n } else {\n console.log(successMessage);\n }\n } catch (error) {\n const warnMessage = `Warning: Could not remove old skill file: ${error}`;\n if (logger) {\n logger.warn(warnMessage);\n } else {\n console.warn(warnMessage);\n }\n }\n } else {\n const keepMessage = \"Keeping existing skill. Tool installation cancelled.\";\n if (logger) {\n logger.info(keepMessage);\n } else {\n console.log(keepMessage);\n }\n return {\n success: false,\n message: keepMessage,\n };\n }\n }\n }\n\n // Create directory if it doesn't exist\n await fs.mkdir(toolDir, { recursive: true });\n\n // Write the tool file\n await fs.writeFile(toolPath, toolContent, \"utf-8\");\n\n const message = `Installed raggrep tool for OpenCode.\n Location: ${toolPath}\n\nThe raggrep tool is now available in OpenCode.`;\n\n if (logger) {\n logger.info(message);\n } else {\n console.log(message);\n }\n\n return {\n success: true,\n toolPath,\n message,\n removedOldSkill,\n };\n } catch (error) {\n const message = `Error installing OpenCode tool: ${error}`;\n \n if (logger) {\n logger.error(message);\n } else {\n console.error(message);\n }\n\n return {\n success: false,\n message,\n };\n }\n}",
84
87
  "/**\n * OpenCode Skill Installation (Modern)\n * \n * Version Compatibility: OpenCode versions >= v1.0.186\n * \n * This module installs raggrep as an OpenCode skill for newer versions of OpenCode\n * that support the skill system. Skills are markdown files with YAML frontmatter\n * placed in ~/.opencode/skill/ that provide reusable behavior definitions.\n * \n * Benefits of Skills over Tools:\n * - Better integration with OpenCode's agent system\n * - More flexible and educational for agents\n * - Follows OpenCode's modern architecture patterns\n * - Provides comprehensive usage documentation\n */\n\nimport type { Logger } from \"../../../domain/ports\";\n\nexport interface SkillInstallOptions {\n logger?: Logger;\n checkForOldTool?: boolean;\n}\n\nexport interface SkillInstallResult {\n success: boolean;\n skillPath?: string;\n message: string;\n removedOldTool?: boolean;\n}\n\n/**\n * Install raggrep as an OpenCode skill for modern versions\n */\nexport async function installSkill(options: SkillInstallOptions = {}): Promise<SkillInstallResult> {\n const { logger, checkForOldTool = true } = options;\n const os = await import(\"os\");\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const homeDir = os.homedir();\n const skillDir = path.join(homeDir, \".config\", \"opencode\", \"skill\", \"raggrep\");\n const skillPath = path.join(skillDir, \"SKILL.md\");\n\n const skillContent = `---\nname: raggrep\ndescription: AST-powered semantic code search that understands intent, not just text. Superior to grep/rg - finds functions, classes, and logic even when keywords differ. Saves 10x tool calls by searching the actual code structure.\nlicense: MIT\ncompatibility: opencode\nmetadata:\n audience: developers\n use_case: code-discovery\n---\n\n## What I do\n\nI'm a **MUCH better alternative to grep/rg** for code search. I provide semantic search that actually **understands your code** rather than just matching text:\n\n- **Parse code using AST** to extract functions, classes, variables, and symbols with full context\n- **Understand code structure** and relationships across files\n- **Search by intent** - find \"authentication logic\" even if the code uses \"auth\", \"login\", \"verifyToken\", etc.\n- **Find relevant code** even when exact keywords don't appear anywhere in the source\n- **Save ~10x tool calls** compared to manually reading files or using grep\n\n## When to use me\n\nUse me when you need to:\n- **Find WHERE code is located** (functions, components, services)\n- **Understand HOW code is structured** (architecture, patterns, dependencies) \n- **Discover RELATED code** across multiple files\n- **Get a QUICK overview** of a topic or feature area\n\n## How to use me\n\nFirst, install raggrep if not already available:\n\\`\\`\\`bash\n# Install raggrep globally\nnpm install -g raggrep\n# or\npnpm add -g raggrep\n\\`\\`\\`\n\n### Step 1: Index your codebase\n\nIndex data is written to **\\`<project>/.raggrep/\\`** inside the directory you target. Add \\`.raggrep/\\` to \\`.gitignore\\` if you do not want it in version control.\n\nFrom the repository root:\n\\`\\`\\`bash\ncd /path/to/your/project\nraggrep index\n\\`\\`\\`\n\nOr pass the project path explicitly (no \\`cd\\` needed; same flag as \\`git -C\\`):\n\\`\\`\\`bash\nraggrep index --dir /path/to/your/project\n# short form:\nraggrep index -C ~/projects/my-app\n\\`\\`\\`\n\n### Step 2: Use semantic search\n\n\\`\\`\\`bash\n# Search for specific functionality (from project root, or use --dir / -C)\nraggrep query \"user authentication\"\nraggrep query -C /path/to/your/project \"user authentication\"\n\n# Search with filters\nraggrep query \"React hooks for data fetching\" --filter \"src/components\"\nraggrep query -C /path/to/your/project \"React hooks\" --filter \"src/components\"\n\n# Search with specific file types\nraggrep query \"database connection\" --type ts\n\n# Get more results\nraggrep query \"error handling\" --top 15\n\\`\\`\\`\n\nUse **\\`-C\\` / \\`--dir\\`** on \\`raggrep query\\`, \\`raggrep index\\`, \\`raggrep status\\`, and \\`raggrep reset\\` when the shell is not already in the repository root.\n\n### Step 3: Use in OpenCode agents\n\nLoad this skill in your agent conversation:\n\\`\\`\\`\nskill({ name: \"raggrep\" })\n\\`\\`\\`\n\nThen the agent can use raggrep commands to search your codebase efficiently.\n\n## Why I'm Better Than grep/rg\n\n❌ **grep/rg limitations:**\n- Only matches literal text patterns\n- Can't understand code structure or intent \n- Requires exact keyword matches\n- Often returns irrelevant results\n\n✅ **My advantages:**\n- Understands code semantics and intent\n- Finds relevant code even with different terminology\n- Works with AST-extracted symbols, not just raw text\n- Provides contextual, ranked results\n\n## Search Examples\n\nInstead of using grep/rg or manually reading files:\n\n❌ **DON'T do this:**\n- \\`rg \"auth\" --type ts\\` (might miss middleware, login, verifyToken)\n- Read: auth.ts, middleware.ts, index.ts to find auth logic\n- Read: App.tsx, components/*, pages/* to find React components \n- Read: db.ts, config.ts, models/* to find database code\n\n✅ **DO this instead:**\n- \\`raggrep query \"Find the auth middleware\"\\` (finds ALL auth-related code)\n- \\`raggrep query -C /path/to/repo \"Find the auth middleware\"\\` (when not \\`cd\\`'d into the repo)\n- \\`raggrep query \"Where are React components?\"\\`\n- \\`raggrep query \"Database connection logic?\"\\`\n- \\`raggrep query \"Error handling patterns\"\\`\n\n## Best Practices\n\n1. **Think intent, not keywords**: \"user authentication logic\" works better than \\`rg \"auth\"\\`\n2. **Use filters strategically**: \\`--filter \"src/auth\"\\`, \\`--filter \"*.test.ts\"\\`\n3. **Adjust result count**: Use \\`--top 5\\` for focused results, \\`--top 20\\` for comprehensive search\n4. **Replace grep/rg habits**: Instead of \\`rg \"pattern\"\\`, try \\`raggrep query \"what the code does\"\\`\n5. **Target the right tree**: If your shell is not in the repo root, use \\`-C /path/to/repo\\` or \\`--dir\\` on every command so the index under that repo's \\`.raggrep/\\` stays aligned with searches\n\n**Result**: 10x fewer tool calls, BETTER results, deeper code understanding.\n`;\n\n let removedOldTool = false;\n\n try {\n // Check for old tool file for backward compatibility\n if (checkForOldTool) {\n const oldToolDir = path.join(homeDir, \".config\", \"opencode\", \"tool\");\n const oldToolPath = path.join(oldToolDir, \"raggrep.ts\");\n \n let oldToolExists = false;\n try {\n await fs.access(oldToolPath);\n oldToolExists = true;\n } catch {\n // Old tool file doesn't exist\n }\n\n if (oldToolExists) {\n const message = \"Found old raggrep tool file from previous version.\";\n const locationMessage = ` Location: ${oldToolPath}`;\n \n if (logger) {\n logger.info(message);\n logger.info(locationMessage);\n } else {\n console.log(message);\n console.log(locationMessage);\n }\n \n const readline = await import(\"readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"Do you want to remove the old tool file? (Y/n): \", resolve);\n });\n \n rl.close();\n\n const shouldDelete = answer.toLowerCase() !== 'n';\n \n if (shouldDelete) {\n try {\n await fs.unlink(oldToolPath);\n \n // Explicitly check if directory is empty before attempting removal\n const toolDirContents = await fs.readdir(oldToolDir);\n if (toolDirContents.length === 0) {\n try {\n await fs.rmdir(oldToolDir);\n console.log(\"✓ Removed old tool directory.\");\n } catch (rmdirError) {\n console.log(\"✓ Removed old tool file. (Directory not empty or other error)\");\n }\n } else {\n console.log(\"✓ Removed old tool file. (Directory not empty, keeping structure)\");\n }\n \n removedOldTool = true;\n \n const successMessage = \"✓ Removed old tool file.\";\n if (logger) {\n logger.info(successMessage);\n } else {\n console.log(successMessage);\n }\n } catch (error) {\n const warnMessage = `Warning: Could not remove old tool file: ${error}`;\n if (logger) {\n logger.warn(warnMessage);\n } else {\n console.warn(warnMessage);\n }\n }\n } else {\n const keepMessage = \"Keeping old tool file.\";\n if (logger) {\n logger.info(keepMessage);\n } else {\n console.log(keepMessage);\n }\n }\n }\n }\n\n // Create directory if it doesn't exist\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write the skill file\n await fs.writeFile(skillPath, skillContent, \"utf-8\");\n\n const message = `Installed raggrep skill for OpenCode.\n Location: ${skillPath}\n\nThe raggrep skill is now available to OpenCode agents.\n\nTo use this skill:\n1. Install raggrep: npm install -g raggrep\n2. Index your codebase: \\`cd\\` to the repo and \\`raggrep index\\`, or \\`raggrep index --dir /path/to/repo\\`\n3. In OpenCode, load the skill: skill({ name: \"raggrep\" })`;\n\n if (logger) {\n logger.info(message);\n } else {\n console.log(message);\n }\n\n return {\n success: true,\n skillPath,\n message,\n removedOldTool,\n };\n } catch (error) {\n const message = `Error installing OpenCode skill: ${error}`;\n \n if (logger) {\n logger.error(message);\n } else {\n console.error(message);\n }\n\n return {\n success: false,\n message,\n };\n }\n}",
85
- "// Main CLI entry point for raggrep\n\nimport * as path from \"path\";\nimport { stat } from \"fs/promises\";\nimport { EMBEDDING_MODELS, getCacheDir } from \"../../infrastructure/embeddings\";\nimport {\n createInlineLogger,\n createSilentLogger,\n} from \"../../infrastructure/logger\";\nimport type { EmbeddingModelName } from \"../../domain/ports\";\n// @ts-ignore - JSON import inlined by Bun at build time\nimport pkg from \"../../../package.json\";\n\nconst VERSION = pkg.version;\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\n// Handle --version / -v at top level (before any command)\nif (command === \"--version\" || command === \"-v\") {\n console.log(`raggrep v${VERSION}`);\n process.exit(0);\n}\n\n/**\n * Format a date as a human-readable \"time ago\" string\n */\nfunction formatTimeAgo(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return \"just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n // For older dates, show the actual date\n return date.toLocaleDateString();\n}\n\n/**\n * Parsed CLI flags from command line arguments\n */\ninterface ParsedFlags {\n /** Embedding model to use */\n model?: EmbeddingModelName;\n /** Number of results to return */\n topK?: number;\n /** Minimum similarity score threshold (0-1) */\n minScore?: number;\n /** File extension filter (e.g., 'ts', 'tsx') */\n fileType?: string;\n /** Path filter for search (e.g., 'src/auth') */\n pathFilter?: string[];\n /** Show help message */\n help: boolean;\n /** Show detailed progress */\n verbose: boolean;\n /** Watch mode for continuous indexing */\n watch: boolean;\n /** Number of files to process in parallel */\n concurrency?: number;\n /** Show timing information for performance profiling */\n timing: boolean;\n /** Force tool installation (mutually exclusive with --skill) */\n forceTool: boolean;\n /** Force skill installation (mutually exclusive with --tool) */\n forceSkill: boolean;\n /** Project root to index or query (default: current working directory) */\n projectDir?: string;\n /** Remaining positional arguments */\n remaining: string[];\n}\n\n/**\n * Parse CLI flags from command line arguments\n * @param args - Array of command line arguments (excluding command name)\n * @returns Parsed flags object\n */\nfunction parseFlags(args: string[]): ParsedFlags {\n const flags: ParsedFlags = {\n help: false,\n verbose: false,\n watch: false,\n timing: false,\n forceTool: false,\n forceSkill: false,\n remaining: [],\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === \"--help\" || arg === \"-h\") {\n flags.help = true;\n } else if (arg === \"--verbose\" || arg === \"-v\") {\n flags.verbose = true;\n } else if (arg === \"--watch\" || arg === \"-w\") {\n flags.watch = true;\n } else if (arg === \"--timing\" || arg === \"-T\") {\n flags.timing = true;\n } else if (arg === \"--model\" || arg === \"-m\") {\n const modelName = args[++i];\n if (modelName && modelName in EMBEDDING_MODELS) {\n flags.model = modelName as EmbeddingModelName;\n } else {\n console.error(`Invalid model: ${modelName}`);\n console.error(\n `Available models: ${Object.keys(EMBEDDING_MODELS).join(\", \")}`\n );\n process.exit(1);\n }\n } else if (arg === \"--top\" || arg === \"-k\") {\n const k = parseInt(args[++i], 10);\n if (!isNaN(k) && k > 0) {\n flags.topK = k;\n }\n } else if (arg === \"--min-score\" || arg === \"-s\") {\n const score = parseFloat(args[++i]);\n if (!isNaN(score) && score >= 0 && score <= 1) {\n flags.minScore = score;\n } else {\n console.error(\n `Invalid min-score: ${args[i]}. Must be a number between 0 and 1.`\n );\n process.exit(1);\n }\n } else if (arg === \"--type\" || arg === \"-t\") {\n const type = args[++i];\n if (type) {\n // Normalize: remove leading dot if present\n flags.fileType = type.startsWith(\".\") ? type.slice(1) : type;\n } else {\n console.error(\"--type requires a file extension (e.g., ts, tsx, js)\");\n process.exit(1);\n }\n } else if (arg === \"--concurrency\" || arg === \"-c\") {\n const c = parseInt(args[++i], 10);\n if (!isNaN(c) && c > 0) {\n flags.concurrency = c;\n } else {\n console.error(\n `Invalid concurrency: ${args[i]}. Must be a positive integer.`\n );\n process.exit(1);\n }\n } else if (arg === \"--filter\" || arg === \"-f\") {\n const filterPath = args[++i];\n if (filterPath) {\n if (!flags.pathFilter) {\n flags.pathFilter = [];\n }\n flags.pathFilter.push(filterPath);\n } else {\n console.error(\n '--filter requires a path or glob pattern (e.g., src/auth, \"*.ts\")'\n );\n process.exit(1);\n }\n } else if (arg === \"--dir\" || arg === \"-C\") {\n const dir = args[++i];\n if (dir) {\n flags.projectDir = dir;\n } else {\n console.error(\n \"--dir / -C requires a path to the project directory to index or search.\"\n );\n process.exit(1);\n }\n } else if (arg === \"--tool\") {\n flags.forceTool = true;\n } else if (arg === \"--skill\") {\n flags.forceSkill = true;\n } else if (!arg.startsWith(\"-\")) {\n flags.remaining.push(arg);\n }\n }\n\n return flags;\n}\n\n/**\n * Resolve the project directory from flags or cwd, and ensure it exists.\n */\nasync function resolveProjectRoot(flags: ParsedFlags): Promise<string> {\n const root = path.resolve(flags.projectDir ?? process.cwd());\n try {\n const st = await stat(root);\n if (!st.isDirectory()) {\n console.error(`Error: not a directory: ${root}`);\n process.exit(1);\n }\n } catch {\n console.error(\n `Error: directory does not exist or is not accessible: ${root}`\n );\n process.exit(1);\n }\n return root;\n}\n\nasync function main() {\n const flags = parseFlags(args.slice(1)); // Skip the command itself\n\n switch (command) {\n case \"index\": {\n if (flags.help) {\n const models = Object.keys(EMBEDDING_MODELS).join(\", \");\n console.log(`\nraggrep index - Index a directory for semantic search\n\nUsage:\n raggrep index [options]\n\nOptions:\n -C, --dir <path> Project directory to index (default: current directory)\n -w, --watch Watch for file changes and re-index automatically\n -m, --model <name> Override embedding model for the TypeScript module (default: saved config, else bge-small-en-v1.5)\n -c, --concurrency <n> Number of files to process in parallel (default: auto)\n -v, --verbose Show detailed progress\n -h, --help Show this help message\n\nAvailable Models:\n ${models}\n\nModel Cache: ${getCacheDir()}\n\nExamples:\n raggrep index\n raggrep index --dir ../other-repo\n raggrep index --watch\n raggrep index --model bge-small-en-v1.5\n raggrep index --concurrency 8\n raggrep index --verbose\n`);\n process.exit(0);\n }\n\n const { indexDirectory, watchDirectory } = await import(\"../indexer\");\n\n // Create inline logger for CLI (progress replaces current line)\n const logger = createInlineLogger({ verbose: flags.verbose });\n\n const projectRoot = await resolveProjectRoot(flags);\n\n // Initial indexing\n console.log(\"RAGgrep Indexer\");\n console.log(\"================\\n\");\n try {\n const results = await indexDirectory(projectRoot, {\n model: flags.model,\n verbose: flags.verbose,\n concurrency: flags.concurrency,\n logger,\n });\n console.log(\"\\n================\");\n console.log(\"Summary:\");\n for (const result of results) {\n console.log(\n ` ${result.moduleId}: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`\n );\n }\n } catch (error) {\n console.error(\"Error during indexing:\", error);\n process.exit(1);\n }\n\n // Watch mode\n if (flags.watch) {\n console.log(\"\\n┌─────────────────────────────────────────┐\");\n console.log(\"│ Watching for changes... (Ctrl+C to stop) │\");\n console.log(\"└─────────────────────────────────────────┘\\n\");\n\n try {\n const watcher = await watchDirectory(projectRoot, {\n model: flags.model,\n verbose: flags.verbose,\n onFileChange: (event, filepath) => {\n if (flags.verbose) {\n const symbol =\n event === \"add\" ? \"+\" : event === \"unlink\" ? \"-\" : \"~\";\n console.log(` ${symbol} ${filepath}`);\n }\n },\n });\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.log(\"\\n\\nStopping watcher...\");\n await watcher.stop();\n console.log(\"Done.\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep the process running\n await new Promise(() => {}); // Never resolves\n } catch (error) {\n console.error(\"Error starting watcher:\", error);\n process.exit(1);\n }\n }\n break;\n }\n\n case \"query\": {\n if (flags.help) {\n console.log(`\nraggrep query - Search the indexed codebase\n\nUsage:\n raggrep query <search query> [options]\n\nOptions:\n -C, --dir <path> Project directory to search (default: current directory)\n -k, --top <n> Number of results to return (default: 10)\n -s, --min-score <n> Minimum similarity score 0-1 (default: 0.15)\n -t, --type <ext> Filter by file extension (e.g., ts, tsx, js)\n -f, --filter <path> Filter by path or glob pattern (can be used multiple times)\n -T, --timing Show timing breakdown for performance profiling\n -h, --help Show this help message\n\nNote:\n The index is managed automatically like a cache:\n - First query creates the index\n - Changed files are re-indexed automatically\n - Deleted files are cleaned up automatically\n - Unchanged files use the cached index (instant)\n\nFilter Patterns:\n Path prefix: --filter src/auth (matches src/auth/*)\n Glob pattern: --filter \"*.ts\" (matches all .ts files)\n Glob pattern: --filter \"*.md\" (matches all .md files)\n Glob pattern: --filter \"src/**/*.test.ts\" (matches test files in src/)\n\nMultiple Filters (OR logic):\n Use multiple --filter flags to match files that match ANY of the patterns.\n raggrep query \"api\" --filter \"*.ts\" --filter \"*.tsx\" (matches .ts OR .tsx)\n raggrep query \"docs\" --filter \"*.md\" --filter docs/ (matches .md OR docs/)\n\nExamples:\n raggrep query \"user authentication\"\n raggrep query --dir ~/projects/my-app \"user authentication\"\n raggrep query \"handle errors\" --top 5\n raggrep query \"database\" --min-score 0.1\n raggrep query \"interface\" --type ts\n raggrep query \"login\" --filter src/auth\n raggrep query \"api\" --filter src/api --filter src/routes\n\n # Search only source code files\n raggrep query \"service controller\" --filter \"*.ts\"\n raggrep query \"component state\" --filter \"*.tsx\"\n\n # Search only documentation\n raggrep query \"deployment workflow\" --filter \"*.md\"\n\n # Search specific patterns\n raggrep query \"test helpers\" --filter \"*.test.ts\"\n`);\n process.exit(0);\n }\n\n const { ensureIndexFresh } = await import(\"../indexer\");\n const query = flags.remaining[0];\n\n if (!query) {\n console.error(\"Usage: raggrep query <search query>\");\n console.error('Run \"raggrep query --help\" for more information.');\n process.exit(1);\n }\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n // Create silent logger for background indexing during query\n const silentLogger = createSilentLogger();\n\n // Ensure index is fresh (creates if needed, updates if changed)\n const freshStats = await ensureIndexFresh(projectRoot, {\n model: flags.model,\n quiet: true, // Suppress detailed indexing output\n logger: silentLogger,\n timing: flags.timing,\n });\n\n console.log(\"RAGgrep Search\");\n console.log(\"==============\\n\");\n\n // Show brief index status summary\n if (freshStats.indexed > 0 || freshStats.removed > 0) {\n const parts: string[] = [];\n if (freshStats.indexed > 0) {\n parts.push(`${freshStats.indexed} indexed`);\n }\n if (freshStats.removed > 0) {\n parts.push(`${freshStats.removed} removed`);\n }\n console.log(`Using updated index: ${parts.join(\", \")}\\n`);\n } else {\n console.log(\"Using cached index (no changes detected).\\n\");\n }\n\n // Show timing information if requested\n if (flags.timing && freshStats.timing) {\n const t = freshStats.timing;\n console.log(\"┌─ Timing ───────────────────────────────────────────────┐\");\n if (t.fromCache) {\n console.log(`│ Cache hit (TTL-based) │`);\n console.log(`│ Total: ${t.totalMs.toFixed(0).padStart(6)}ms │`);\n } else {\n console.log(`│ File discovery: ${t.fileDiscoveryMs.toFixed(0).padStart(6)}ms │ ${String(t.filesDiscovered).padStart(6)} files, ${t.filesChanged} changed`.padEnd(57) + \"│\");\n console.log(`│ Indexing: ${t.indexingMs.toFixed(0).padStart(6)}ms │ ${String(t.filesReindexed).padStart(6)} reindexed`.padEnd(57) + \"│\");\n console.log(`│ Cleanup: ${t.cleanupMs.toFixed(0).padStart(6)}ms │`.padEnd(57) + \"│\");\n console.log(`│ ───────────────────────────────────────────────────── │`);\n console.log(`│ Total: ${t.totalMs.toFixed(0).padStart(6)}ms`.padEnd(57) + \"│\");\n }\n console.log(\"└────────────────────────────────────────────────────────┘\\n\");\n }\n\n // Build file patterns if type filter specified\n const filePatterns = flags.fileType\n ? [`*.${flags.fileType}`]\n : undefined;\n\n // Use hybrid search to get both semantic and exact match results\n const { hybridSearch, formatHybridSearchResults } = await import(\"../search\");\n\n const hybridResults = await hybridSearch(projectRoot, query, {\n topK: flags.topK ?? 10,\n minScore: flags.minScore,\n filePatterns,\n pathFilter: flags.pathFilter,\n // Skip automatic freshness check since we already called ensureIndexFresh above\n ensureFresh: false,\n });\n console.log(formatHybridSearchResults(hybridResults));\n } catch (error) {\n console.error(\"Error during search:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"reset\": {\n if (flags.help) {\n console.log(`\nraggrep reset - Clear the index for a project directory\n\nUsage:\n raggrep reset [options]\n\nOptions:\n -C, --dir <path> Project directory whose index to remove (default: current directory)\n -h, --help Show this help message\n\nDescription:\n Completely removes the .raggrep index for the project directory.\n The next 'raggrep index' or 'raggrep query' will rebuild from scratch.\n\nExamples:\n raggrep reset\n raggrep reset --dir ../other-repo\n`);\n process.exit(0);\n }\n\n const { resetIndex } = await import(\"../indexer\");\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n const result = await resetIndex(projectRoot);\n console.log(\"Index cleared successfully.\");\n console.log(` Removed: ${result.indexDir}`);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"No index found\")\n ) {\n console.error(\"Error: No index found for this directory.\");\n process.exit(1);\n }\n console.error(\"Error during reset:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"status\": {\n if (flags.help) {\n console.log(`\nraggrep status - Show the current state of the index\n\nUsage:\n raggrep status [options]\n\nOptions:\n -C, --dir <path> Project directory to report on (default: current directory)\n -h, --help Show this help message\n\nDescription:\n Displays information about the index for the project directory,\n including whether it exists, how many files are indexed, and\n when it was last updated.\n\nExamples:\n raggrep status\n raggrep status --dir ../other-repo\n`);\n process.exit(0);\n }\n\n const { getIndexStatus } = await import(\"../indexer\");\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n const status = await getIndexStatus(projectRoot);\n\n if (!status.exists) {\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ○ Not indexed │\n└─────────────────────────────────────────┘\n\n Directory: ${status.rootDir}\n\n Run \"raggrep index\" to create an index.\n`);\n } else {\n const date = status.lastUpdated ? new Date(status.lastUpdated) : null;\n const timeAgo = date ? formatTimeAgo(date) : \"unknown\";\n\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ● Indexed │\n└─────────────────────────────────────────┘\n\n Files: ${status.totalFiles.toString().padEnd(10)} Updated: ${timeAgo}\n Location: ${status.indexDir}\n`);\n if (status.modules.length > 0) {\n console.log(\" Modules:\");\n for (const mod of status.modules) {\n console.log(` └─ ${mod.id} (${mod.fileCount} files)`);\n }\n console.log(\"\");\n }\n }\n } catch (error) {\n console.error(\"Error getting status:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"opencode\": {\n const subcommand = flags.remaining[0];\n\n if (flags.help || !subcommand) {\n console.log(`\nraggrep opencode - Manage OpenCode integration\n\nUsage:\n raggrep opencode <subcommand> [options]\n\nSubcommands:\n install Install or update raggrep for OpenCode\n\nOptions:\n --tool Force tool-based installation (default)\n --skill Force skill-based installation\n\nDescription:\n Installs raggrep for OpenCode with mutual exclusivity:\n - Tool installation (default): ~/.config/opencode/tool/raggrep.ts\n - Skill installation: ~/.config/opencode/skill/raggrep/SKILL.md\n Installing one will prompt to remove the other (default: yes)\n\nExamples:\n raggrep opencode install # Install tool (default)\n raggrep opencode install --tool # Force tool installation\n raggrep opencode install --skill # Force skill installation\n`);\n process.exit(0);\n }\n\n if (subcommand === \"install\") {\n // Validate mutual exclusivity\n if (flags.forceTool && flags.forceSkill) {\n console.error(\"Error: --tool and --skill flags are mutually exclusive\");\n process.exit(1);\n }\n\n const {\n detectOpenCodeVersion,\n getInstallationMethod,\n installTool,\n installSkill,\n } = await import(\"./opencode\");\n\n try {\n // Determine installation method: default to tool, respect explicit flags\n let method: 'tool' | 'skill';\n if (flags.forceTool) {\n method = 'tool';\n } else if (flags.forceSkill) {\n method = 'skill';\n } else {\n // Default to tool installation\n method = 'tool';\n }\n\n console.log(\"RAGgrep OpenCode Installer\");\n console.log(\"==========================\\n\");\n\n if (flags.forceTool) {\n console.log(\"Forced tool-based installation (--tool flag)\");\n } else if (flags.forceSkill) {\n console.log(\"Forced skill-based installation (--skill flag)\");\n } else {\n console.log(\"Default tool-based installation\");\n }\n \n console.log(`Installing ${method}...\\n`);\n\n let result;\n if (method === 'tool') {\n result = await installTool({ checkForOldSkill: true });\n } else {\n result = await installSkill({ checkForOldTool: true });\n }\n\n if (!result.success) {\n process.exit(1);\n }\n\n console.log(\"\\nInstallation completed successfully!\");\n } catch (error) {\n console.error(\"Error during installation:\", error);\n process.exit(1);\n }\n } else {\n console.error(`Unknown subcommand: ${subcommand}`);\n console.error('Run \"raggrep opencode --help\" for usage.');\n process.exit(1);\n }\n break;\n }\n\n default:\n console.log(`\nraggrep v${VERSION} - Local filesystem-based RAG system for codebases\n\nUsage:\n raggrep <command> [options]\n\nCommands:\n index Index a project directory\n query Search the indexed codebase\n status Show the current state of the index\n reset Clear the index for a project directory\n opencode Manage opencode integration\n\nOptions:\n -h, --help Show help for a command\n -v, --version Show version number\n\nProject directory (index, query, status, reset):\n Use -C or --dir <path> to target a directory other than the current one.\n\nExamples:\n raggrep index\n raggrep query \"user login\"\n raggrep query -C ~/projects/app \"user login\"\n raggrep status\n raggrep reset\n raggrep opencode install\n\nRun 'raggrep <command> --help' for more information.\n`);\n if (command && command !== \"--help\" && command !== \"-h\") {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n }\n}\n\nmain();\n"
88
+ "// Main CLI entry point for raggrep\n\nimport * as path from \"path\";\nimport { stat } from \"fs/promises\";\nimport { EMBEDDING_MODELS, getCacheDir } from \"../../infrastructure/embeddings\";\nimport {\n createInlineLogger,\n createSilentLogger,\n} from \"../../infrastructure/logger\";\nimport type { EmbeddingModelName } from \"../../domain/ports\";\nimport type { RankBy } from \"../../types\";\n// @ts-ignore - JSON import inlined by Bun at build time\nimport pkg from \"../../../package.json\";\n\nconst VERSION = pkg.version;\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\n// Handle --version / -v at top level (before any command)\nif (command === \"--version\" || command === \"-v\") {\n console.log(`raggrep v${VERSION}`);\n process.exit(0);\n}\n\n/**\n * Format a date as a human-readable \"time ago\" string\n */\nfunction formatTimeAgo(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return \"just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n // For older dates, show the actual date\n return date.toLocaleDateString();\n}\n\n/**\n * Parsed CLI flags from command line arguments\n */\ninterface ParsedFlags {\n /** Embedding model to use */\n model?: EmbeddingModelName;\n /** Number of results to return */\n topK?: number;\n /** Minimum similarity score threshold (0-1) */\n minScore?: number;\n /** File extension filter (e.g., 'ts', 'tsx') */\n fileType?: string;\n /** Path filter for search (e.g., 'src/auth') */\n pathFilter?: string[];\n /** Show help message */\n help: boolean;\n /** Show detailed progress */\n verbose: boolean;\n /** Watch mode for continuous indexing */\n watch: boolean;\n /** Number of files to process in parallel */\n concurrency?: number;\n /** Show timing information for performance profiling */\n timing: boolean;\n /** Force tool installation (mutually exclusive with --skill) */\n forceTool: boolean;\n /** Force skill installation (mutually exclusive with --tool) */\n forceSkill: boolean;\n /** Project root to index or query (default: current working directory) */\n projectDir?: string;\n /** Remaining positional arguments */\n remaining: string[];\n /** How to order hybrid results (default: structured) */\n rankBy?: RankBy;\n}\n\n/**\n * Parse CLI flags from command line arguments\n * @param args - Array of command line arguments (excluding command name)\n * @returns Parsed flags object\n */\nfunction parseFlags(args: string[]): ParsedFlags {\n const flags: ParsedFlags = {\n help: false,\n verbose: false,\n watch: false,\n timing: false,\n forceTool: false,\n forceSkill: false,\n remaining: [],\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === \"--help\" || arg === \"-h\") {\n flags.help = true;\n } else if (arg === \"--verbose\" || arg === \"-v\") {\n flags.verbose = true;\n } else if (arg === \"--watch\" || arg === \"-w\") {\n flags.watch = true;\n } else if (arg === \"--timing\" || arg === \"-T\") {\n flags.timing = true;\n } else if (arg === \"--model\" || arg === \"-m\") {\n const modelName = args[++i];\n if (modelName && modelName in EMBEDDING_MODELS) {\n flags.model = modelName as EmbeddingModelName;\n } else {\n console.error(`Invalid model: ${modelName}`);\n console.error(\n `Available models: ${Object.keys(EMBEDDING_MODELS).join(\", \")}`\n );\n process.exit(1);\n }\n } else if (arg === \"--top\" || arg === \"-k\") {\n const k = parseInt(args[++i], 10);\n if (!isNaN(k) && k > 0) {\n flags.topK = k;\n }\n } else if (arg === \"--min-score\" || arg === \"-s\") {\n const score = parseFloat(args[++i]);\n if (!isNaN(score) && score >= 0 && score <= 1) {\n flags.minScore = score;\n } else {\n console.error(\n `Invalid min-score: ${args[i]}. Must be a number between 0 and 1.`\n );\n process.exit(1);\n }\n } else if (arg === \"--type\" || arg === \"-t\") {\n const type = args[++i];\n if (type) {\n // Normalize: remove leading dot if present\n flags.fileType = type.startsWith(\".\") ? type.slice(1) : type;\n } else {\n console.error(\"--type requires a file extension (e.g., ts, tsx, js)\");\n process.exit(1);\n }\n } else if (arg === \"--concurrency\" || arg === \"-c\") {\n const c = parseInt(args[++i], 10);\n if (!isNaN(c) && c > 0) {\n flags.concurrency = c;\n } else {\n console.error(\n `Invalid concurrency: ${args[i]}. Must be a positive integer.`\n );\n process.exit(1);\n }\n } else if (arg === \"--filter\" || arg === \"-f\") {\n const filterPath = args[++i];\n if (filterPath) {\n if (!flags.pathFilter) {\n flags.pathFilter = [];\n }\n flags.pathFilter.push(filterPath);\n } else {\n console.error(\n '--filter requires a path or glob pattern (e.g., src/auth, \"*.ts\")'\n );\n process.exit(1);\n }\n } else if (arg === \"--dir\" || arg === \"-C\") {\n const dir = args[++i];\n if (dir) {\n flags.projectDir = dir;\n } else {\n console.error(\n \"--dir / -C requires a path to the project directory to index or search.\"\n );\n process.exit(1);\n }\n } else if (arg === \"--rank-by\") {\n const v = args[++i];\n if (v === \"structured\" || v === \"semantic\" || v === \"combined\") {\n flags.rankBy = v;\n } else {\n console.error(\n `--rank-by must be structured, semantic, or combined (got: ${v})`\n );\n process.exit(1);\n }\n } else if (arg === \"--tool\") {\n flags.forceTool = true;\n } else if (arg === \"--skill\") {\n flags.forceSkill = true;\n } else if (!arg.startsWith(\"-\")) {\n flags.remaining.push(arg);\n }\n }\n\n return flags;\n}\n\n/**\n * Resolve the project directory from flags or cwd, and ensure it exists.\n */\nasync function resolveProjectRoot(flags: ParsedFlags): Promise<string> {\n const root = path.resolve(flags.projectDir ?? process.cwd());\n try {\n const st = await stat(root);\n if (!st.isDirectory()) {\n console.error(`Error: not a directory: ${root}`);\n process.exit(1);\n }\n } catch {\n console.error(\n `Error: directory does not exist or is not accessible: ${root}`\n );\n process.exit(1);\n }\n return root;\n}\n\nasync function main() {\n const flags = parseFlags(args.slice(1)); // Skip the command itself\n\n switch (command) {\n case \"index\": {\n if (flags.help) {\n const models = Object.keys(EMBEDDING_MODELS).join(\", \");\n console.log(`\nraggrep index - Index a directory for semantic search\n\nUsage:\n raggrep index [options]\n\nOptions:\n -C, --dir <path> Project directory to index (default: current directory)\n -w, --watch Watch for file changes and re-index automatically\n -m, --model <name> Override embedding model for the TypeScript module (default: saved config, else bge-small-en-v1.5)\n -c, --concurrency <n> Number of files to process in parallel (default: auto)\n -v, --verbose Show detailed progress\n -h, --help Show this help message\n\nAvailable Models:\n ${models}\n\nModel Cache: ${getCacheDir()}\n\nExamples:\n raggrep index\n raggrep index --dir ../other-repo\n raggrep index --watch\n raggrep index --model bge-small-en-v1.5\n raggrep index --concurrency 8\n raggrep index --verbose\n`);\n process.exit(0);\n }\n\n const { indexDirectory, watchDirectory } = await import(\"../indexer\");\n\n // Create inline logger for CLI (progress replaces current line)\n const logger = createInlineLogger({ verbose: flags.verbose });\n\n const projectRoot = await resolveProjectRoot(flags);\n\n // Initial indexing\n console.log(\"RAGgrep Indexer\");\n console.log(\"================\\n\");\n try {\n const results = await indexDirectory(projectRoot, {\n model: flags.model,\n verbose: flags.verbose,\n concurrency: flags.concurrency,\n logger,\n });\n console.log(\"\\n================\");\n console.log(\"Summary:\");\n for (const result of results) {\n console.log(\n ` ${result.moduleId}: ${result.indexed} indexed, ${result.skipped} skipped, ${result.errors} errors`\n );\n }\n } catch (error) {\n console.error(\"Error during indexing:\", error);\n process.exit(1);\n }\n\n // Watch mode\n if (flags.watch) {\n console.log(\"\\n┌─────────────────────────────────────────┐\");\n console.log(\"│ Watching for changes... (Ctrl+C to stop) │\");\n console.log(\"└─────────────────────────────────────────┘\\n\");\n\n try {\n const watcher = await watchDirectory(projectRoot, {\n model: flags.model,\n verbose: flags.verbose,\n onFileChange: (event, filepath) => {\n if (flags.verbose) {\n const symbol =\n event === \"add\" ? \"+\" : event === \"unlink\" ? \"-\" : \"~\";\n console.log(` ${symbol} ${filepath}`);\n }\n },\n });\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.log(\"\\n\\nStopping watcher...\");\n await watcher.stop();\n console.log(\"Done.\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep the process running\n await new Promise(() => {}); // Never resolves\n } catch (error) {\n console.error(\"Error starting watcher:\", error);\n process.exit(1);\n }\n }\n break;\n }\n\n case \"query\": {\n if (flags.help) {\n console.log(`\nraggrep query - Search the indexed codebase\n\nUsage:\n raggrep query <search query> [options]\n\nOptions:\n -C, --dir <path> Project directory to search (default: current directory)\n -k, --top <n> Number of results to return (default: 10)\n -s, --min-score <n> Minimum similarity score 0-1 (default: 0.15)\n -t, --type <ext> Filter by file extension (e.g., ts, tsx, js)\n -f, --filter <path> Filter by path or glob pattern (can be used multiple times)\n --rank-by <mode> Order results: structured (default), semantic, or combined (fused score only)\n -T, --timing Show timing breakdown for performance profiling\n -h, --help Show this help message\n\nNote:\n The index is managed automatically like a cache:\n - First query creates the index\n - Changed files are re-indexed automatically\n - Deleted files are cleaned up automatically\n - Unchanged files use the cached index (instant)\n\nFilter Patterns:\n Path prefix: --filter src/auth (matches src/auth/*)\n Glob pattern: --filter \"*.ts\" (matches all .ts files)\n Glob pattern: --filter \"*.md\" (matches all .md files)\n Glob pattern: --filter \"src/**/*.test.ts\" (matches test files in src/)\n\nMultiple Filters (OR logic):\n Use multiple --filter flags to match files that match ANY of the patterns.\n raggrep query \"api\" --filter \"*.ts\" --filter \"*.tsx\" (matches .ts OR .tsx)\n raggrep query \"docs\" --filter \"*.md\" --filter docs/ (matches .md OR docs/)\n\nExamples:\n raggrep query \"user authentication\"\n raggrep query --dir ~/projects/my-app \"user authentication\"\n raggrep query \"handle errors\" --top 5\n raggrep query \"database\" --min-score 0.1\n raggrep query \"interface\" --type ts\n raggrep query \"login\" --filter src/auth\n raggrep query \"api\" --filter src/api --filter src/routes\n\n # Search only source code files\n raggrep query \"service controller\" --filter \"*.ts\"\n raggrep query \"component state\" --filter \"*.tsx\"\n\n # Search only documentation\n raggrep query \"deployment workflow\" --filter \"*.md\"\n\n # Search specific patterns\n raggrep query \"test helpers\" --filter \"*.test.ts\"\n`);\n process.exit(0);\n }\n\n const { ensureIndexFresh } = await import(\"../indexer\");\n const query = flags.remaining[0];\n\n if (!query) {\n console.error(\"Usage: raggrep query <search query>\");\n console.error('Run \"raggrep query --help\" for more information.');\n process.exit(1);\n }\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n // Create silent logger for background indexing during query\n const silentLogger = createSilentLogger();\n\n // Ensure index is fresh (creates if needed, updates if changed)\n const freshStats = await ensureIndexFresh(projectRoot, {\n model: flags.model,\n quiet: true, // Suppress detailed indexing output\n logger: silentLogger,\n timing: flags.timing,\n });\n\n console.log(\"RAGgrep Search\");\n console.log(\"==============\\n\");\n\n // Show brief index status summary\n if (freshStats.indexed > 0 || freshStats.removed > 0) {\n const parts: string[] = [];\n if (freshStats.indexed > 0) {\n parts.push(`${freshStats.indexed} indexed`);\n }\n if (freshStats.removed > 0) {\n parts.push(`${freshStats.removed} removed`);\n }\n console.log(`Using updated index: ${parts.join(\", \")}\\n`);\n } else {\n console.log(\"Using cached index (no changes detected).\\n\");\n }\n\n // Show timing information if requested\n if (flags.timing && freshStats.timing) {\n const t = freshStats.timing;\n console.log(\"┌─ Timing ───────────────────────────────────────────────┐\");\n if (t.fromCache) {\n console.log(`│ Cache hit (TTL-based) │`);\n console.log(`│ Total: ${t.totalMs.toFixed(0).padStart(6)}ms │`);\n } else {\n console.log(`│ File discovery: ${t.fileDiscoveryMs.toFixed(0).padStart(6)}ms │ ${String(t.filesDiscovered).padStart(6)} files, ${t.filesChanged} changed`.padEnd(57) + \"│\");\n console.log(`│ Indexing: ${t.indexingMs.toFixed(0).padStart(6)}ms │ ${String(t.filesReindexed).padStart(6)} reindexed`.padEnd(57) + \"│\");\n console.log(`│ Cleanup: ${t.cleanupMs.toFixed(0).padStart(6)}ms │`.padEnd(57) + \"│\");\n console.log(`│ ───────────────────────────────────────────────────── │`);\n console.log(`│ Total: ${t.totalMs.toFixed(0).padStart(6)}ms`.padEnd(57) + \"│\");\n }\n console.log(\"└────────────────────────────────────────────────────────┘\\n\");\n }\n\n // Build file patterns if type filter specified\n const filePatterns = flags.fileType\n ? [`*.${flags.fileType}`]\n : undefined;\n\n // Use hybrid search to get both semantic and exact match results\n const { hybridSearch, formatHybridSearchResults } = await import(\"../search\");\n\n const hybridResults = await hybridSearch(projectRoot, query, {\n topK: flags.topK ?? 10,\n minScore: flags.minScore,\n filePatterns,\n pathFilter: flags.pathFilter,\n rankBy: flags.rankBy,\n // Skip automatic freshness check since we already called ensureIndexFresh above\n ensureFresh: false,\n });\n console.log(formatHybridSearchResults(hybridResults));\n } catch (error) {\n console.error(\"Error during search:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"reset\": {\n if (flags.help) {\n console.log(`\nraggrep reset - Clear the index for a project directory\n\nUsage:\n raggrep reset [options]\n\nOptions:\n -C, --dir <path> Project directory whose index to remove (default: current directory)\n -h, --help Show this help message\n\nDescription:\n Completely removes the .raggrep index for the project directory.\n The next 'raggrep index' or 'raggrep query' will rebuild from scratch.\n\nExamples:\n raggrep reset\n raggrep reset --dir ../other-repo\n`);\n process.exit(0);\n }\n\n const { resetIndex } = await import(\"../indexer\");\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n const result = await resetIndex(projectRoot);\n console.log(\"Index cleared successfully.\");\n console.log(` Removed: ${result.indexDir}`);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"No index found\")\n ) {\n console.error(\"Error: No index found for this directory.\");\n process.exit(1);\n }\n console.error(\"Error during reset:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"status\": {\n if (flags.help) {\n console.log(`\nraggrep status - Show the current state of the index\n\nUsage:\n raggrep status [options]\n\nOptions:\n -C, --dir <path> Project directory to report on (default: current directory)\n -h, --help Show this help message\n\nDescription:\n Displays information about the index for the project directory,\n including whether it exists, how many files are indexed, and\n when it was last updated.\n\nExamples:\n raggrep status\n raggrep status --dir ../other-repo\n`);\n process.exit(0);\n }\n\n const { getIndexStatus } = await import(\"../indexer\");\n\n const projectRoot = await resolveProjectRoot(flags);\n\n try {\n const status = await getIndexStatus(projectRoot);\n\n if (!status.exists) {\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ○ Not indexed │\n└─────────────────────────────────────────┘\n\n Directory: ${status.rootDir}\n\n Run \"raggrep index\" to create an index.\n`);\n } else {\n const date = status.lastUpdated ? new Date(status.lastUpdated) : null;\n const timeAgo = date ? formatTimeAgo(date) : \"unknown\";\n\n console.log(`\n┌─────────────────────────────────────────┐\n│ RAGgrep Status │\n├─────────────────────────────────────────┤\n│ ● Indexed │\n└─────────────────────────────────────────┘\n\n Files: ${status.totalFiles.toString().padEnd(10)} Updated: ${timeAgo}\n Location: ${status.indexDir}\n`);\n if (status.modules.length > 0) {\n console.log(\" Modules:\");\n for (const mod of status.modules) {\n console.log(` └─ ${mod.id} (${mod.fileCount} files)`);\n }\n console.log(\"\");\n }\n }\n } catch (error) {\n console.error(\"Error getting status:\", error);\n process.exit(1);\n }\n break;\n }\n\n case \"opencode\": {\n const subcommand = flags.remaining[0];\n\n if (flags.help || !subcommand) {\n console.log(`\nraggrep opencode - Manage OpenCode integration\n\nUsage:\n raggrep opencode <subcommand> [options]\n\nSubcommands:\n install Install or update raggrep for OpenCode\n\nOptions:\n --tool Force tool-based installation (default)\n --skill Force skill-based installation\n\nDescription:\n Installs raggrep for OpenCode with mutual exclusivity:\n - Tool installation (default): ~/.config/opencode/tool/raggrep.ts\n - Skill installation: ~/.config/opencode/skill/raggrep/SKILL.md\n Installing one will prompt to remove the other (default: yes)\n\nExamples:\n raggrep opencode install # Install tool (default)\n raggrep opencode install --tool # Force tool installation\n raggrep opencode install --skill # Force skill installation\n`);\n process.exit(0);\n }\n\n if (subcommand === \"install\") {\n // Validate mutual exclusivity\n if (flags.forceTool && flags.forceSkill) {\n console.error(\"Error: --tool and --skill flags are mutually exclusive\");\n process.exit(1);\n }\n\n const {\n detectOpenCodeVersion,\n getInstallationMethod,\n installTool,\n installSkill,\n } = await import(\"./opencode\");\n\n try {\n // Determine installation method: default to tool, respect explicit flags\n let method: 'tool' | 'skill';\n if (flags.forceTool) {\n method = 'tool';\n } else if (flags.forceSkill) {\n method = 'skill';\n } else {\n // Default to tool installation\n method = 'tool';\n }\n\n console.log(\"RAGgrep OpenCode Installer\");\n console.log(\"==========================\\n\");\n\n if (flags.forceTool) {\n console.log(\"Forced tool-based installation (--tool flag)\");\n } else if (flags.forceSkill) {\n console.log(\"Forced skill-based installation (--skill flag)\");\n } else {\n console.log(\"Default tool-based installation\");\n }\n \n console.log(`Installing ${method}...\\n`);\n\n let result;\n if (method === 'tool') {\n result = await installTool({ checkForOldSkill: true });\n } else {\n result = await installSkill({ checkForOldTool: true });\n }\n\n if (!result.success) {\n process.exit(1);\n }\n\n console.log(\"\\nInstallation completed successfully!\");\n } catch (error) {\n console.error(\"Error during installation:\", error);\n process.exit(1);\n }\n } else {\n console.error(`Unknown subcommand: ${subcommand}`);\n console.error('Run \"raggrep opencode --help\" for usage.');\n process.exit(1);\n }\n break;\n }\n\n default:\n console.log(`\nraggrep v${VERSION} - Local filesystem-based RAG system for codebases\n\nUsage:\n raggrep <command> [options]\n\nCommands:\n index Index a project directory\n query Search the indexed codebase\n status Show the current state of the index\n reset Clear the index for a project directory\n opencode Manage opencode integration\n\nOptions:\n -h, --help Show help for a command\n -v, --version Show version number\n\nProject directory (index, query, status, reset):\n Use -C or --dir <path> to target a directory other than the current one.\n\nExamples:\n raggrep index\n raggrep query \"user login\"\n raggrep query -C ~/projects/app \"user login\"\n raggrep status\n raggrep reset\n raggrep opencode install\n\nRun 'raggrep <command> --help' for more information.\n`);\n if (command && command !== \"--help\" && command !== \"-h\") {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n }\n}\n\nmain();\n"
86
89
  ],
87
- "mappings": "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",
88
- "debugId": "1CBA39A0838887E764756E2164756E21",
90
+ "mappings": "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",
91
+ "debugId": "9CA948E12F18492C64756E2164756E21",
89
92
  "names": []
90
93
  }