codesearch-mcp 0.2.3-alpha → 0.4.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -5
- package/LICENSE +661 -21
- package/README.md +76 -40
- package/dist/app.js +17 -38
- package/dist/src/ast/CallExtractor.d.ts +8 -0
- package/dist/src/ast/CallExtractor.js +68 -0
- package/dist/src/ast/GraphqlNameExtractor.d.ts +22 -0
- package/dist/src/ast/GraphqlNameExtractor.js +240 -0
- package/dist/src/ast/ImportEdgeExtractor.d.ts +11 -0
- package/dist/src/ast/ImportEdgeExtractor.js +129 -0
- package/dist/src/ast/IndexedNodeResolver.d.ts +14 -0
- package/dist/src/ast/IndexedNodeResolver.js +217 -0
- package/dist/src/ast/MemberExtractor.d.ts +8 -0
- package/dist/src/ast/MemberExtractor.js +129 -0
- package/dist/src/ast/TopLevelSymbolExtractor.d.ts +5 -0
- package/dist/src/ast/TopLevelSymbolExtractor.js +86 -0
- package/dist/src/ast/graphql-grammar.d.ts +24 -0
- package/dist/src/ast/graphql-grammar.js +93 -0
- package/dist/src/ast/node-helpers.d.ts +11 -0
- package/dist/src/ast/node-helpers.js +55 -0
- package/dist/src/chunking/AstChunker.d.ts +12 -0
- package/dist/src/chunking/AstChunker.js +30 -0
- package/dist/src/chunking/CharacterChunkStrategy.d.ts +8 -0
- package/dist/src/chunking/CharacterChunkStrategy.js +15 -0
- package/dist/src/chunking/DeclarationChunkStrategy.d.ts +15 -0
- package/dist/src/chunking/DeclarationChunkStrategy.js +87 -0
- package/dist/src/chunking/FragmentMerger.d.ts +11 -0
- package/dist/src/chunking/FragmentMerger.js +61 -0
- package/dist/src/chunking/ImportOnlyFilter.d.ts +5 -0
- package/dist/src/chunking/ImportOnlyFilter.js +14 -0
- package/dist/src/chunking/LangchainTextSplitter.d.ts +21 -0
- package/dist/src/chunking/LangchainTextSplitter.js +133 -0
- package/dist/src/chunking/MinSizeSplitPolicy.d.ts +9 -0
- package/dist/src/chunking/MinSizeSplitPolicy.js +18 -0
- package/dist/src/chunking/RunPacker.d.ts +12 -0
- package/dist/src/chunking/RunPacker.js +84 -0
- package/dist/src/chunking/create-chunker.d.ts +3 -0
- package/dist/src/chunking/create-chunker.js +15 -0
- package/dist/src/chunking/interfaces.d.ts +27 -0
- package/dist/src/commands/ConfigCommand.js +1 -9
- package/dist/src/commands/EvalCommand.d.ts +10 -5
- package/dist/src/commands/EvalCommand.js +60 -149
- package/dist/src/commands/IndexCommand.d.ts +10 -4
- package/dist/src/commands/IndexCommand.js +52 -146
- package/dist/src/commands/McpCommand.d.ts +6 -3
- package/dist/src/commands/McpCommand.js +19 -20
- package/dist/src/commands/WebCommand.d.ts +9 -3
- package/dist/src/commands/WebCommand.js +17 -11
- package/dist/src/commands/eval/baseline-comparison.d.ts +6 -0
- package/dist/src/commands/eval/baseline-comparison.js +54 -0
- package/dist/src/commands/eval/eval-args.d.ts +6 -0
- package/dist/src/commands/eval/eval-args.js +71 -0
- package/dist/src/commands/eval/eval-corpora.d.ts +6 -0
- package/dist/src/commands/eval/eval-corpora.js +76 -0
- package/dist/src/commands/eval/eval-metadata.d.ts +17 -0
- package/dist/src/commands/eval/eval-metadata.js +75 -0
- package/dist/src/commands/eval/index-inspector.d.ts +3 -0
- package/dist/src/commands/eval/index-inspector.js +21 -0
- package/dist/src/commands/eval/staged-search.d.ts +3 -0
- package/dist/src/commands/eval/staged-search.js +20 -0
- package/dist/src/commands/eval/suite-loader.d.ts +8 -0
- package/dist/src/commands/eval/suite-loader.js +52 -0
- package/dist/src/commands/index/backend-probe.d.ts +2 -0
- package/dist/src/commands/index/backend-probe.js +15 -0
- package/dist/src/commands/index/embedding-setup.d.ts +3 -0
- package/dist/src/commands/index/embedding-setup.js +16 -0
- package/dist/src/commands/index/index-summary.d.ts +2 -0
- package/dist/src/commands/index/index-summary.js +22 -0
- package/dist/src/commands/index/legacy-ollama-guard.d.ts +3 -0
- package/dist/src/commands/index/legacy-ollama-guard.js +23 -0
- package/dist/src/commands/index/prune-step.d.ts +3 -0
- package/dist/src/commands/index/prune-step.js +22 -0
- package/dist/src/commands/index/scan-targets.d.ts +8 -0
- package/dist/src/commands/index/scan-targets.js +107 -0
- package/dist/src/config-error.d.ts +0 -4
- package/dist/src/config-error.js +0 -4
- package/dist/src/config-store.d.ts +1 -55
- package/dist/src/config-store.js +11 -73
- package/dist/src/config.d.ts +9 -18
- package/dist/src/config.js +36 -35
- package/dist/src/constants.d.ts +17 -28
- package/dist/src/constants.js +35 -29
- package/dist/src/container.d.ts +10 -2
- package/dist/src/container.js +19 -8
- package/dist/src/db/drizzle-types.d.ts +7 -0
- package/dist/src/db/drizzle-types.js +2 -0
- package/dist/src/db/index.d.ts +1 -0
- package/dist/src/db/schema-steps.d.ts +8 -0
- package/dist/src/db/schema-steps.js +105 -0
- package/dist/src/db/schema.d.ts +17 -0
- package/dist/src/db/schema.js +1 -6
- package/dist/src/declarations/DeclarationTree.d.ts +19 -0
- package/dist/src/declarations/DeclarationTree.js +66 -0
- package/dist/src/declarations/DeclarationTreeBuilder.d.ts +22 -0
- package/dist/src/declarations/DeclarationTreeBuilder.js +179 -0
- package/dist/src/declarations/SourceLines.d.ts +37 -0
- package/dist/src/declarations/SourceLines.js +415 -0
- package/dist/src/dependency-traversal.d.ts +0 -6
- package/dist/src/dependency-traversal.js +0 -6
- package/dist/src/enriched-prompt.d.ts +0 -6
- package/dist/src/enriched-prompt.js +0 -6
- package/dist/src/error-record.d.ts +12 -0
- package/dist/src/error-record.js +248 -0
- package/dist/src/eval-corpus.d.ts +16 -0
- package/dist/src/eval-corpus.js +169 -0
- package/dist/src/eval-results.d.ts +6 -3
- package/dist/src/eval-results.js +323 -26
- package/dist/src/eval-vector-index.d.ts +5 -0
- package/dist/src/eval-vector-index.js +60 -0
- package/dist/src/file-utils.d.ts +0 -5
- package/dist/src/file-utils.js +0 -5
- package/dist/src/graph.d.ts +0 -25
- package/dist/src/graph.js +0 -28
- package/dist/src/help.js +9 -1
- package/dist/src/hnsw-settings.d.ts +3 -0
- package/dist/src/hnsw-settings.js +24 -0
- package/dist/src/index-args.d.ts +13 -0
- package/dist/src/index-args.js +48 -0
- package/dist/src/indexing/AnalysisBatcher.d.ts +12 -0
- package/dist/src/indexing/AnalysisBatcher.js +28 -0
- package/dist/src/indexing/ChunkEmbedder.d.ts +24 -0
- package/dist/src/indexing/ChunkEmbedder.js +37 -0
- package/dist/src/indexing/ConsoleScanReporter.d.ts +10 -0
- package/dist/src/indexing/ConsoleScanReporter.js +73 -0
- package/dist/src/indexing/EmbeddingSchemaPreparer.d.ts +14 -0
- package/dist/src/indexing/EmbeddingSchemaPreparer.js +66 -0
- package/dist/src/indexing/FileIngestor.d.ts +22 -0
- package/dist/src/indexing/FileIngestor.js +116 -0
- package/dist/src/indexing/IndexStore.d.ts +24 -0
- package/dist/src/indexing/IndexStore.js +69 -0
- package/dist/src/indexing/StaleFilePruner.d.ts +8 -0
- package/dist/src/indexing/StaleFilePruner.js +55 -0
- package/dist/src/indexing/analysis-rows.d.ts +4 -0
- package/dist/src/indexing/analysis-rows.js +65 -0
- package/dist/src/indexing/project-notices.d.ts +2 -0
- package/dist/src/indexing/project-notices.js +63 -0
- package/dist/src/interfaces/IAstParser.d.ts +4 -40
- package/dist/src/interfaces/ICallGraph.d.ts +28 -0
- package/dist/src/interfaces/ICallGraph.js +2 -0
- package/dist/src/interfaces/IChunkSearch.d.ts +42 -0
- package/dist/src/interfaces/IChunkSearch.js +2 -0
- package/dist/src/interfaces/IChunker.d.ts +3 -12
- package/dist/src/interfaces/ICorpusInspector.d.ts +7 -0
- package/dist/src/interfaces/ICorpusInspector.js +2 -0
- package/dist/src/interfaces/IDatabase.d.ts +8 -24
- package/dist/src/interfaces/IDependencyGraph.d.ts +24 -0
- package/dist/src/interfaces/IDependencyGraph.js +2 -0
- package/dist/src/interfaces/IEmbedder.d.ts +0 -9
- package/dist/src/interfaces/IIndexIdentityGuard.d.ts +3 -0
- package/dist/src/interfaces/IIndexIdentityGuard.js +2 -0
- package/dist/src/interfaces/IIndexedNodeResolver.d.ts +10 -0
- package/dist/src/interfaces/IIndexedNodeResolver.js +2 -0
- package/dist/src/interfaces/ILogger.d.ts +1 -11
- package/dist/src/interfaces/IMcpReadiness.d.ts +12 -0
- package/dist/src/interfaces/IMcpReadiness.js +2 -0
- package/dist/src/interfaces/IMcpToolHandler.d.ts +0 -5
- package/dist/src/interfaces/IMonorepoResolver.d.ts +0 -22
- package/dist/src/interfaces/IProjectCatalog.d.ts +13 -0
- package/dist/src/interfaces/IProjectCatalog.js +2 -0
- package/dist/src/interfaces/IProjectDiscovery.d.ts +0 -17
- package/dist/src/interfaces/IProjectRoots.d.ts +3 -0
- package/dist/src/interfaces/IProjectRoots.js +2 -0
- package/dist/src/interfaces/IRetrievalEvaluator.d.ts +153 -12
- package/dist/src/interfaces/IScanReporter.d.ts +13 -0
- package/dist/src/interfaces/IScanReporter.js +2 -0
- package/dist/src/interfaces/ISymbolLookup.d.ts +49 -0
- package/dist/src/interfaces/ISymbolLookup.js +2 -0
- package/dist/src/interfaces/IToolPaths.d.ts +62 -0
- package/dist/src/interfaces/IToolPaths.js +2 -0
- package/dist/src/interfaces/IWorkspaceFiles.d.ts +28 -0
- package/dist/src/interfaces/IWorkspaceFiles.js +2 -0
- package/dist/src/interfaces/SymbolKind.d.ts +1 -0
- package/dist/src/interfaces/SymbolKind.js +2 -0
- package/dist/src/interfaces/index.d.ts +12 -1
- package/dist/src/interrupt.js +0 -2
- package/dist/src/owner-path.d.ts +9 -10
- package/dist/src/owner-path.js +11 -23
- package/dist/src/project-scope.d.ts +1 -12
- package/dist/src/project-scope.js +5 -12
- package/dist/src/project-selector.d.ts +0 -5
- package/dist/src/project-selector.js +0 -11
- package/dist/src/retrieval-eval.d.ts +15 -6
- package/dist/src/retrieval-eval.js +388 -59
- package/dist/src/search/CallGraph.d.ts +9 -0
- package/dist/src/search/CallGraph.js +84 -0
- package/dist/src/search/ChunkSearch.d.ts +23 -0
- package/dist/src/search/ChunkSearch.js +115 -0
- package/dist/src/search/DependencyGraph.d.ts +19 -0
- package/dist/src/search/DependencyGraph.js +180 -0
- package/dist/src/search/IndexIdentityGuard.d.ts +11 -0
- package/dist/src/search/IndexIdentityGuard.js +37 -0
- package/dist/src/search/ProjectCatalog.d.ts +11 -0
- package/dist/src/search/ProjectCatalog.js +38 -0
- package/dist/src/search/SymbolLookup.d.ts +24 -0
- package/dist/src/search/SymbolLookup.js +97 -0
- package/dist/src/search/chunks/CandidateFetcher.d.ts +19 -0
- package/dist/src/search/chunks/CandidateFetcher.js +40 -0
- package/dist/src/search/chunks/IterativeScanGate.d.ts +10 -0
- package/dist/src/search/chunks/IterativeScanGate.js +42 -0
- package/dist/src/search/chunks/RerankStage.d.ts +15 -0
- package/dist/src/search/chunks/RerankStage.js +42 -0
- package/dist/src/search/chunks/search-metrics.d.ts +18 -0
- package/dist/src/search/chunks/search-metrics.js +32 -0
- package/dist/src/search/chunks/search-plan.d.ts +18 -0
- package/dist/src/search/chunks/search-plan.js +19 -0
- package/dist/src/search/create-search-services.d.ts +26 -0
- package/dist/src/search/create-search-services.js +29 -0
- package/dist/src/search/index-paths.d.ts +1 -0
- package/dist/src/search/index-paths.js +5 -0
- package/dist/src/search/result-shaping.d.ts +4 -0
- package/dist/src/search/result-shaping.js +19 -0
- package/dist/src/search/symbol-sql.d.ts +13 -0
- package/dist/src/search/symbol-sql.js +66 -0
- package/dist/src/search/symbols/SymbolGrepFallback.d.ts +19 -0
- package/dist/src/search/symbols/SymbolGrepFallback.js +106 -0
- package/dist/src/search/symbols/SymbolIndexQuery.d.ts +14 -0
- package/dist/src/search/symbols/SymbolIndexQuery.js +52 -0
- package/dist/src/search/symbols/SymbolTextSearch.d.ts +13 -0
- package/dist/src/search/symbols/SymbolTextSearch.js +84 -0
- package/dist/src/search/symbols/TargetColumnGate.d.ts +7 -0
- package/dist/src/search/symbols/TargetColumnGate.js +23 -0
- package/dist/src/search/symbols/find-symbol-constants.d.ts +4 -0
- package/dist/src/search/symbols/find-symbol-constants.js +8 -0
- package/dist/src/search/symbols/grep-args.d.ts +3 -0
- package/dist/src/search/symbols/grep-args.js +7 -0
- package/dist/src/search/symbols/grep-patterns.d.ts +4 -0
- package/dist/src/search/symbols/grep-patterns.js +60 -0
- package/dist/src/services/AstParserService.d.ts +10 -106
- package/dist/src/services/AstParserService.js +37 -1068
- package/dist/src/services/DatabaseService.d.ts +10 -17
- package/dist/src/services/DatabaseService.js +71 -115
- package/dist/src/services/EmbedderFactory.d.ts +0 -4
- package/dist/src/services/EmbedderFactory.js +0 -5
- package/dist/src/services/IndexerService.d.ts +7 -26
- package/dist/src/services/IndexerService.js +38 -286
- package/dist/src/services/InfinityEmbedder.d.ts +0 -21
- package/dist/src/services/InfinityEmbedder.js +0 -15
- package/dist/src/services/LoggerService.d.ts +7 -5
- package/dist/src/services/LoggerService.js +37 -41
- package/dist/src/services/McpReadiness.d.ts +18 -0
- package/dist/src/services/McpReadiness.js +73 -0
- package/dist/src/services/McpServer.d.ts +50 -19
- package/dist/src/services/McpServer.js +132 -62
- package/dist/src/services/MonorepoAwareDiscoveryService.d.ts +1 -45
- package/dist/src/services/MonorepoAwareDiscoveryService.js +1 -51
- package/dist/src/services/NxMonorepoResolver.d.ts +0 -29
- package/dist/src/services/NxMonorepoResolver.js +5 -56
- package/dist/src/services/OpenAICompatibleEmbedder.d.ts +0 -6
- package/dist/src/services/OpenAICompatibleEmbedder.js +0 -14
- package/dist/src/services/ProjectDiscoveryService.d.ts +0 -4
- package/dist/src/services/ProjectDiscoveryService.js +0 -4
- package/dist/src/services/VoyageEmbedder.d.ts +0 -6
- package/dist/src/services/VoyageEmbedder.js +0 -6
- package/dist/src/services/WebServerService.d.ts +5 -56
- package/dist/src/services/WebServerService.js +25 -63
- package/dist/src/services/http-retry.d.ts +0 -7
- package/dist/src/services/http-retry.js +1 -10
- package/dist/src/services/infinity-provisioning.d.ts +0 -74
- package/dist/src/services/infinity-provisioning.js +5 -88
- package/dist/src/services/legacy-ollama-index.d.ts +0 -16
- package/dist/src/services/legacy-ollama-index.js +0 -23
- package/dist/src/services/reranker.d.ts +0 -9
- package/dist/src/services/reranker.js +46 -12
- package/dist/src/setup.d.ts +24 -24
- package/dist/src/setup.js +205 -103
- package/dist/src/symbol-name.d.ts +1 -12
- package/dist/src/symbol-name.js +16 -25
- package/dist/src/symbol-rows.d.ts +0 -14
- package/dist/src/symbol-rows.js +0 -14
- package/dist/src/tool-call-log.d.ts +2 -0
- package/dist/src/tool-call-log.js +24 -0
- package/dist/src/tools/FindSymbolTool.d.ts +17 -7
- package/dist/src/tools/FindSymbolTool.js +54 -35
- package/dist/src/tools/GetCallersTool.d.ts +16 -8
- package/dist/src/tools/GetCallersTool.js +65 -35
- package/dist/src/tools/GetDependenciesTool.d.ts +16 -8
- package/dist/src/tools/GetDependenciesTool.js +36 -29
- package/dist/src/tools/GetDependentsTool.d.ts +20 -8
- package/dist/src/tools/GetDependentsTool.js +48 -34
- package/dist/src/tools/ListFilesTool.d.ts +16 -8
- package/dist/src/tools/ListFilesTool.js +20 -26
- package/dist/src/tools/ListProjectsTool.d.ts +11 -7
- package/dist/src/tools/ListProjectsTool.js +13 -11
- package/dist/src/tools/McpTool.d.ts +17 -0
- package/dist/src/tools/McpTool.js +28 -0
- package/dist/src/tools/ReadFileRangeTool.d.ts +16 -8
- package/dist/src/tools/ReadFileRangeTool.js +23 -25
- package/dist/src/tools/ReadFileTool.d.ts +15 -8
- package/dist/src/tools/ReadFileTool.js +19 -24
- package/dist/src/tools/SearchCodebaseTool.d.ts +22 -10
- package/dist/src/tools/SearchCodebaseTool.js +71 -50
- package/dist/src/tools/format-helpers.d.ts +9 -9
- package/dist/src/tools/format-helpers.js +146 -28
- package/dist/src/tools/tool-args.d.ts +38 -0
- package/dist/src/tools/tool-args.js +95 -0
- package/dist/src/web/dashboard.d.ts +0 -8
- package/dist/src/web/dashboard.js +7 -10
- package/dist/src/workspace/GrepRunner.d.ts +15 -0
- package/dist/src/workspace/GrepRunner.js +104 -0
- package/dist/src/workspace/ProjectRoots.d.ts +22 -0
- package/dist/src/workspace/ProjectRoots.js +102 -0
- package/dist/src/workspace/ToolPaths.d.ts +31 -0
- package/dist/src/workspace/ToolPaths.js +312 -0
- package/dist/src/workspace/WorkspaceFiles.d.ts +19 -0
- package/dist/src/workspace/WorkspaceFiles.js +285 -0
- package/dist/src/workspace/fs-access.d.ts +9 -0
- package/dist/src/workspace/fs-access.js +47 -0
- package/dist/src/workspace/path-helpers.d.ts +3 -0
- package/dist/src/workspace/path-helpers.js +43 -0
- package/package.json +5 -4
- package/dist/src/interfaces/ISearcher.d.ts +0 -35
- package/dist/src/services/AstChunker.d.ts +0 -42
- package/dist/src/services/AstChunker.js +0 -158
- package/dist/src/services/SearcherService.d.ts +0 -342
- package/dist/src/services/SearcherService.js +0 -1199
- package/docs/web-dashboard.md +0 -206
- /package/dist/src/{interfaces/ISearcher.js → chunking/interfaces.js} +0 -0
|
@@ -1,29 +1,24 @@
|
|
|
1
|
-
import type { NodePgDatabase, NodePgTransaction } from 'drizzle-orm/node-postgres';
|
|
2
|
-
import type { ExtractTablesWithRelations } from 'drizzle-orm/relations';
|
|
3
1
|
import type { Config } from '../config';
|
|
4
|
-
import type { IDatabase, IndexMeta } from '../interfaces/IDatabase';
|
|
5
|
-
import
|
|
6
|
-
type
|
|
7
|
-
export type DrizzleDb = NodePgDatabase<Schema>;
|
|
8
|
-
export type DrizzleTx = NodePgTransaction<Schema, ExtractTablesWithRelations<Schema>>;
|
|
2
|
+
import type { IDatabase, IndexMeta, InitDbOptions } from '../interfaces/IDatabase';
|
|
3
|
+
import type { ILogger } from '../interfaces/ILogger';
|
|
4
|
+
import type { DrizzleDb, DrizzleTx } from '../db';
|
|
9
5
|
export declare class DatabaseService implements IDatabase {
|
|
10
6
|
private config;
|
|
7
|
+
private logger;
|
|
11
8
|
private pool;
|
|
12
9
|
private _db;
|
|
13
|
-
|
|
10
|
+
private probeTimeoutMs;
|
|
11
|
+
constructor(config: Config, logger?: ILogger);
|
|
14
12
|
get orm(): DrizzleDb;
|
|
15
13
|
query<T = any>(sql: string, params?: any[]): Promise<T>;
|
|
14
|
+
queryWithLocalSettings<T = any>(settings: Record<string, string | number>, sql: string, params?: any[]): Promise<T>;
|
|
15
|
+
pgvectorVersion(): Promise<string | null>;
|
|
16
16
|
transaction<T>(fn: (tx: DrizzleTx) => Promise<T>): Promise<T>;
|
|
17
17
|
destroy(): Promise<void>;
|
|
18
|
-
initDb(): Promise<void>;
|
|
18
|
+
initDb(options?: InitDbOptions): Promise<void>;
|
|
19
|
+
probe(): Promise<void>;
|
|
19
20
|
initDbWithSchema(): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Create `code_chunk` at `dimensions` if it does not exist, plus its HNSW and
|
|
22
|
-
* (serviceName, filePath) indexes and the additive `contentHash`/`ownerPath`
|
|
23
|
-
* columns for pre-existing tables. Idempotent — safe to call repeatedly.
|
|
24
|
-
*/
|
|
25
21
|
ensureChunkTable(dimensions: number): Promise<void>;
|
|
26
|
-
/** Drop and recreate `code_chunk` at `dimensions` — used on a dimension change. */
|
|
27
22
|
recreateChunkTable(dimensions: number): Promise<void>;
|
|
28
23
|
readIndexMeta(): Promise<IndexMeta | null>;
|
|
29
24
|
writeIndexMeta(meta: IndexMeta): Promise<void>;
|
|
@@ -31,9 +26,7 @@ export declare class DatabaseService implements IDatabase {
|
|
|
31
26
|
deleteFiles(project: string, filePaths: string[]): Promise<void>;
|
|
32
27
|
listIndexedProjects(): Promise<string[]>;
|
|
33
28
|
deleteProject(name: string): Promise<void>;
|
|
34
|
-
/** Guard against SQL injection — the dimension is interpolated into DDL. */
|
|
35
29
|
private assertDim;
|
|
36
30
|
private assertMinPostgresVersion;
|
|
37
31
|
private ensureDatabaseExists;
|
|
38
32
|
}
|
|
39
|
-
export {};
|
|
@@ -34,24 +34,67 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.DatabaseService = void 0;
|
|
37
|
+
const async_hooks_1 = require("async_hooks");
|
|
37
38
|
const node_postgres_1 = require("drizzle-orm/node-postgres");
|
|
38
39
|
const pg_1 = require("pg");
|
|
39
40
|
const drizzle_orm_1 = require("drizzle-orm");
|
|
41
|
+
const LoggerService_1 = require("./LoggerService");
|
|
40
42
|
const schema = __importStar(require("../db/schema"));
|
|
41
43
|
const db_1 = require("../db");
|
|
44
|
+
const schema_steps_1 = require("../db/schema-steps");
|
|
42
45
|
const MIN_PG_VERSION_NUM = 150000;
|
|
46
|
+
const SETTING_NAME = /^[a-z_]+(\.[a-z_]+)*$/;
|
|
47
|
+
const SETTING_VALUE = /^[A-Za-z0-9_]+$/;
|
|
43
48
|
class DatabaseService {
|
|
44
49
|
config;
|
|
50
|
+
logger;
|
|
45
51
|
pool;
|
|
46
52
|
_db;
|
|
47
|
-
|
|
53
|
+
probeTimeoutMs;
|
|
54
|
+
constructor(config, logger = LoggerService_1.LoggerService.silent()) {
|
|
48
55
|
this.config = config;
|
|
56
|
+
this.logger = logger;
|
|
49
57
|
}
|
|
50
58
|
get orm() { return this._db; }
|
|
51
59
|
async query(sql, params) {
|
|
52
60
|
const result = await this.pool.query(sql, params);
|
|
53
61
|
return result.rows;
|
|
54
62
|
}
|
|
63
|
+
async queryWithLocalSettings(settings, sql, params) {
|
|
64
|
+
const setStatements = Object.entries(settings).map(([name, value]) => {
|
|
65
|
+
if (!SETTING_NAME.test(name) || !SETTING_VALUE.test(String(value))) {
|
|
66
|
+
throw new Error(`DatabaseService: invalid local setting ${JSON.stringify(name)} = ${JSON.stringify(value)}`);
|
|
67
|
+
}
|
|
68
|
+
return `SET LOCAL ${name} = ${value}`;
|
|
69
|
+
});
|
|
70
|
+
const client = await this.pool.connect();
|
|
71
|
+
let began = false;
|
|
72
|
+
let broken;
|
|
73
|
+
const onError = (err) => { broken ??= err; };
|
|
74
|
+
client.on('error', onError);
|
|
75
|
+
try {
|
|
76
|
+
await client.query('BEGIN');
|
|
77
|
+
began = true;
|
|
78
|
+
for (const statement of setStatements)
|
|
79
|
+
await client.query(statement);
|
|
80
|
+
const result = await client.query(sql, params);
|
|
81
|
+
await client.query('COMMIT');
|
|
82
|
+
return result.rows;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (began)
|
|
86
|
+
await client.query('ROLLBACK').catch((e) => { broken ??= e; });
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
client.removeListener('error', onError);
|
|
91
|
+
client.release(broken);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async pgvectorVersion() {
|
|
95
|
+
const rows = await this.query(`SELECT extversion FROM pg_extension WHERE extname = 'vector'`);
|
|
96
|
+
return rows[0]?.extversion ?? null;
|
|
97
|
+
}
|
|
55
98
|
transaction(fn) {
|
|
56
99
|
return this._db.transaction(fn);
|
|
57
100
|
}
|
|
@@ -60,118 +103,32 @@ class DatabaseService {
|
|
|
60
103
|
return Promise.resolve();
|
|
61
104
|
return this.pool.end();
|
|
62
105
|
}
|
|
63
|
-
async initDb() {
|
|
106
|
+
async initDb(options = {}) {
|
|
64
107
|
const { host, port, username, password, database } = this.config.db;
|
|
65
|
-
|
|
108
|
+
const { connectionTimeoutMs } = options;
|
|
109
|
+
this.probeTimeoutMs = connectionTimeoutMs;
|
|
110
|
+
this.pool = new pg_1.Pool({
|
|
111
|
+
host, port, user: username, password, database,
|
|
112
|
+
...(connectionTimeoutMs !== undefined ? { connectionTimeoutMillis: connectionTimeoutMs } : {}),
|
|
113
|
+
});
|
|
114
|
+
this.pool.on('error', async_hooks_1.AsyncResource.bind((err) => {
|
|
115
|
+
this.logger.warn('DatabaseService: idle client error', { err });
|
|
116
|
+
}));
|
|
66
117
|
this._db = (0, node_postgres_1.drizzle)(this.pool, { schema });
|
|
67
118
|
await this.pool.query('SELECT 1');
|
|
68
119
|
}
|
|
120
|
+
async probe() {
|
|
121
|
+
if (!this.pool)
|
|
122
|
+
throw new Error('DatabaseService: probe() called before initDb()');
|
|
123
|
+
const query = { text: 'SELECT 1', query_timeout: this.probeTimeoutMs };
|
|
124
|
+
await this.pool.query(query);
|
|
125
|
+
}
|
|
69
126
|
async initDbWithSchema() {
|
|
70
127
|
await this.ensureDatabaseExists();
|
|
71
128
|
await this.initDb();
|
|
72
|
-
// Read as the very first statement on the application database, before any
|
|
73
|
-
// CREATE TABLE / CREATE INDEX / ALTER TABLE / DROP — `NULLS NOT DISTINCT`
|
|
74
|
-
// (used below) requires PostgreSQL 15+, and the DROP/CREATE pair must never
|
|
75
|
-
// run against an older server (it would fail after the DROP and leave
|
|
76
|
-
// code_symbol without a unique index).
|
|
77
129
|
await this.assertMinPostgresVersion();
|
|
78
|
-
|
|
79
|
-
// tools always have a table. IndexerService recreates it at the resolved
|
|
80
|
-
// width before indexing when the active model's dimension differs.
|
|
81
|
-
await this.ensureChunkTable(1024);
|
|
82
|
-
// index_meta table — source of truth for the model that built the index.
|
|
83
|
-
await this.query(`
|
|
84
|
-
CREATE TABLE IF NOT EXISTS index_meta (
|
|
85
|
-
id BOOLEAN PRIMARY KEY DEFAULT true,
|
|
86
|
-
provider TEXT NOT NULL,
|
|
87
|
-
model TEXT NOT NULL,
|
|
88
|
-
dimensions INT NOT NULL,
|
|
89
|
-
"indexedAt" TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
90
|
-
)
|
|
91
|
-
`);
|
|
92
|
-
// code_dependency table
|
|
93
|
-
const [{ existsDep }] = await this.query(`
|
|
94
|
-
SELECT EXISTS (
|
|
95
|
-
SELECT 1 FROM information_schema.tables
|
|
96
|
-
WHERE table_schema = 'public' AND table_name = 'code_dependency'
|
|
97
|
-
) AS "existsDep"
|
|
98
|
-
`);
|
|
99
|
-
if (!existsDep) {
|
|
100
|
-
await this.query(`
|
|
101
|
-
CREATE TABLE code_dependency (
|
|
102
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
103
|
-
project TEXT NOT NULL,
|
|
104
|
-
"fromFile" TEXT NOT NULL,
|
|
105
|
-
"fromSymbol" TEXT,
|
|
106
|
-
"toFile" TEXT NOT NULL,
|
|
107
|
-
"toSymbol" TEXT,
|
|
108
|
-
"depType" TEXT NOT NULL
|
|
109
|
-
)
|
|
110
|
-
`);
|
|
111
|
-
}
|
|
112
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_dep_project_from ON code_dependency (project, "fromFile")`);
|
|
113
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_dep_project_to ON code_dependency (project, "toFile")`);
|
|
114
|
-
await this.query(`DROP INDEX IF EXISTS idx_dep_from`);
|
|
115
|
-
await this.query(`DROP INDEX IF EXISTS idx_dep_to`);
|
|
116
|
-
await this.query(`DROP INDEX IF EXISTS idx_dep_project`);
|
|
117
|
-
// code_symbol table
|
|
118
|
-
const [{ existsSym }] = await this.query(`
|
|
119
|
-
SELECT EXISTS (
|
|
120
|
-
SELECT 1 FROM information_schema.tables
|
|
121
|
-
WHERE table_schema = 'public' AND table_name = 'code_symbol'
|
|
122
|
-
) AS "existsSym"
|
|
123
|
-
`);
|
|
124
|
-
if (!existsSym) {
|
|
125
|
-
await this.query(`
|
|
126
|
-
CREATE TABLE code_symbol (
|
|
127
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
128
|
-
project TEXT NOT NULL,
|
|
129
|
-
"filePath" TEXT NOT NULL,
|
|
130
|
-
name TEXT NOT NULL,
|
|
131
|
-
kind TEXT NOT NULL,
|
|
132
|
-
signature TEXT,
|
|
133
|
-
line INT,
|
|
134
|
-
col INT
|
|
135
|
-
)
|
|
136
|
-
`);
|
|
137
|
-
}
|
|
138
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_symbol_name ON code_symbol (name, project)`);
|
|
139
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_symbol_file ON code_symbol (project, "filePath")`);
|
|
140
|
-
await this.query(`ALTER TABLE code_symbol ADD COLUMN IF NOT EXISTS container TEXT`);
|
|
141
|
-
await this.query(`ALTER TABLE code_symbol ADD COLUMN IF NOT EXISTS "isStatic" BOOLEAN NOT NULL DEFAULT false`);
|
|
142
|
-
await this.query(`ALTER TABLE code_symbol ADD COLUMN IF NOT EXISTS "target" TEXT`);
|
|
143
|
-
// DDL is transactional in PostgreSQL — either both statements apply or
|
|
144
|
-
// neither does, so a failure here never leaves code_symbol without a
|
|
145
|
-
// unique index (the old idx_symbol_unique is dropped only once the new
|
|
146
|
-
// one is confirmed to exist).
|
|
147
|
-
await this.transaction(async (tx) => {
|
|
148
|
-
await tx.execute('DROP INDEX IF EXISTS idx_symbol_unique');
|
|
149
|
-
await tx.execute('CREATE UNIQUE INDEX IF NOT EXISTS idx_symbol_unique_v2 ' +
|
|
150
|
-
'ON code_symbol (project, "filePath", container, name, kind, line) NULLS NOT DISTINCT');
|
|
151
|
-
});
|
|
152
|
-
// code_call table
|
|
153
|
-
await this.query(`
|
|
154
|
-
CREATE TABLE IF NOT EXISTS code_call (
|
|
155
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
156
|
-
project TEXT NOT NULL,
|
|
157
|
-
"fromFile" TEXT NOT NULL,
|
|
158
|
-
"fromSymbol" TEXT,
|
|
159
|
-
"calleeName" TEXT NOT NULL,
|
|
160
|
-
"calleeFile" TEXT NOT NULL,
|
|
161
|
-
"calleeSymbol" TEXT,
|
|
162
|
-
line INT,
|
|
163
|
-
col INT
|
|
164
|
-
)
|
|
165
|
-
`);
|
|
166
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_call_callee ON code_call (project, "calleeName")`);
|
|
167
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_call_callee_file ON code_call (project, "calleeFile")`);
|
|
168
|
-
await this.query(`CREATE INDEX IF NOT EXISTS idx_call_from ON code_call (project, "fromFile")`);
|
|
130
|
+
await (0, schema_steps_1.runSchemaSteps)(this);
|
|
169
131
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Create `code_chunk` at `dimensions` if it does not exist, plus its HNSW and
|
|
172
|
-
* (serviceName, filePath) indexes and the additive `contentHash`/`ownerPath`
|
|
173
|
-
* columns for pre-existing tables. Idempotent — safe to call repeatedly.
|
|
174
|
-
*/
|
|
175
132
|
async ensureChunkTable(dimensions) {
|
|
176
133
|
const dim = this.assertDim(dimensions);
|
|
177
134
|
await this.query(`
|
|
@@ -184,15 +141,16 @@ class DatabaseService {
|
|
|
184
141
|
embedding vector(${dim}) NOT NULL,
|
|
185
142
|
"lastModified" DOUBLE PRECISION,
|
|
186
143
|
"contentHash" VARCHAR(64),
|
|
187
|
-
"ownerPath" VARCHAR
|
|
144
|
+
"ownerPath" VARCHAR,
|
|
145
|
+
"endLine" INT
|
|
188
146
|
)
|
|
189
147
|
`);
|
|
190
148
|
await this.query(`ALTER TABLE code_chunk ADD COLUMN IF NOT EXISTS "contentHash" varchar(64) NULL`);
|
|
191
149
|
await this.query(`ALTER TABLE code_chunk ADD COLUMN IF NOT EXISTS "ownerPath" varchar NULL`);
|
|
192
|
-
await this.query(`
|
|
150
|
+
await this.query(`ALTER TABLE code_chunk ADD COLUMN IF NOT EXISTS "endLine" integer NULL`);
|
|
151
|
+
await this.query(`CREATE INDEX IF NOT EXISTS idx_code_chunk_embedding ON code_chunk USING hnsw (embedding vector_cosine_ops) WITH (m = 32, ef_construction = 200)`);
|
|
193
152
|
await this.query(`CREATE INDEX IF NOT EXISTS idx_code_chunk_service_file ON code_chunk ("serviceName", "filePath")`);
|
|
194
153
|
}
|
|
195
|
-
/** Drop and recreate `code_chunk` at `dimensions` — used on a dimension change. */
|
|
196
154
|
async recreateChunkTable(dimensions) {
|
|
197
155
|
const dim = this.assertDim(dimensions);
|
|
198
156
|
await this.query(`DROP TABLE IF EXISTS code_chunk`);
|
|
@@ -204,9 +162,10 @@ class DatabaseService {
|
|
|
204
162
|
const row = rows[0];
|
|
205
163
|
return row ? { provider: row.provider, model: row.model, dimensions: Number(row.dimensions) } : null;
|
|
206
164
|
}
|
|
207
|
-
catch {
|
|
208
|
-
|
|
209
|
-
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (err?.code === '42P01')
|
|
167
|
+
return null;
|
|
168
|
+
throw err;
|
|
210
169
|
}
|
|
211
170
|
}
|
|
212
171
|
async writeIndexMeta(meta) {
|
|
@@ -231,8 +190,6 @@ class DatabaseService {
|
|
|
231
190
|
async deleteFiles(project, filePaths) {
|
|
232
191
|
if (filePaths.length === 0)
|
|
233
192
|
return;
|
|
234
|
-
// PostgreSQL limits ~32 767 bind params per statement; OR queries bind the
|
|
235
|
-
// array twice (fromFile + calleeFile), so cap each batch at 10 000 entries.
|
|
236
193
|
const BATCH = 10_000;
|
|
237
194
|
await this.transaction(async (tx) => {
|
|
238
195
|
for (let i = 0; i < filePaths.length; i += BATCH) {
|
|
@@ -262,7 +219,6 @@ class DatabaseService {
|
|
|
262
219
|
await tx.delete(db_1.codeDependency).where((0, drizzle_orm_1.eq)(db_1.codeDependency.project, name));
|
|
263
220
|
});
|
|
264
221
|
}
|
|
265
|
-
/** Guard against SQL injection — the dimension is interpolated into DDL. */
|
|
266
222
|
assertDim(dimensions) {
|
|
267
223
|
if (!Number.isInteger(dimensions) || dimensions <= 0 || dimensions > 2000) {
|
|
268
224
|
throw new Error(`Invalid vector dimension: ${dimensions} (must be an integer 1–2000)`);
|
|
@@ -276,7 +232,7 @@ class DatabaseService {
|
|
|
276
232
|
versionNum = Number(rows[0]?.v);
|
|
277
233
|
}
|
|
278
234
|
catch (err) {
|
|
279
|
-
throw new Error(`Failed to read PostgreSQL server_version_num (requires PostgreSQL 15+): ${err.message}
|
|
235
|
+
throw new Error(`Failed to read PostgreSQL server_version_num (requires PostgreSQL 15+): ${err.message}`, { cause: err });
|
|
280
236
|
}
|
|
281
237
|
if (!Number.isFinite(versionNum) || versionNum < MIN_PG_VERSION_NUM) {
|
|
282
238
|
throw new Error(`PostgreSQL 15+ is required (server_version_num=${versionNum}) — ` +
|
|
@@ -310,7 +266,7 @@ class DatabaseService {
|
|
|
310
266
|
catch (err) {
|
|
311
267
|
await client.end().catch(() => { });
|
|
312
268
|
const msg = err instanceof Error ? err.message : String(err);
|
|
313
|
-
throw new Error(`Failed to ensure database "${database}" exists: ${msg}
|
|
269
|
+
throw new Error(`Failed to ensure database "${database}" exists: ${msg}`, { cause: err });
|
|
314
270
|
}
|
|
315
271
|
}
|
|
316
272
|
}
|
|
@@ -2,8 +2,4 @@ import type { Config } from '../config';
|
|
|
2
2
|
import type { IEmbedder } from '../interfaces/IEmbedder';
|
|
3
3
|
import type { ILogger } from '../interfaces/ILogger';
|
|
4
4
|
import { type EmbedderDeps } from './OpenAICompatibleEmbedder';
|
|
5
|
-
/**
|
|
6
|
-
* Construct the `IEmbedder` implementation selected by `config.embedding.provider`.
|
|
7
|
-
* The default (`infinity`) is the recommended local backend.
|
|
8
|
-
*/
|
|
9
5
|
export declare function createEmbedder(config: Config, logger?: ILogger, deps?: EmbedderDeps): IEmbedder;
|
|
@@ -5,10 +5,6 @@ const LoggerService_1 = require("./LoggerService");
|
|
|
5
5
|
const OpenAICompatibleEmbedder_1 = require("./OpenAICompatibleEmbedder");
|
|
6
6
|
const InfinityEmbedder_1 = require("./InfinityEmbedder");
|
|
7
7
|
const VoyageEmbedder_1 = require("./VoyageEmbedder");
|
|
8
|
-
/**
|
|
9
|
-
* Construct the `IEmbedder` implementation selected by `config.embedding.provider`.
|
|
10
|
-
* The default (`infinity`) is the recommended local backend.
|
|
11
|
-
*/
|
|
12
8
|
function createEmbedder(config, logger = LoggerService_1.LoggerService.silent(), deps = {}) {
|
|
13
9
|
switch (config.embedding.provider) {
|
|
14
10
|
case 'openai-compatible':
|
|
@@ -18,7 +14,6 @@ function createEmbedder(config, logger = LoggerService_1.LoggerService.silent(),
|
|
|
18
14
|
case 'voyage':
|
|
19
15
|
return new VoyageEmbedder_1.VoyageEmbedder(config, logger, deps);
|
|
20
16
|
default: {
|
|
21
|
-
// The Zod enum should already reject this; guard anyway for a clear message.
|
|
22
17
|
const p = config.embedding.provider;
|
|
23
18
|
throw new Error(`Unknown embedding provider: "${p}". Expected one of: openai-compatible, voyage, infinity.`);
|
|
24
19
|
}
|
|
@@ -2,10 +2,9 @@ import type { Config } from '../config';
|
|
|
2
2
|
import type { IEmbedder } from '../interfaces/IEmbedder';
|
|
3
3
|
import type { IAstParser } from '../interfaces/IAstParser';
|
|
4
4
|
import type { IChunker } from '../interfaces/IChunker';
|
|
5
|
-
import type { IDatabase } from '../interfaces/IDatabase';
|
|
5
|
+
import type { IDatabase, IndexMeta } from '../interfaces/IDatabase';
|
|
6
6
|
import type { DiscoveredProject } from '../interfaces/IProjectDiscovery';
|
|
7
7
|
import type { ILogger } from '../interfaces/ILogger';
|
|
8
|
-
import type { IndexMeta } from '../interfaces/IDatabase';
|
|
9
8
|
export interface IndexStats {
|
|
10
9
|
serviceName: string;
|
|
11
10
|
indexed: number;
|
|
@@ -17,40 +16,22 @@ export interface IndexStats {
|
|
|
17
16
|
}
|
|
18
17
|
export declare class IndexerService {
|
|
19
18
|
private db;
|
|
20
|
-
private embedder;
|
|
21
19
|
private ast;
|
|
22
|
-
private chunker;
|
|
23
|
-
private config;
|
|
24
20
|
private logger;
|
|
21
|
+
private readonly store;
|
|
22
|
+
private readonly stalePruner;
|
|
23
|
+
private readonly batcher;
|
|
24
|
+
private readonly chunkEmbedder;
|
|
25
|
+
private readonly ingestor;
|
|
26
|
+
private readonly schema;
|
|
25
27
|
constructor(db: IDatabase, embedder: IEmbedder, ast: IAstParser, chunker: IChunker, config: Config, logger?: ILogger);
|
|
26
|
-
/**
|
|
27
|
-
* Resolve the active embedding dimension (config override → registry → probe),
|
|
28
|
-
* reconcile it against `index_meta`, and prepare `code_chunk` accordingly:
|
|
29
|
-
* a dimension change drops+recreates the table; a same-dimension model/provider
|
|
30
|
-
* change clears its rows (vector spaces are not comparable across models); an
|
|
31
|
-
* unchanged model keeps the rows for incremental indexing. Back-compat: an
|
|
32
|
-
* existing populated table with no `index_meta` row is treated as the legacy
|
|
33
|
-
* `ollama`/`bge-m3`/1024 index. Writes `index_meta` to reflect the active model.
|
|
34
|
-
* Call once per run, before the scan loop.
|
|
35
|
-
*/
|
|
36
28
|
prepareEmbeddingSchema(): Promise<IndexMeta>;
|
|
37
|
-
private reconcileIndex;
|
|
38
|
-
private countChunks;
|
|
39
|
-
private writeDepEdges;
|
|
40
29
|
scanAndIndex(dir: string, serviceName: string, force?: boolean, signal?: AbortSignal, preCollectedFiles?: string[], opts?: {
|
|
41
30
|
rootTsConfigPath?: string;
|
|
42
31
|
}): Promise<IndexStats>;
|
|
43
|
-
/**
|
|
44
|
-
* Scan several leaf projects in one call, each with its own `rootTsConfigPath`
|
|
45
|
-
* (a unit's children may belong to different monorepos). No pruning, no
|
|
46
|
-
* console output — callers (CLI or a future hook) own reporting. A rejecting
|
|
47
|
-
* `scanAndIndex` call stops the loop before the next target and propagates.
|
|
48
|
-
*/
|
|
49
32
|
scanProjects(targets: DiscoveredProject[], force: boolean, signal: AbortSignal, filesPerProject: string[][]): Promise<IndexStats[]>;
|
|
50
33
|
pruneProjects(keep: string[]): Promise<{
|
|
51
34
|
removed: string[];
|
|
52
35
|
failed: string[];
|
|
53
36
|
}>;
|
|
54
|
-
private static hashContent;
|
|
55
|
-
private ingestFile;
|
|
56
37
|
}
|