@code-rag/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/auth/audit-log.d.ts +35 -0
- package/dist/auth/audit-log.js +110 -0
- package/dist/auth/audit-log.js.map +1 -0
- package/dist/auth/audit-log.test.d.ts +1 -0
- package/dist/auth/audit-log.test.js +261 -0
- package/dist/auth/audit-log.test.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oidc-provider.d.ts +49 -0
- package/dist/auth/oidc-provider.js +358 -0
- package/dist/auth/oidc-provider.js.map +1 -0
- package/dist/auth/oidc-provider.test.d.ts +1 -0
- package/dist/auth/oidc-provider.test.js +520 -0
- package/dist/auth/oidc-provider.test.js.map +1 -0
- package/dist/auth/rbac.d.ts +29 -0
- package/dist/auth/rbac.js +75 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/auth/rbac.test.d.ts +1 -0
- package/dist/auth/rbac.test.js +224 -0
- package/dist/auth/rbac.test.js.map +1 -0
- package/dist/auth/saml-provider.d.ts +51 -0
- package/dist/auth/saml-provider.js +355 -0
- package/dist/auth/saml-provider.js.map +1 -0
- package/dist/auth/saml-provider.test.d.ts +1 -0
- package/dist/auth/saml-provider.test.js +422 -0
- package/dist/auth/saml-provider.test.js.map +1 -0
- package/dist/auth/types.d.ts +81 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/types.test.d.ts +1 -0
- package/dist/auth/types.test.js +147 -0
- package/dist/auth/types.test.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.d.ts +10 -0
- package/dist/backlog/ab-reference-scanner.js +22 -0
- package/dist/backlog/ab-reference-scanner.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/ab-reference-scanner.test.js +83 -0
- package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
- package/dist/backlog/azure-devops-provider.d.ts +59 -0
- package/dist/backlog/azure-devops-provider.js +283 -0
- package/dist/backlog/azure-devops-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.d.ts +13 -0
- package/dist/backlog/backlog-provider.js +6 -0
- package/dist/backlog/backlog-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.test.d.ts +1 -0
- package/dist/backlog/backlog-provider.test.js +426 -0
- package/dist/backlog/backlog-provider.test.js.map +1 -0
- package/dist/backlog/clickup-provider.d.ts +55 -0
- package/dist/backlog/clickup-provider.js +301 -0
- package/dist/backlog/clickup-provider.js.map +1 -0
- package/dist/backlog/clickup-provider.test.d.ts +1 -0
- package/dist/backlog/clickup-provider.test.js +426 -0
- package/dist/backlog/clickup-provider.test.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
- package/dist/backlog/clickup-reference-scanner.js +32 -0
- package/dist/backlog/clickup-reference-scanner.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/clickup-reference-scanner.test.js +92 -0
- package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
- package/dist/backlog/code-linker.d.ts +63 -0
- package/dist/backlog/code-linker.js +90 -0
- package/dist/backlog/code-linker.js.map +1 -0
- package/dist/backlog/code-linker.test.d.ts +1 -0
- package/dist/backlog/code-linker.test.js +325 -0
- package/dist/backlog/code-linker.test.js.map +1 -0
- package/dist/backlog/index.d.ts +14 -0
- package/dist/backlog/index.js +8 -0
- package/dist/backlog/index.js.map +1 -0
- package/dist/backlog/jira-provider.d.ts +60 -0
- package/dist/backlog/jira-provider.js +272 -0
- package/dist/backlog/jira-provider.js.map +1 -0
- package/dist/backlog/jira-provider.test.d.ts +1 -0
- package/dist/backlog/jira-provider.test.js +449 -0
- package/dist/backlog/jira-provider.test.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.d.ts +11 -0
- package/dist/backlog/jira-reference-scanner.js +26 -0
- package/dist/backlog/jira-reference-scanner.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/jira-reference-scanner.test.js +127 -0
- package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
- package/dist/backlog/types.d.ts +22 -0
- package/dist/backlog/types.js +1 -0
- package/dist/backlog/types.js.map +1 -0
- package/dist/chunker/ast-chunker.d.ts +45 -0
- package/dist/chunker/ast-chunker.js +292 -0
- package/dist/chunker/ast-chunker.js.map +1 -0
- package/dist/chunker/ast-chunker.test.d.ts +1 -0
- package/dist/chunker/ast-chunker.test.js +391 -0
- package/dist/chunker/ast-chunker.test.js.map +1 -0
- package/dist/chunker/chunker.d.ts +8 -0
- package/dist/chunker/chunker.js +1 -0
- package/dist/chunker/chunker.js.map +1 -0
- package/dist/chunker/index.d.ts +3 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/config/config-parser.d.ts +15 -0
- package/dist/config/config-parser.js +283 -0
- package/dist/config/config-parser.js.map +1 -0
- package/dist/config/config-parser.test.d.ts +1 -0
- package/dist/config/config-parser.test.js +699 -0
- package/dist/config/config-parser.test.js.map +1 -0
- package/dist/docs/confluence-provider.d.ts +121 -0
- package/dist/docs/confluence-provider.js +459 -0
- package/dist/docs/confluence-provider.js.map +1 -0
- package/dist/docs/confluence-provider.test.d.ts +1 -0
- package/dist/docs/confluence-provider.test.js +765 -0
- package/dist/docs/confluence-provider.test.js.map +1 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.js +2 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/sharepoint-provider.d.ts +150 -0
- package/dist/docs/sharepoint-provider.js +637 -0
- package/dist/docs/sharepoint-provider.js.map +1 -0
- package/dist/docs/sharepoint-provider.test.d.ts +1 -0
- package/dist/docs/sharepoint-provider.test.js +873 -0
- package/dist/docs/sharepoint-provider.test.js.map +1 -0
- package/dist/embedding/bm25-index.d.ts +12 -0
- package/dist/embedding/bm25-index.js +89 -0
- package/dist/embedding/bm25-index.js.map +1 -0
- package/dist/embedding/bm25-index.test.d.ts +1 -0
- package/dist/embedding/bm25-index.test.js +289 -0
- package/dist/embedding/bm25-index.test.js.map +1 -0
- package/dist/embedding/hybrid-search.d.ts +13 -0
- package/dist/embedding/hybrid-search.js +124 -0
- package/dist/embedding/hybrid-search.js.map +1 -0
- package/dist/embedding/hybrid-search.test.d.ts +1 -0
- package/dist/embedding/hybrid-search.test.js +266 -0
- package/dist/embedding/hybrid-search.test.js.map +1 -0
- package/dist/embedding/index.d.ts +11 -0
- package/dist/embedding/index.js +7 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/lancedb-store.d.ts +21 -0
- package/dist/embedding/lancedb-store.js +172 -0
- package/dist/embedding/lancedb-store.js.map +1 -0
- package/dist/embedding/lancedb-store.test.d.ts +1 -0
- package/dist/embedding/lancedb-store.test.js +268 -0
- package/dist/embedding/lancedb-store.test.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
- package/dist/embedding/model-lifecycle-manager.js +419 -0
- package/dist/embedding/model-lifecycle-manager.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
- package/dist/embedding/model-lifecycle-manager.test.js +642 -0
- package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
- package/dist/embedding/ollama-embedding-provider.js +74 -0
- package/dist/embedding/ollama-embedding-provider.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/ollama-embedding-provider.test.js +198 -0
- package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
- package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
- package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
- package/dist/embedding/qdrant-store.d.ts +28 -0
- package/dist/embedding/qdrant-store.js +174 -0
- package/dist/embedding/qdrant-store.js.map +1 -0
- package/dist/embedding/qdrant-store.test.d.ts +1 -0
- package/dist/embedding/qdrant-store.test.js +359 -0
- package/dist/embedding/qdrant-store.test.js.map +1 -0
- package/dist/enrichment/index.d.ts +4 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/nl-enricher.d.ts +16 -0
- package/dist/enrichment/nl-enricher.js +47 -0
- package/dist/enrichment/nl-enricher.js.map +1 -0
- package/dist/enrichment/nl-enricher.test.d.ts +1 -0
- package/dist/enrichment/nl-enricher.test.js +154 -0
- package/dist/enrichment/nl-enricher.test.js.map +1 -0
- package/dist/enrichment/ollama-client.d.ts +18 -0
- package/dist/enrichment/ollama-client.js +55 -0
- package/dist/enrichment/ollama-client.js.map +1 -0
- package/dist/enrichment/ollama-client.test.d.ts +1 -0
- package/dist/enrichment/ollama-client.test.js +129 -0
- package/dist/enrichment/ollama-client.test.js.map +1 -0
- package/dist/git/git-client.d.ts +22 -0
- package/dist/git/git-client.js +6 -0
- package/dist/git/git-client.js.map +1 -0
- package/dist/git/git-client.test.d.ts +1 -0
- package/dist/git/git-client.test.js +200 -0
- package/dist/git/git-client.test.js.map +1 -0
- package/dist/git/ignore-filter.d.ts +2 -0
- package/dist/git/ignore-filter.js +31 -0
- package/dist/git/ignore-filter.js.map +1 -0
- package/dist/git/ignore-filter.test.d.ts +1 -0
- package/dist/git/ignore-filter.test.js +87 -0
- package/dist/git/ignore-filter.test.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.js +3 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/simple-git-client.d.ts +12 -0
- package/dist/git/simple-git-client.js +138 -0
- package/dist/git/simple-git-client.js.map +1 -0
- package/dist/graph/cross-repo-resolver.d.ts +50 -0
- package/dist/graph/cross-repo-resolver.js +315 -0
- package/dist/graph/cross-repo-resolver.js.map +1 -0
- package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
- package/dist/graph/cross-repo-resolver.test.js +548 -0
- package/dist/graph/cross-repo-resolver.test.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +44 -0
- package/dist/graph/dependency-graph.js +108 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/dependency-graph.test.d.ts +1 -0
- package/dist/graph/dependency-graph.test.js +276 -0
- package/dist/graph/dependency-graph.test.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +11 -0
- package/dist/graph/graph-builder.js +113 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-builder.test.d.ts +1 -0
- package/dist/graph/graph-builder.test.js +178 -0
- package/dist/graph/graph-builder.test.js.map +1 -0
- package/dist/graph/import-resolver.d.ts +11 -0
- package/dist/graph/import-resolver.js +199 -0
- package/dist/graph/import-resolver.js.map +1 -0
- package/dist/graph/import-resolver.test.d.ts +1 -0
- package/dist/graph/import-resolver.test.js +282 -0
- package/dist/graph/import-resolver.test.js.map +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/file-scanner.d.ts +34 -0
- package/dist/indexer/file-scanner.js +69 -0
- package/dist/indexer/file-scanner.js.map +1 -0
- package/dist/indexer/file-scanner.test.d.ts +1 -0
- package/dist/indexer/file-scanner.test.js +110 -0
- package/dist/indexer/file-scanner.test.js.map +1 -0
- package/dist/indexer/file-watcher.d.ts +79 -0
- package/dist/indexer/file-watcher.js +148 -0
- package/dist/indexer/incremental-indexer.d.ts +67 -0
- package/dist/indexer/incremental-indexer.js +142 -0
- package/dist/indexer/incremental-indexer.js.map +1 -0
- package/dist/indexer/incremental-indexer.test.d.ts +1 -0
- package/dist/indexer/incremental-indexer.test.js +266 -0
- package/dist/indexer/incremental-indexer.test.js.map +1 -0
- package/dist/indexer/index-check.d.ts +22 -0
- package/dist/indexer/index-check.js +74 -0
- package/dist/indexer/index-check.js.map +1 -0
- package/dist/indexer/index-check.test.d.ts +1 -0
- package/dist/indexer/index-check.test.js +100 -0
- package/dist/indexer/index-check.test.js.map +1 -0
- package/dist/indexer/index-state.d.ts +61 -0
- package/dist/indexer/index-state.js +82 -0
- package/dist/indexer/index-state.js.map +1 -0
- package/dist/indexer/index-state.test.d.ts +1 -0
- package/dist/indexer/index-state.test.js +140 -0
- package/dist/indexer/index-state.test.js.map +1 -0
- package/dist/indexer/index.d.ts +12 -0
- package/dist/indexer/index.js +6 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.d.ts +63 -0
- package/dist/indexer/multi-repo-indexer.js +144 -0
- package/dist/indexer/multi-repo-indexer.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
- package/dist/indexer/multi-repo-indexer.test.js +238 -0
- package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/language-registry.d.ts +46 -0
- package/dist/parser/language-registry.js +219 -0
- package/dist/parser/language-registry.js.map +1 -0
- package/dist/parser/language-registry.test.d.ts +1 -0
- package/dist/parser/language-registry.test.js +225 -0
- package/dist/parser/language-registry.test.js.map +1 -0
- package/dist/parser/markdown-parser.d.ts +124 -0
- package/dist/parser/markdown-parser.js +487 -0
- package/dist/parser/markdown-parser.js.map +1 -0
- package/dist/parser/markdown-parser.test.d.ts +1 -0
- package/dist/parser/markdown-parser.test.js +600 -0
- package/dist/parser/markdown-parser.test.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +32 -0
- package/dist/parser/tree-sitter-parser.js +146 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/retrieval/context-expander.d.ts +51 -0
- package/dist/retrieval/context-expander.js +218 -0
- package/dist/retrieval/context-expander.js.map +1 -0
- package/dist/retrieval/context-expander.test.d.ts +1 -0
- package/dist/retrieval/context-expander.test.js +339 -0
- package/dist/retrieval/context-expander.test.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
- package/dist/retrieval/cross-encoder-reranker.js +90 -0
- package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
- package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
- package/dist/retrieval/index.d.ts +8 -0
- package/dist/retrieval/index.js +4 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/query-analyzer.d.ts +29 -0
- package/dist/retrieval/query-analyzer.js +238 -0
- package/dist/retrieval/query-analyzer.js.map +1 -0
- package/dist/retrieval/query-analyzer.test.d.ts +1 -0
- package/dist/retrieval/query-analyzer.test.js +236 -0
- package/dist/retrieval/query-analyzer.test.js.map +1 -0
- package/dist/retrieval/token-budget.d.ts +51 -0
- package/dist/retrieval/token-budget.js +141 -0
- package/dist/retrieval/token-budget.js.map +1 -0
- package/dist/retrieval/token-budget.test.d.ts +1 -0
- package/dist/retrieval/token-budget.test.js +404 -0
- package/dist/retrieval/token-budget.test.js.map +1 -0
- package/dist/storage/azure-blob-provider.d.ts +19 -0
- package/dist/storage/azure-blob-provider.js +199 -0
- package/dist/storage/azure-blob-provider.js.map +1 -0
- package/dist/storage/azure-blob-provider.test.d.ts +1 -0
- package/dist/storage/azure-blob-provider.test.js +250 -0
- package/dist/storage/azure-blob-provider.test.js.map +1 -0
- package/dist/storage/gcs-provider.d.ts +22 -0
- package/dist/storage/gcs-provider.js +241 -0
- package/dist/storage/gcs-provider.js.map +1 -0
- package/dist/storage/gcs-provider.test.d.ts +1 -0
- package/dist/storage/gcs-provider.test.js +299 -0
- package/dist/storage/gcs-provider.test.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +21 -0
- package/dist/storage/s3-provider.js +220 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/s3-provider.test.d.ts +1 -0
- package/dist/storage/s3-provider.test.js +329 -0
- package/dist/storage/s3-provider.test.js.map +1 -0
- package/dist/storage/types.d.ts +65 -0
- package/dist/storage/types.js +12 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types/chunk.d.ts +32 -0
- package/dist/types/chunk.js +1 -0
- package/dist/types/chunk.js.map +1 -0
- package/dist/types/config.d.ts +71 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +54 -0
- package/dist/types/provider.js +36 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/search.d.ts +27 -0
- package/dist/types/search.js +1 -0
- package/dist/types/search.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import TSParser from 'web-tree-sitter';
|
|
2
|
+
import { ok, err } from 'neverthrow';
|
|
3
|
+
import { ParseError } from '../types/provider.js';
|
|
4
|
+
import { LanguageRegistry } from './language-registry.js';
|
|
5
|
+
/**
|
|
6
|
+
* Extract a human-readable name from a tree-sitter AST node.
|
|
7
|
+
*
|
|
8
|
+
* Tries the following strategies in order:
|
|
9
|
+
* 1. `childForFieldName('name')` — works for most declarations
|
|
10
|
+
* 2. `childForFieldName('declaration')` then its 'name' child — for export wrappers
|
|
11
|
+
* 3. `childForFieldName('declarator')` then its 'name' child — for C/C++ style declarations
|
|
12
|
+
*
|
|
13
|
+
* Returns undefined if no name can be extracted.
|
|
14
|
+
*/
|
|
15
|
+
function extractNodeName(node) {
|
|
16
|
+
// Strategy 1: direct 'name' field
|
|
17
|
+
const nameNode = node.childForFieldName('name');
|
|
18
|
+
if (nameNode) {
|
|
19
|
+
return nameNode.text;
|
|
20
|
+
}
|
|
21
|
+
// Strategy 2: 'declaration' field with a 'name' sub-field
|
|
22
|
+
const declarationNode = node.childForFieldName('declaration');
|
|
23
|
+
if (declarationNode) {
|
|
24
|
+
const declName = declarationNode.childForFieldName('name');
|
|
25
|
+
if (declName) {
|
|
26
|
+
return declName.text;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Strategy 3: 'declarator' field with a 'name' sub-field
|
|
30
|
+
const declaratorNode = node.childForFieldName('declarator');
|
|
31
|
+
if (declaratorNode) {
|
|
32
|
+
const declrName = declaratorNode.childForFieldName('name');
|
|
33
|
+
if (declrName) {
|
|
34
|
+
return declrName.text;
|
|
35
|
+
}
|
|
36
|
+
// Some declarators (e.g. simple variable declarators) have the name directly as text
|
|
37
|
+
if (declaratorNode.type === 'identifier') {
|
|
38
|
+
return declaratorNode.text;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Walk the top-level children of a root AST node and extract declaration names.
|
|
45
|
+
*
|
|
46
|
+
* Only nodes whose type is in the provided `declarationTypes` set are considered.
|
|
47
|
+
*/
|
|
48
|
+
function extractDeclarations(rootNode, declarationTypes) {
|
|
49
|
+
const declarations = [];
|
|
50
|
+
for (let i = 0; i < rootNode.childCount; i++) {
|
|
51
|
+
const child = rootNode.child(i);
|
|
52
|
+
if (!child)
|
|
53
|
+
continue;
|
|
54
|
+
if (!declarationTypes.has(child.type))
|
|
55
|
+
continue;
|
|
56
|
+
const name = extractNodeName(child);
|
|
57
|
+
if (name) {
|
|
58
|
+
declarations.push(name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return declarations;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A Parser implementation that uses tree-sitter WASM bindings
|
|
65
|
+
* to parse source files and extract top-level declarations.
|
|
66
|
+
*/
|
|
67
|
+
export class TreeSitterParser {
|
|
68
|
+
parser = null;
|
|
69
|
+
registry = null;
|
|
70
|
+
initialized = false;
|
|
71
|
+
/**
|
|
72
|
+
* Initialize the tree-sitter WASM runtime and create internal instances.
|
|
73
|
+
* Must be called before `parse()`.
|
|
74
|
+
*/
|
|
75
|
+
async initialize() {
|
|
76
|
+
try {
|
|
77
|
+
await TSParser.init();
|
|
78
|
+
this.parser = new TSParser();
|
|
79
|
+
this.registry = new LanguageRegistry();
|
|
80
|
+
this.initialized = true;
|
|
81
|
+
return ok(undefined);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
85
|
+
return err(new ParseError(`Failed to initialize tree-sitter: ${message}`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse a source file and extract its top-level declarations.
|
|
90
|
+
*
|
|
91
|
+
* Detects the language from the file path, loads the corresponding WASM grammar,
|
|
92
|
+
* parses the content into an AST, and extracts declaration names.
|
|
93
|
+
*/
|
|
94
|
+
async parse(filePath, content) {
|
|
95
|
+
if (!this.initialized || !this.parser || !this.registry) {
|
|
96
|
+
return err(new ParseError('TreeSitterParser not initialized. Call initialize() first.'));
|
|
97
|
+
}
|
|
98
|
+
const language = this.registry.detectLanguage(filePath);
|
|
99
|
+
if (!language) {
|
|
100
|
+
return err(new ParseError(`Unsupported file type: ${filePath}`));
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const tsLanguage = await this.registry.loadLanguage(language);
|
|
104
|
+
this.parser.setLanguage(tsLanguage);
|
|
105
|
+
const tree = this.parser.parse(content);
|
|
106
|
+
if (!tree) {
|
|
107
|
+
return err(new ParseError(`Failed to parse file: ${filePath}`));
|
|
108
|
+
}
|
|
109
|
+
const declarationTypes = this.registry.getDeclarationNodeTypes(language);
|
|
110
|
+
const declarations = extractDeclarations(tree.rootNode, declarationTypes);
|
|
111
|
+
tree.delete();
|
|
112
|
+
return ok({
|
|
113
|
+
filePath,
|
|
114
|
+
language,
|
|
115
|
+
content,
|
|
116
|
+
declarations,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const message = error instanceof Error
|
|
121
|
+
? (error.message || error.constructor.name)
|
|
122
|
+
: String(error);
|
|
123
|
+
return err(new ParseError(`Error parsing ${filePath}: ${message}`));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the list of all file extensions / languages this parser supports.
|
|
128
|
+
*/
|
|
129
|
+
supportedLanguages() {
|
|
130
|
+
if (!this.registry) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
return this.registry.supportedLanguages();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clean up parser resources.
|
|
137
|
+
*/
|
|
138
|
+
dispose() {
|
|
139
|
+
if (this.parser) {
|
|
140
|
+
this.parser.delete();
|
|
141
|
+
this.parser = null;
|
|
142
|
+
}
|
|
143
|
+
this.registry = null;
|
|
144
|
+
this.initialized = false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-parser.js","sourceRoot":"","sources":["../../src/parser/tree-sitter-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SearchResult } from '../types/index.js';
|
|
2
|
+
import type { GraphNode, GraphEdge } from '../graph/index.js';
|
|
3
|
+
/** Read-only graph interface for dependency inversion. */
|
|
4
|
+
export interface ReadonlyGraph {
|
|
5
|
+
getNode(id: string): GraphNode | undefined;
|
|
6
|
+
getEdges(nodeId: string): GraphEdge[];
|
|
7
|
+
getIncomingEdges(nodeId: string): GraphEdge[];
|
|
8
|
+
}
|
|
9
|
+
export type RelationshipType = 'imports' | 'imported_by' | 'test_for' | 'interface_of' | 'sibling' | 'backlog';
|
|
10
|
+
export interface RelatedChunk {
|
|
11
|
+
chunk: SearchResult;
|
|
12
|
+
relationship: RelationshipType;
|
|
13
|
+
distance: number;
|
|
14
|
+
}
|
|
15
|
+
export interface GraphExcerpt {
|
|
16
|
+
nodes: string[];
|
|
17
|
+
edges: Array<{
|
|
18
|
+
from: string;
|
|
19
|
+
to: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export interface ExpandedContext {
|
|
24
|
+
primaryResults: SearchResult[];
|
|
25
|
+
relatedChunks: RelatedChunk[];
|
|
26
|
+
graphExcerpt: GraphExcerpt;
|
|
27
|
+
}
|
|
28
|
+
export declare class ContextExpander {
|
|
29
|
+
private readonly graph;
|
|
30
|
+
private readonly chunkLookup;
|
|
31
|
+
constructor(dependencyGraph: ReadonlyGraph, chunkLookup: (chunkId: string) => SearchResult | undefined);
|
|
32
|
+
/**
|
|
33
|
+
* Expand search results with graph-based context.
|
|
34
|
+
* For each result, walks the dependency graph to find related chunks
|
|
35
|
+
* and classifies their relationships.
|
|
36
|
+
*/
|
|
37
|
+
expand(results: SearchResult[], maxRelated?: number): ExpandedContext;
|
|
38
|
+
/**
|
|
39
|
+
* Classify the relationship between two nodes based on graph edges and naming conventions.
|
|
40
|
+
*/
|
|
41
|
+
private classifyRelationship;
|
|
42
|
+
/**
|
|
43
|
+
* Single-pass BFS from source, returning a Map of nodeId → distance
|
|
44
|
+
* for all nodes reachable within 2 hops (excludes the source itself).
|
|
45
|
+
*/
|
|
46
|
+
private computeDistances;
|
|
47
|
+
/**
|
|
48
|
+
* Collect graph edges from a node and its related nodes for the excerpt.
|
|
49
|
+
*/
|
|
50
|
+
private collectEdges;
|
|
51
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
const DEFAULT_MAX_RELATED = 10;
|
|
2
|
+
export class ContextExpander {
|
|
3
|
+
graph;
|
|
4
|
+
chunkLookup;
|
|
5
|
+
constructor(dependencyGraph, chunkLookup) {
|
|
6
|
+
this.graph = dependencyGraph;
|
|
7
|
+
this.chunkLookup = chunkLookup;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Expand search results with graph-based context.
|
|
11
|
+
* For each result, walks the dependency graph to find related chunks
|
|
12
|
+
* and classifies their relationships.
|
|
13
|
+
*/
|
|
14
|
+
expand(results, maxRelated = DEFAULT_MAX_RELATED) {
|
|
15
|
+
const relatedMap = new Map();
|
|
16
|
+
const graphNodes = new Set();
|
|
17
|
+
const graphEdges = [];
|
|
18
|
+
const primaryIds = new Set(results.map((r) => r.chunkId));
|
|
19
|
+
for (const result of results) {
|
|
20
|
+
const nodeId = result.chunkId;
|
|
21
|
+
graphNodes.add(nodeId);
|
|
22
|
+
// Single BFS pass: get related nodes and their distances in one traversal
|
|
23
|
+
const distanceMap = this.computeDistances(nodeId);
|
|
24
|
+
const relatedNodeIds = new Set(distanceMap.keys());
|
|
25
|
+
for (const relatedId of relatedNodeIds) {
|
|
26
|
+
graphNodes.add(relatedId);
|
|
27
|
+
// Don't add primary results as related chunks
|
|
28
|
+
if (primaryIds.has(relatedId))
|
|
29
|
+
continue;
|
|
30
|
+
// Don't add duplicates — keep the one with shortest distance
|
|
31
|
+
if (relatedMap.has(relatedId))
|
|
32
|
+
continue;
|
|
33
|
+
const relatedResult = this.chunkLookup(relatedId);
|
|
34
|
+
if (!relatedResult)
|
|
35
|
+
continue;
|
|
36
|
+
const relationship = this.classifyRelationship(nodeId, relatedId);
|
|
37
|
+
const distance = distanceMap.get(relatedId) ?? 3;
|
|
38
|
+
relatedMap.set(relatedId, {
|
|
39
|
+
chunk: relatedResult,
|
|
40
|
+
relationship,
|
|
41
|
+
distance,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Collect edges for graph excerpt
|
|
45
|
+
this.collectEdges(nodeId, relatedNodeIds, graphEdges);
|
|
46
|
+
}
|
|
47
|
+
// Sort related chunks by distance (closest first), then limit
|
|
48
|
+
const relatedChunks = [...relatedMap.values()]
|
|
49
|
+
.sort((a, b) => a.distance - b.distance)
|
|
50
|
+
.slice(0, maxRelated);
|
|
51
|
+
return {
|
|
52
|
+
primaryResults: results,
|
|
53
|
+
relatedChunks,
|
|
54
|
+
graphExcerpt: {
|
|
55
|
+
nodes: [...graphNodes],
|
|
56
|
+
edges: deduplicateEdges(graphEdges),
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Classify the relationship between two nodes based on graph edges and naming conventions.
|
|
62
|
+
*/
|
|
63
|
+
classifyRelationship(sourceId, relatedId) {
|
|
64
|
+
const sourceNode = this.graph.getNode(sourceId);
|
|
65
|
+
const relatedNode = this.graph.getNode(relatedId);
|
|
66
|
+
// Check if either node is a backlog item
|
|
67
|
+
if (sourceNode?.type === 'backlog' || relatedNode?.type === 'backlog') {
|
|
68
|
+
return 'backlog';
|
|
69
|
+
}
|
|
70
|
+
// Check if the related file is a test file for the source
|
|
71
|
+
if (relatedNode?.filePath && isTestFileFor(relatedNode.filePath, sourceNode?.filePath)) {
|
|
72
|
+
return 'test_for';
|
|
73
|
+
}
|
|
74
|
+
if (sourceNode?.filePath && isTestFileFor(sourceNode.filePath, relatedNode?.filePath)) {
|
|
75
|
+
return 'test_for';
|
|
76
|
+
}
|
|
77
|
+
// Check direct edges for imports / imported_by
|
|
78
|
+
const outgoingEdges = this.graph.getEdges(sourceId);
|
|
79
|
+
for (const edge of outgoingEdges) {
|
|
80
|
+
if (edge.target === relatedId) {
|
|
81
|
+
if (edge.type === 'implements') {
|
|
82
|
+
return 'interface_of';
|
|
83
|
+
}
|
|
84
|
+
return 'imports';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const incomingEdges = this.graph.getIncomingEdges(sourceId);
|
|
88
|
+
for (const edge of incomingEdges) {
|
|
89
|
+
if (edge.source === relatedId) {
|
|
90
|
+
if (edge.type === 'implements') {
|
|
91
|
+
return 'interface_of';
|
|
92
|
+
}
|
|
93
|
+
return 'imported_by';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check if they share the same directory (siblings)
|
|
97
|
+
if (sourceNode?.filePath &&
|
|
98
|
+
relatedNode?.filePath &&
|
|
99
|
+
sameDirectory(sourceNode.filePath, relatedNode.filePath)) {
|
|
100
|
+
return 'sibling';
|
|
101
|
+
}
|
|
102
|
+
// Default: treat as imports if connected at all
|
|
103
|
+
return 'imports';
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Single-pass BFS from source, returning a Map of nodeId → distance
|
|
107
|
+
* for all nodes reachable within 2 hops (excludes the source itself).
|
|
108
|
+
*/
|
|
109
|
+
computeDistances(sourceId) {
|
|
110
|
+
const distances = new Map();
|
|
111
|
+
const visited = new Set();
|
|
112
|
+
const queue = [
|
|
113
|
+
{ id: sourceId, depth: 0 },
|
|
114
|
+
];
|
|
115
|
+
while (queue.length > 0) {
|
|
116
|
+
const current = queue.shift();
|
|
117
|
+
if (visited.has(current.id))
|
|
118
|
+
continue;
|
|
119
|
+
visited.add(current.id);
|
|
120
|
+
if (current.id !== sourceId) {
|
|
121
|
+
distances.set(current.id, current.depth);
|
|
122
|
+
}
|
|
123
|
+
if (current.depth < 2) {
|
|
124
|
+
const neighbors = [
|
|
125
|
+
...this.graph.getEdges(current.id).map((e) => e.target),
|
|
126
|
+
...this.graph.getIncomingEdges(current.id).map((e) => e.source),
|
|
127
|
+
];
|
|
128
|
+
for (const neighbor of neighbors) {
|
|
129
|
+
if (!visited.has(neighbor)) {
|
|
130
|
+
queue.push({ id: neighbor, depth: current.depth + 1 });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return distances;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Collect graph edges from a node and its related nodes for the excerpt.
|
|
139
|
+
*/
|
|
140
|
+
collectEdges(nodeId, relatedNodeIds, graphEdges) {
|
|
141
|
+
const relevantIds = new Set([nodeId, ...relatedNodeIds]);
|
|
142
|
+
// Add outgoing edges from the node
|
|
143
|
+
for (const edge of this.graph.getEdges(nodeId)) {
|
|
144
|
+
if (relevantIds.has(edge.target)) {
|
|
145
|
+
graphEdges.push({
|
|
146
|
+
from: edge.source,
|
|
147
|
+
to: edge.target,
|
|
148
|
+
type: edge.type,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Add incoming edges to the node
|
|
153
|
+
for (const edge of this.graph.getIncomingEdges(nodeId)) {
|
|
154
|
+
if (relevantIds.has(edge.source)) {
|
|
155
|
+
graphEdges.push({
|
|
156
|
+
from: edge.source,
|
|
157
|
+
to: edge.target,
|
|
158
|
+
type: edge.type,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Add edges between related nodes
|
|
163
|
+
for (const relatedId of relatedNodeIds) {
|
|
164
|
+
for (const edge of this.graph.getEdges(relatedId)) {
|
|
165
|
+
if (relevantIds.has(edge.target)) {
|
|
166
|
+
graphEdges.push({
|
|
167
|
+
from: edge.source,
|
|
168
|
+
to: edge.target,
|
|
169
|
+
type: edge.type,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Check if `testPath` is a test file for `sourcePath`. */
|
|
177
|
+
function isTestFileFor(testPath, sourcePath) {
|
|
178
|
+
if (!sourcePath)
|
|
179
|
+
return false;
|
|
180
|
+
// Check patterns: foo.test.ts, foo.spec.ts, __tests__/foo.ts
|
|
181
|
+
const testPatterns = ['.test.', '.spec.', '/__tests__/'];
|
|
182
|
+
const isTestFile = testPatterns.some((p) => testPath.includes(p));
|
|
183
|
+
if (!isTestFile)
|
|
184
|
+
return false;
|
|
185
|
+
// Check if the base file names match
|
|
186
|
+
const sourceBase = getBaseName(sourcePath);
|
|
187
|
+
const testBase = getBaseName(testPath)
|
|
188
|
+
.replace(/\.test$/, '')
|
|
189
|
+
.replace(/\.spec$/, '');
|
|
190
|
+
return sourceBase === testBase;
|
|
191
|
+
}
|
|
192
|
+
/** Extract base file name without extension. */
|
|
193
|
+
function getBaseName(filePath) {
|
|
194
|
+
const parts = filePath.split('/');
|
|
195
|
+
const fileName = parts[parts.length - 1] ?? '';
|
|
196
|
+
// Remove all extensions
|
|
197
|
+
const dotIndex = fileName.indexOf('.');
|
|
198
|
+
return dotIndex === -1 ? fileName : fileName.substring(0, dotIndex);
|
|
199
|
+
}
|
|
200
|
+
/** Check if two file paths share the same directory. */
|
|
201
|
+
function sameDirectory(pathA, pathB) {
|
|
202
|
+
const dirA = pathA.substring(0, pathA.lastIndexOf('/'));
|
|
203
|
+
const dirB = pathB.substring(0, pathB.lastIndexOf('/'));
|
|
204
|
+
return dirA === dirB && dirA.length > 0;
|
|
205
|
+
}
|
|
206
|
+
/** Deduplicate graph edges by from+to+type. */
|
|
207
|
+
function deduplicateEdges(edges) {
|
|
208
|
+
const seen = new Set();
|
|
209
|
+
const result = [];
|
|
210
|
+
for (const edge of edges) {
|
|
211
|
+
const key = `${edge.from}|${edge.to}|${edge.type}`;
|
|
212
|
+
if (!seen.has(key)) {
|
|
213
|
+
seen.add(key);
|
|
214
|
+
result.push(edge);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-expander.js","sourceRoot":"","sources":["../../src/retrieval/context-expander.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|