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
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SourceLines = void 0;
|
|
4
|
+
const PUNCTUATION_ONLY = /^[}\)\];,]+$/;
|
|
5
|
+
const DIRECTIVE = /^(['"])use [\w -]+\1;?$/;
|
|
6
|
+
const IMPORT_START = /^(import(?=\s*['"{*]|\s+[\w$])|export\s+(\*|type\s+[{*]|\{|import\s+[A-Za-z_$]))/;
|
|
7
|
+
const BARE_IMPORT_NEXT = /^([*{'"]|type\s|[A-Za-z_$][\w$]*\s*(,|from\b|=))/;
|
|
8
|
+
const BARE_IMPORT_LIST = /^[A-Za-z_$][\w$]*\s*,/;
|
|
9
|
+
const MODULE_REFERENCE = /\bfrom\s*(['"]|$)|\brequire\s*\(/;
|
|
10
|
+
const STATEMENT_END = /(['"]|\}|\))\s*;?$|;$|^(export\s+)?import\s+[A-Za-z_$][\w$]*\s*=\s*[A-Za-z_$][\w$.]*$/;
|
|
11
|
+
const DISQUALIFY = /^export\s+(default|async\b|function\b|const\b|let\b|var\b|class\b|abstract\b|interface\b|enum\b|namespace\b|declare\b|type\s+[A-Za-z_$])/;
|
|
12
|
+
const SPECIFIER = String.raw `['"][^'"]+['"]`;
|
|
13
|
+
const NAME = String.raw `(type\s+)?([A-Za-z_$][\w$]*|${SPECIFIER})(\s+as\s+([A-Za-z_$][\w$]*|${SPECIFIER}))?`;
|
|
14
|
+
const ATTRIBUTES = String.raw `(\s+(with|assert)\s*\{[^}]*\}?)?`;
|
|
15
|
+
const CONTINUATION = new RegExp([
|
|
16
|
+
String.raw `^(\{?\s*${NAME}(\s*,\s*${NAME})*\s*,?\s*)?(\}\s*)?(from(\s+${SPECIFIER}${ATTRIBUTES})?)?\s*;?$`,
|
|
17
|
+
String.raw `^['"][^'"]*['"]${ATTRIBUTES}\s*;?$`,
|
|
18
|
+
String.raw `^\)\s*;?$`,
|
|
19
|
+
String.raw `^\*\s+as\s+[A-Za-z_$][\w$]*(\s+from(\s+${SPECIFIER}${ATTRIBUTES})?)?\s*;?$`,
|
|
20
|
+
String.raw `^(${SPECIFIER}|[A-Za-z_$][\w$]*)\s*:\s*${SPECIFIER}\s*,?$`,
|
|
21
|
+
].join('|'));
|
|
22
|
+
const MAX_IMPORT_LINE = 100_000;
|
|
23
|
+
const REGEX_PRECEDER = /(^|[(,=:[!&|?{};+\-*%<>~^]|(^|\.\.\.|[^\w$.])(return|typeof|instanceof|in|of|new|delete|void|throw|case|do|else|yield|await))$/;
|
|
24
|
+
const CONDITION_KEYWORDS = new Set(['if', 'while', 'for', 'with']);
|
|
25
|
+
const JSX_OPEN = /^<(>|(?!(const\s+)?[A-Za-z_$][\w$]*\s*(,|extends\b|=|>\s*\())[A-Za-z_$][\w$.:-]*[\s/>{<])/;
|
|
26
|
+
const TYPE_PARAMS_OR_TAG = /^<([A-Za-z_$][\w$]*)\s*>\s*\(/;
|
|
27
|
+
class SourceLines {
|
|
28
|
+
text;
|
|
29
|
+
lines;
|
|
30
|
+
stripped;
|
|
31
|
+
code;
|
|
32
|
+
startsInCode;
|
|
33
|
+
importLines;
|
|
34
|
+
constructor(text, { jsx = false } = {}) {
|
|
35
|
+
this.text = text;
|
|
36
|
+
this.lines = text.split('\n');
|
|
37
|
+
({ stripped: this.stripped, startsInCode: this.startsInCode } = SourceLines.scanCode(text, this.lines.length, jsx));
|
|
38
|
+
this.code = this.stripped.map(l => l.replace(/\s+/g, ''));
|
|
39
|
+
}
|
|
40
|
+
get count() {
|
|
41
|
+
return this.lines.length;
|
|
42
|
+
}
|
|
43
|
+
line(n) {
|
|
44
|
+
return this.lines[n - 1] ?? '';
|
|
45
|
+
}
|
|
46
|
+
slice(start, end) {
|
|
47
|
+
return this.lines.slice(start - 1, end).join('\n');
|
|
48
|
+
}
|
|
49
|
+
length(start, end) {
|
|
50
|
+
return this.slice(start, end).length;
|
|
51
|
+
}
|
|
52
|
+
isBlank(n) {
|
|
53
|
+
return this.line(n).trim() === '';
|
|
54
|
+
}
|
|
55
|
+
isCommentOnly(n) {
|
|
56
|
+
return !this.isBlank(n) && this.code[n - 1] === '';
|
|
57
|
+
}
|
|
58
|
+
isDirective(n) {
|
|
59
|
+
return DIRECTIVE.test(this.stripped[n - 1]?.trim() ?? '');
|
|
60
|
+
}
|
|
61
|
+
isPunctuationOnly(n) {
|
|
62
|
+
return PUNCTUATION_ONLY.test(this.code[n - 1] ?? '');
|
|
63
|
+
}
|
|
64
|
+
isSignificant(n) {
|
|
65
|
+
const code = this.code[n - 1] ?? '';
|
|
66
|
+
return code !== '' && !PUNCTUATION_ONLY.test(code);
|
|
67
|
+
}
|
|
68
|
+
significantLength(start, end) {
|
|
69
|
+
let n = 0;
|
|
70
|
+
for (let i = start; i <= end; i++)
|
|
71
|
+
n += (this.code[i - 1] ?? '').length;
|
|
72
|
+
return n;
|
|
73
|
+
}
|
|
74
|
+
importRegions(start, end) {
|
|
75
|
+
const regions = [];
|
|
76
|
+
let i = start;
|
|
77
|
+
while (i <= end) {
|
|
78
|
+
const stmtEnd = this.importStatementEnd(i, end);
|
|
79
|
+
if (stmtEnd === null) {
|
|
80
|
+
i++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
let regionEnd = stmtEnd;
|
|
84
|
+
let k = stmtEnd + 1;
|
|
85
|
+
while (k <= end) {
|
|
86
|
+
if (this.isBlank(k) || this.isCommentOnly(k)) {
|
|
87
|
+
k++;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const next = this.importStatementEnd(k, end);
|
|
91
|
+
if (next === null)
|
|
92
|
+
break;
|
|
93
|
+
regionEnd = next;
|
|
94
|
+
k = next + 1;
|
|
95
|
+
}
|
|
96
|
+
regions.push({ start: i, end: regionEnd });
|
|
97
|
+
i = regionEnd + 1;
|
|
98
|
+
}
|
|
99
|
+
return regions;
|
|
100
|
+
}
|
|
101
|
+
importStatementEnd(n, limit) {
|
|
102
|
+
if (!this.startsInCode[n - 1] || !this.startsImport(n, limit))
|
|
103
|
+
return null;
|
|
104
|
+
let needsModule = this.stripped[n - 1].trim() === 'import' && BARE_IMPORT_LIST.test(this.nextCode(n, limit));
|
|
105
|
+
let depth = 0;
|
|
106
|
+
for (let j = n; j <= limit; j++) {
|
|
107
|
+
const line = this.stripped[j - 1].trim();
|
|
108
|
+
if (line === '')
|
|
109
|
+
continue;
|
|
110
|
+
if (!SourceLines.isImportLine(line))
|
|
111
|
+
return null;
|
|
112
|
+
depth += SourceLines.bracketDepth(line);
|
|
113
|
+
if (MODULE_REFERENCE.test(line))
|
|
114
|
+
needsModule = false;
|
|
115
|
+
if (depth > 0 || !STATEMENT_END.test(line))
|
|
116
|
+
continue;
|
|
117
|
+
if (line.endsWith('}') && /^from\b/.test(this.nextCode(j, limit)))
|
|
118
|
+
continue;
|
|
119
|
+
return needsModule ? null : j;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
startsImport(n, limit) {
|
|
124
|
+
const line = this.stripped[n - 1].trim();
|
|
125
|
+
return IMPORT_START.test(line) || (line === 'import' && BARE_IMPORT_NEXT.test(this.nextCode(n, limit)));
|
|
126
|
+
}
|
|
127
|
+
nextCode(n, limit) {
|
|
128
|
+
for (let j = n + 1; j <= limit; j++) {
|
|
129
|
+
const line = this.stripped[j - 1].trim();
|
|
130
|
+
if (line !== '')
|
|
131
|
+
return line;
|
|
132
|
+
}
|
|
133
|
+
return '';
|
|
134
|
+
}
|
|
135
|
+
static bracketDepth(line) {
|
|
136
|
+
let depth = 0;
|
|
137
|
+
let quote = '';
|
|
138
|
+
for (let i = 0; i < line.length; i++) {
|
|
139
|
+
const ch = line[i];
|
|
140
|
+
if (quote) {
|
|
141
|
+
if (ch === '\\')
|
|
142
|
+
i++;
|
|
143
|
+
else if (ch === quote)
|
|
144
|
+
quote = '';
|
|
145
|
+
}
|
|
146
|
+
else if (ch === '\'' || ch === '"' || ch === '`')
|
|
147
|
+
quote = ch;
|
|
148
|
+
else if (ch === '{' || ch === '(')
|
|
149
|
+
depth++;
|
|
150
|
+
else if (ch === '}' || ch === ')')
|
|
151
|
+
depth--;
|
|
152
|
+
}
|
|
153
|
+
return depth;
|
|
154
|
+
}
|
|
155
|
+
static isImportOrReexportOnly(content) {
|
|
156
|
+
const src = new SourceLines(content);
|
|
157
|
+
return src.isImportOnly(1, src.count);
|
|
158
|
+
}
|
|
159
|
+
isImportOnly(start, end) {
|
|
160
|
+
const member = this.importStatementLines();
|
|
161
|
+
let any = false;
|
|
162
|
+
for (let n = start; n <= end; n++) {
|
|
163
|
+
if ((this.code[n - 1] ?? '') === '')
|
|
164
|
+
continue;
|
|
165
|
+
if (!member[n - 1])
|
|
166
|
+
return false;
|
|
167
|
+
any = true;
|
|
168
|
+
}
|
|
169
|
+
return any;
|
|
170
|
+
}
|
|
171
|
+
importStatementLines() {
|
|
172
|
+
if (this.importLines)
|
|
173
|
+
return this.importLines;
|
|
174
|
+
const member = Array.from({ length: this.count }, () => false);
|
|
175
|
+
for (let n = 1; n <= this.count;) {
|
|
176
|
+
const end = this.importStatementEnd(n, this.count);
|
|
177
|
+
if (end === null) {
|
|
178
|
+
n++;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
for (let k = n; k <= end; k++)
|
|
182
|
+
member[k - 1] = true;
|
|
183
|
+
n = end + 1;
|
|
184
|
+
}
|
|
185
|
+
return (this.importLines = member);
|
|
186
|
+
}
|
|
187
|
+
static isImportLine(line) {
|
|
188
|
+
if (line.length > MAX_IMPORT_LINE)
|
|
189
|
+
return false;
|
|
190
|
+
for (const [i, statement] of SourceLines.statements(line).entries()) {
|
|
191
|
+
if (DISQUALIFY.test(statement))
|
|
192
|
+
return false;
|
|
193
|
+
if (IMPORT_START.test(statement))
|
|
194
|
+
continue;
|
|
195
|
+
if (i === 0 && CONTINUATION.test(statement))
|
|
196
|
+
continue;
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
static statements(line) {
|
|
202
|
+
const out = [];
|
|
203
|
+
let from = 0;
|
|
204
|
+
let quote = '';
|
|
205
|
+
for (let i = 0; i < line.length; i++) {
|
|
206
|
+
const ch = line[i];
|
|
207
|
+
if (quote) {
|
|
208
|
+
if (ch === '\\')
|
|
209
|
+
i++;
|
|
210
|
+
else if (ch === quote)
|
|
211
|
+
quote = '';
|
|
212
|
+
}
|
|
213
|
+
else if (ch === '\'' || ch === '"' || ch === '`')
|
|
214
|
+
quote = ch;
|
|
215
|
+
else if (ch === ';') {
|
|
216
|
+
out.push(line.slice(from, i + 1));
|
|
217
|
+
from = i + 1;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
out.push(line.slice(from));
|
|
221
|
+
return out.map(t => t.trim()).filter(t => t !== '' && t !== ';');
|
|
222
|
+
}
|
|
223
|
+
static opensElement(text, i) {
|
|
224
|
+
const head = text.slice(i, i + 64);
|
|
225
|
+
if (JSX_OPEN.test(head))
|
|
226
|
+
return true;
|
|
227
|
+
const name = TYPE_PARAMS_OR_TAG.exec(head)?.[1];
|
|
228
|
+
return name !== undefined && text.includes(`</${name}>`, i);
|
|
229
|
+
}
|
|
230
|
+
static scanCode(text, lineCount, jsx) {
|
|
231
|
+
const stripped = Array.from({ length: lineCount }, () => '');
|
|
232
|
+
const startsInCode = Array.from({ length: lineCount }, () => true);
|
|
233
|
+
let line = 0;
|
|
234
|
+
let state = 'code';
|
|
235
|
+
const frames = [{ kind: 'code', braces: 0 }];
|
|
236
|
+
const parens = [];
|
|
237
|
+
let afterCondition = false;
|
|
238
|
+
let word = '';
|
|
239
|
+
let jsxString = false;
|
|
240
|
+
let continued = false;
|
|
241
|
+
let inClass = false;
|
|
242
|
+
let tail = '';
|
|
243
|
+
const emit = (chars) => {
|
|
244
|
+
stripped[line] += chars;
|
|
245
|
+
tail = (tail + chars.replace(/\s+/g, '')).slice(-16);
|
|
246
|
+
};
|
|
247
|
+
for (let i = 0; i < text.length; i++) {
|
|
248
|
+
const ch = text[i];
|
|
249
|
+
const next = text[i + 1];
|
|
250
|
+
const frame = frames[frames.length - 1];
|
|
251
|
+
if (ch === '\n') {
|
|
252
|
+
line++;
|
|
253
|
+
if (state === 'line' || state === 'regex')
|
|
254
|
+
state = 'code';
|
|
255
|
+
if ((state === '\'' || state === '"') && !jsxString && !continued)
|
|
256
|
+
state = 'code';
|
|
257
|
+
continued = false;
|
|
258
|
+
if (line < lineCount)
|
|
259
|
+
startsInCode[line] = state === 'code' && frame.kind === 'code';
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
switch (state) {
|
|
263
|
+
case 'line':
|
|
264
|
+
continue;
|
|
265
|
+
case 'block':
|
|
266
|
+
if (ch === '*' && next === '/') {
|
|
267
|
+
state = 'code';
|
|
268
|
+
i++;
|
|
269
|
+
}
|
|
270
|
+
continue;
|
|
271
|
+
case '\'':
|
|
272
|
+
case '"':
|
|
273
|
+
if (!jsxString && ch === '\\' && next !== undefined) {
|
|
274
|
+
continued = next === '\n' || (next === '\r' && text[i + 2] === '\n');
|
|
275
|
+
if (next === '\n') {
|
|
276
|
+
emit(ch);
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
emit(ch + next);
|
|
280
|
+
i++;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (ch === state)
|
|
284
|
+
state = 'code';
|
|
285
|
+
emit(ch);
|
|
286
|
+
continue;
|
|
287
|
+
case 'regex':
|
|
288
|
+
if (ch === '\\' && next !== undefined && next !== '\n') {
|
|
289
|
+
emit(ch + next);
|
|
290
|
+
i++;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (inClass) {
|
|
294
|
+
if (ch === ']')
|
|
295
|
+
inClass = false;
|
|
296
|
+
}
|
|
297
|
+
else if (ch === '[')
|
|
298
|
+
inClass = true;
|
|
299
|
+
else if (ch === '/')
|
|
300
|
+
state = 'code';
|
|
301
|
+
emit(ch);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
switch (frame.kind) {
|
|
305
|
+
case 'template':
|
|
306
|
+
if (ch === '\\' && next !== undefined && next !== '\n') {
|
|
307
|
+
emit(ch + next);
|
|
308
|
+
i++;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (ch === '`')
|
|
312
|
+
frames.pop();
|
|
313
|
+
else if (ch === '$' && next === '{') {
|
|
314
|
+
frames.push({ kind: 'code', braces: 0 });
|
|
315
|
+
emit('${');
|
|
316
|
+
i++;
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
emit(ch);
|
|
320
|
+
continue;
|
|
321
|
+
case 'children':
|
|
322
|
+
if (ch === '{')
|
|
323
|
+
frames.push({ kind: 'code', braces: 0 });
|
|
324
|
+
else if (ch === '<' && next === '/') {
|
|
325
|
+
frames.push({ kind: 'tag', closing: true, angles: 0 });
|
|
326
|
+
emit('</');
|
|
327
|
+
i++;
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
else if (ch === '<')
|
|
331
|
+
frames.push({ kind: 'tag', closing: false, angles: 0 });
|
|
332
|
+
emit(ch);
|
|
333
|
+
continue;
|
|
334
|
+
case 'tag':
|
|
335
|
+
if (ch === '/' && next === '/') {
|
|
336
|
+
state = 'line';
|
|
337
|
+
i++;
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (ch === '/' && next === '*') {
|
|
341
|
+
state = 'block';
|
|
342
|
+
emit(' ');
|
|
343
|
+
i++;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (ch === '/' && next === '>') {
|
|
347
|
+
frames.pop();
|
|
348
|
+
emit('/>');
|
|
349
|
+
i++;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (ch === '\'' || ch === '"') {
|
|
353
|
+
state = ch;
|
|
354
|
+
jsxString = true;
|
|
355
|
+
}
|
|
356
|
+
else if (ch === '{')
|
|
357
|
+
frames.push({ kind: 'code', braces: 0 });
|
|
358
|
+
else if (ch === '<')
|
|
359
|
+
frame.angles++;
|
|
360
|
+
else if (ch === '>' && frame.angles > 0)
|
|
361
|
+
frame.angles--;
|
|
362
|
+
else if (ch === '>') {
|
|
363
|
+
frames.pop();
|
|
364
|
+
if (frame.closing)
|
|
365
|
+
frames.pop();
|
|
366
|
+
else
|
|
367
|
+
frames.push({ kind: 'children' });
|
|
368
|
+
}
|
|
369
|
+
emit(ch);
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (ch === '/' && next === '/') {
|
|
373
|
+
state = 'line';
|
|
374
|
+
i++;
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
if (ch === '/' && next === '*') {
|
|
378
|
+
state = 'block';
|
|
379
|
+
emit(' ');
|
|
380
|
+
i++;
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
if (ch === '/' && (afterCondition || REGEX_PRECEDER.test(tail))) {
|
|
384
|
+
state = 'regex';
|
|
385
|
+
inClass = false;
|
|
386
|
+
}
|
|
387
|
+
else if (ch === '\'' || ch === '"') {
|
|
388
|
+
state = ch;
|
|
389
|
+
jsxString = false;
|
|
390
|
+
}
|
|
391
|
+
else if (ch === '`')
|
|
392
|
+
frames.push({ kind: 'template' });
|
|
393
|
+
else if (ch === '{')
|
|
394
|
+
frame.braces++;
|
|
395
|
+
else if (ch === '}' && frame.braces > 0)
|
|
396
|
+
frame.braces--;
|
|
397
|
+
else if (ch === '}' && frames.length > 1)
|
|
398
|
+
frames.pop();
|
|
399
|
+
else if (ch === '(')
|
|
400
|
+
parens.push(CONDITION_KEYWORDS.has(word));
|
|
401
|
+
else if (jsx && ch === '<' && !tail.endsWith('<') && REGEX_PRECEDER.test(tail) && SourceLines.opensElement(text, i)) {
|
|
402
|
+
frames.push({ kind: 'tag', closing: false, angles: 0 });
|
|
403
|
+
}
|
|
404
|
+
if (/[\w$]/.test(ch))
|
|
405
|
+
word = /[\w$]/.test(text[i - 1] ?? '') ? word + ch : ch;
|
|
406
|
+
else if (!/\s/.test(ch))
|
|
407
|
+
word = '';
|
|
408
|
+
if (!/\s/.test(ch))
|
|
409
|
+
afterCondition = ch === ')' && (parens.pop() ?? false);
|
|
410
|
+
emit(ch);
|
|
411
|
+
}
|
|
412
|
+
return { stripped, startsInCode };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
exports.SourceLines = SourceLines;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/** One edge in the traversal direction: forward (fromFile → toFile) for dependencies, backward for dependents. */
|
|
2
1
|
export interface Edge {
|
|
3
2
|
from: string;
|
|
4
3
|
to: string;
|
|
@@ -8,9 +7,4 @@ export interface IndirectRow {
|
|
|
8
7
|
depth: number;
|
|
9
8
|
via: string;
|
|
10
9
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Breadth-first, one `neighbours` call per depth level. Each reachable file is expanded
|
|
13
|
-
* at most once; `via` ties within a level are broken by byte order, not call order.
|
|
14
|
-
* Does not catch — a rejecting `neighbours` call rejects the whole traversal.
|
|
15
|
-
*/
|
|
16
10
|
export declare function traverse(root: string, neighbours: (frontier: string[]) => Promise<Edge[]>, maxDepth?: number): Promise<IndirectRow[]>;
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.traverse = traverse;
|
|
4
|
-
/** UTF-8 byte order (`COLLATE "C"`), not the platform locale or UTF-16 code-unit order. */
|
|
5
4
|
function byteCompare(a, b) {
|
|
6
5
|
return Buffer.compare(Buffer.from(a, 'utf8'), Buffer.from(b, 'utf8'));
|
|
7
6
|
}
|
|
8
|
-
/**
|
|
9
|
-
* Breadth-first, one `neighbours` call per depth level. Each reachable file is expanded
|
|
10
|
-
* at most once; `via` ties within a level are broken by byte order, not call order.
|
|
11
|
-
* Does not catch — a rejecting `neighbours` call rejects the whole traversal.
|
|
12
|
-
*/
|
|
13
7
|
async function traverse(root, neighbours, maxDepth = 20) {
|
|
14
8
|
const visited = new Map();
|
|
15
9
|
visited.set(root, 0);
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
import type { ChunkPiece } from './interfaces/IChunker';
|
|
2
2
|
import type { DepEdge, SymbolEntry } from './interfaces/IAstParser';
|
|
3
|
-
/**
|
|
4
|
-
* Build the embedding-input prompt for one chunk. `symbols` is the file's
|
|
5
|
-
* top-level declarations only (never members) — the prompt-owner-line
|
|
6
|
-
* experiment measured adding members and an owner line and found neither met
|
|
7
|
-
* the required MRR@10 gain, so this stays the shipped prompt.
|
|
8
|
-
*/
|
|
9
3
|
export declare function getEnrichedPrompt(piece: ChunkPiece, relPath: string, serviceName: string, edges: DepEdge[], symbols: SymbolEntry[]): string;
|
|
@@ -59,12 +59,6 @@ function inferRole(relPath) {
|
|
|
59
59
|
return 'Utility';
|
|
60
60
|
return null;
|
|
61
61
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Build the embedding-input prompt for one chunk. `symbols` is the file's
|
|
64
|
-
* top-level declarations only (never members) — the prompt-owner-line
|
|
65
|
-
* experiment measured adding members and an owner line and found neither met
|
|
66
|
-
* the required MRR@10 gain, so this stays the shipped prompt.
|
|
67
|
-
*/
|
|
68
62
|
function getEnrichedPrompt(piece, relPath, serviceName, edges, symbols) {
|
|
69
63
|
const chunkStart = piece.startLine;
|
|
70
64
|
const chunkEnd = piece.endLine;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MAX_CAUSES = 5;
|
|
2
|
+
export declare const MAX_FRAMES = 30;
|
|
3
|
+
export declare const MAX_QUERY_CHARS = 500;
|
|
4
|
+
export declare const MAX_PARAMS = 30;
|
|
5
|
+
export declare const MAX_PARAM_CHARS = 120;
|
|
6
|
+
export declare const MAX_AGGREGATED = 10;
|
|
7
|
+
export declare function serializeError(value: unknown): unknown;
|
|
8
|
+
export declare function rootCauseMessage(value: unknown): string;
|
|
9
|
+
export declare function errorMessage(value: unknown): string;
|
|
10
|
+
export declare const LOG_SERIALIZERS: {
|
|
11
|
+
err: typeof serializeError;
|
|
12
|
+
};
|