edhindex 1.0.3 → 2.0.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.
Files changed (277) hide show
  1. package/README.md +63 -9
  2. package/dist/cli/commands/index_cmd.d.ts.map +1 -1
  3. package/dist/cli/commands/index_cmd.js +2 -0
  4. package/dist/cli/commands/index_cmd.js.map +1 -1
  5. package/dist/cli/commands/start.d.ts.map +1 -1
  6. package/dist/cli/commands/start.js +3 -1
  7. package/dist/cli/commands/start.js.map +1 -1
  8. package/dist/cli/index.js +1 -1
  9. package/dist/config/index.js +1 -1
  10. package/dist/config/index.js.map +1 -1
  11. package/dist/embeddings/transformers.d.ts.map +1 -1
  12. package/dist/graph/builder.d.ts.map +1 -1
  13. package/dist/graph/builder.js +18 -0
  14. package/dist/graph/builder.js.map +1 -1
  15. package/dist/graph/serve.js.map +1 -1
  16. package/dist/graph/service.d.ts.map +1 -1
  17. package/dist/graph/storage.d.ts.map +1 -1
  18. package/dist/graph/types.d.ts +1 -1
  19. package/dist/graph/types.d.ts.map +1 -1
  20. package/dist/graph/types.js.map +1 -1
  21. package/dist/indexer/chunker.d.ts +2 -2
  22. package/dist/indexer/chunker.d.ts.map +1 -1
  23. package/dist/indexer/chunker.js +7 -5
  24. package/dist/indexer/chunker.js.map +1 -1
  25. package/dist/indexer/file-utils.d.ts +2 -3
  26. package/dist/indexer/file-utils.d.ts.map +1 -1
  27. package/dist/indexer/file-utils.js +4 -33
  28. package/dist/indexer/file-utils.js.map +1 -1
  29. package/dist/indexer/fixture.test.d.ts +2 -0
  30. package/dist/indexer/fixture.test.d.ts.map +1 -0
  31. package/dist/indexer/fixture.test.js +104 -0
  32. package/dist/indexer/fixture.test.js.map +1 -0
  33. package/dist/indexer/indexer.d.ts +3 -1
  34. package/dist/indexer/indexer.d.ts.map +1 -1
  35. package/dist/indexer/indexer.js +8 -32
  36. package/dist/indexer/indexer.js.map +1 -1
  37. package/dist/indexer/parser.d.ts.map +1 -1
  38. package/dist/indexer/parser.js +196 -14
  39. package/dist/indexer/parser.js.map +1 -1
  40. package/dist/indexer/parser.test.d.ts +2 -0
  41. package/dist/indexer/parser.test.d.ts.map +1 -0
  42. package/dist/indexer/parser.test.js +120 -0
  43. package/dist/indexer/parser.test.js.map +1 -0
  44. package/dist/language/adapters/astro.d.ts +12 -0
  45. package/dist/language/adapters/astro.d.ts.map +1 -0
  46. package/dist/language/adapters/astro.js +195 -0
  47. package/dist/language/adapters/astro.js.map +1 -0
  48. package/dist/language/adapters/c.d.ts +7 -0
  49. package/dist/language/adapters/c.d.ts.map +1 -0
  50. package/dist/language/adapters/c.js +25 -0
  51. package/dist/language/adapters/c.js.map +1 -0
  52. package/dist/language/adapters/config.d.ts +14 -0
  53. package/dist/language/adapters/config.d.ts.map +1 -0
  54. package/dist/language/adapters/config.js +136 -0
  55. package/dist/language/adapters/config.js.map +1 -0
  56. package/dist/language/adapters/cpp.d.ts +7 -0
  57. package/dist/language/adapters/cpp.d.ts.map +1 -0
  58. package/dist/language/adapters/cpp.js +29 -0
  59. package/dist/language/adapters/cpp.js.map +1 -0
  60. package/dist/language/adapters/csharp.d.ts +7 -0
  61. package/dist/language/adapters/csharp.d.ts.map +1 -0
  62. package/dist/language/adapters/csharp.js +32 -0
  63. package/dist/language/adapters/csharp.js.map +1 -0
  64. package/dist/language/adapters/css.d.ts +10 -0
  65. package/dist/language/adapters/css.d.ts.map +1 -0
  66. package/dist/language/adapters/css.js +54 -0
  67. package/dist/language/adapters/css.js.map +1 -0
  68. package/dist/language/adapters/csv.d.ts +11 -0
  69. package/dist/language/adapters/csv.d.ts.map +1 -0
  70. package/dist/language/adapters/csv.js +103 -0
  71. package/dist/language/adapters/csv.js.map +1 -0
  72. package/dist/language/adapters/dart.d.ts +7 -0
  73. package/dist/language/adapters/dart.d.ts.map +1 -0
  74. package/dist/language/adapters/dart.js +37 -0
  75. package/dist/language/adapters/dart.js.map +1 -0
  76. package/dist/language/adapters/dockerfile.d.ts +12 -0
  77. package/dist/language/adapters/dockerfile.d.ts.map +1 -0
  78. package/dist/language/adapters/dockerfile.js +71 -0
  79. package/dist/language/adapters/dockerfile.js.map +1 -0
  80. package/dist/language/adapters/documentation.d.ts +12 -0
  81. package/dist/language/adapters/documentation.d.ts.map +1 -0
  82. package/dist/language/adapters/documentation.js +146 -0
  83. package/dist/language/adapters/documentation.js.map +1 -0
  84. package/dist/language/adapters/go.d.ts +7 -0
  85. package/dist/language/adapters/go.d.ts.map +1 -0
  86. package/dist/language/adapters/go.js +26 -0
  87. package/dist/language/adapters/go.js.map +1 -0
  88. package/dist/language/adapters/haskell.d.ts +7 -0
  89. package/dist/language/adapters/haskell.d.ts.map +1 -0
  90. package/dist/language/adapters/haskell.js +33 -0
  91. package/dist/language/adapters/haskell.js.map +1 -0
  92. package/dist/language/adapters/html.d.ts +11 -0
  93. package/dist/language/adapters/html.d.ts.map +1 -0
  94. package/dist/language/adapters/html.js +67 -0
  95. package/dist/language/adapters/html.js.map +1 -0
  96. package/dist/language/adapters/java.d.ts +7 -0
  97. package/dist/language/adapters/java.d.ts.map +1 -0
  98. package/dist/language/adapters/java.js +30 -0
  99. package/dist/language/adapters/java.js.map +1 -0
  100. package/dist/language/adapters/javascript.d.ts +7 -0
  101. package/dist/language/adapters/javascript.d.ts.map +1 -0
  102. package/dist/language/adapters/javascript.js +31 -0
  103. package/dist/language/adapters/javascript.js.map +1 -0
  104. package/dist/language/adapters/json-variants.d.ts +11 -0
  105. package/dist/language/adapters/json-variants.d.ts.map +1 -0
  106. package/dist/language/adapters/json-variants.js +57 -0
  107. package/dist/language/adapters/json-variants.js.map +1 -0
  108. package/dist/language/adapters/json.d.ts +11 -0
  109. package/dist/language/adapters/json.d.ts.map +1 -0
  110. package/dist/language/adapters/json.js +57 -0
  111. package/dist/language/adapters/json.js.map +1 -0
  112. package/dist/language/adapters/kotlin.d.ts +7 -0
  113. package/dist/language/adapters/kotlin.d.ts.map +1 -0
  114. package/dist/language/adapters/kotlin.js +35 -0
  115. package/dist/language/adapters/kotlin.js.map +1 -0
  116. package/dist/language/adapters/lua.d.ts +7 -0
  117. package/dist/language/adapters/lua.d.ts.map +1 -0
  118. package/dist/language/adapters/lua.js +32 -0
  119. package/dist/language/adapters/lua.js.map +1 -0
  120. package/dist/language/adapters/markdown.d.ts +12 -0
  121. package/dist/language/adapters/markdown.d.ts.map +1 -0
  122. package/dist/language/adapters/markdown.js +76 -0
  123. package/dist/language/adapters/markdown.js.map +1 -0
  124. package/dist/language/adapters/php.d.ts +7 -0
  125. package/dist/language/adapters/php.d.ts.map +1 -0
  126. package/dist/language/adapters/php.js +29 -0
  127. package/dist/language/adapters/php.js.map +1 -0
  128. package/dist/language/adapters/python.d.ts +7 -0
  129. package/dist/language/adapters/python.d.ts.map +1 -0
  130. package/dist/language/adapters/python.js +27 -0
  131. package/dist/language/adapters/python.js.map +1 -0
  132. package/dist/language/adapters/ruby.d.ts +7 -0
  133. package/dist/language/adapters/ruby.d.ts.map +1 -0
  134. package/dist/language/adapters/ruby.js +29 -0
  135. package/dist/language/adapters/ruby.js.map +1 -0
  136. package/dist/language/adapters/rust.d.ts +7 -0
  137. package/dist/language/adapters/rust.d.ts.map +1 -0
  138. package/dist/language/adapters/rust.js +31 -0
  139. package/dist/language/adapters/rust.js.map +1 -0
  140. package/dist/language/adapters/salesforce.d.ts +15 -0
  141. package/dist/language/adapters/salesforce.d.ts.map +1 -0
  142. package/dist/language/adapters/salesforce.js +223 -0
  143. package/dist/language/adapters/salesforce.js.map +1 -0
  144. package/dist/language/adapters/scala.d.ts +7 -0
  145. package/dist/language/adapters/scala.d.ts.map +1 -0
  146. package/dist/language/adapters/scala.js +37 -0
  147. package/dist/language/adapters/scala.js.map +1 -0
  148. package/dist/language/adapters/solidity.d.ts +7 -0
  149. package/dist/language/adapters/solidity.d.ts.map +1 -0
  150. package/dist/language/adapters/solidity.js +40 -0
  151. package/dist/language/adapters/solidity.js.map +1 -0
  152. package/dist/language/adapters/sql.d.ts +12 -0
  153. package/dist/language/adapters/sql.d.ts.map +1 -0
  154. package/dist/language/adapters/sql.js +93 -0
  155. package/dist/language/adapters/sql.js.map +1 -0
  156. package/dist/language/adapters/svelte.d.ts +11 -0
  157. package/dist/language/adapters/svelte.d.ts.map +1 -0
  158. package/dist/language/adapters/svelte.js +76 -0
  159. package/dist/language/adapters/svelte.js.map +1 -0
  160. package/dist/language/adapters/svg.d.ts +13 -0
  161. package/dist/language/adapters/svg.d.ts.map +1 -0
  162. package/dist/language/adapters/svg.js +130 -0
  163. package/dist/language/adapters/svg.js.map +1 -0
  164. package/dist/language/adapters/swift.d.ts +7 -0
  165. package/dist/language/adapters/swift.d.ts.map +1 -0
  166. package/dist/language/adapters/swift.js +42 -0
  167. package/dist/language/adapters/swift.js.map +1 -0
  168. package/dist/language/adapters/terraform.d.ts +7 -0
  169. package/dist/language/adapters/terraform.d.ts.map +1 -0
  170. package/dist/language/adapters/terraform.js +23 -0
  171. package/dist/language/adapters/terraform.js.map +1 -0
  172. package/dist/language/adapters/text.d.ts +14 -0
  173. package/dist/language/adapters/text.d.ts.map +1 -0
  174. package/dist/language/adapters/text.js +178 -0
  175. package/dist/language/adapters/text.js.map +1 -0
  176. package/dist/language/adapters/toml.d.ts +12 -0
  177. package/dist/language/adapters/toml.d.ts.map +1 -0
  178. package/dist/language/adapters/toml.js +79 -0
  179. package/dist/language/adapters/toml.js.map +1 -0
  180. package/dist/language/adapters/typescript.d.ts +7 -0
  181. package/dist/language/adapters/typescript.d.ts.map +1 -0
  182. package/dist/language/adapters/typescript.js +35 -0
  183. package/dist/language/adapters/typescript.js.map +1 -0
  184. package/dist/language/adapters/vue.d.ts +11 -0
  185. package/dist/language/adapters/vue.d.ts.map +1 -0
  186. package/dist/language/adapters/vue.js +67 -0
  187. package/dist/language/adapters/vue.js.map +1 -0
  188. package/dist/language/adapters/xml.d.ts +12 -0
  189. package/dist/language/adapters/xml.d.ts.map +1 -0
  190. package/dist/language/adapters/xml.js +71 -0
  191. package/dist/language/adapters/xml.js.map +1 -0
  192. package/dist/language/adapters/yaml.d.ts +11 -0
  193. package/dist/language/adapters/yaml.d.ts.map +1 -0
  194. package/dist/language/adapters/yaml.js +60 -0
  195. package/dist/language/adapters/yaml.js.map +1 -0
  196. package/dist/language/base.d.ts +34 -0
  197. package/dist/language/base.d.ts.map +1 -0
  198. package/dist/language/base.js +144 -0
  199. package/dist/language/base.js.map +1 -0
  200. package/dist/language/generic.d.ts +11 -0
  201. package/dist/language/generic.d.ts.map +1 -0
  202. package/dist/language/generic.js +51 -0
  203. package/dist/language/generic.js.map +1 -0
  204. package/dist/language/registry.d.ts +29 -0
  205. package/dist/language/registry.d.ts.map +1 -0
  206. package/dist/language/registry.js +162 -0
  207. package/dist/language/registry.js.map +1 -0
  208. package/dist/language/types.d.ts +68 -0
  209. package/dist/language/types.d.ts.map +1 -0
  210. package/dist/language/types.js +36 -0
  211. package/dist/language/types.js.map +1 -0
  212. package/dist/logging.d.ts.map +1 -1
  213. package/dist/mcp/server.js.map +1 -1
  214. package/dist/mcp-config.js.map +1 -1
  215. package/dist/retrieval/search.d.ts.map +1 -1
  216. package/dist/storage/fts.d.ts.map +1 -1
  217. package/dist/storage/metadata.d.ts.map +1 -1
  218. package/dist/vector/lancedb.d.ts.map +1 -1
  219. package/dist/watcher/index.d.ts.map +1 -1
  220. package/package.json +71 -3
  221. package/src/cli/commands/index_cmd.ts +2 -0
  222. package/src/cli/commands/start.ts +3 -1
  223. package/src/cli/index.ts +1 -1
  224. package/src/config/index.ts +1 -1
  225. package/src/graph/builder.ts +18 -0
  226. package/src/graph/types.ts +14 -1
  227. package/src/indexer/chunker.ts +9 -7
  228. package/src/indexer/file-utils.ts +6 -38
  229. package/src/indexer/fixture.test.ts +121 -0
  230. package/src/indexer/indexer.ts +17 -41
  231. package/src/indexer/parser.test.ts +127 -0
  232. package/src/indexer/parser.ts +194 -13
  233. package/src/language/adapters/astro.ts +206 -0
  234. package/src/language/adapters/c.ts +27 -0
  235. package/src/language/adapters/config.ts +144 -0
  236. package/src/language/adapters/cpp.ts +31 -0
  237. package/src/language/adapters/csharp.ts +34 -0
  238. package/src/language/adapters/css.ts +57 -0
  239. package/src/language/adapters/csv.ts +110 -0
  240. package/src/language/adapters/dart.ts +39 -0
  241. package/src/language/adapters/dockerfile.ts +78 -0
  242. package/src/language/adapters/documentation.ts +158 -0
  243. package/src/language/adapters/go.ts +28 -0
  244. package/src/language/adapters/haskell.ts +35 -0
  245. package/src/language/adapters/html.ts +68 -0
  246. package/src/language/adapters/java.ts +32 -0
  247. package/src/language/adapters/javascript.ts +33 -0
  248. package/src/language/adapters/json-variants.ts +60 -0
  249. package/src/language/adapters/json.ts +60 -0
  250. package/src/language/adapters/kotlin.ts +37 -0
  251. package/src/language/adapters/lua.ts +34 -0
  252. package/src/language/adapters/markdown.ts +81 -0
  253. package/src/language/adapters/php.ts +31 -0
  254. package/src/language/adapters/python.ts +29 -0
  255. package/src/language/adapters/ruby.ts +31 -0
  256. package/src/language/adapters/rust.ts +33 -0
  257. package/src/language/adapters/salesforce.ts +236 -0
  258. package/src/language/adapters/scala.ts +39 -0
  259. package/src/language/adapters/solidity.ts +42 -0
  260. package/src/language/adapters/sql.ts +99 -0
  261. package/src/language/adapters/svelte.ts +80 -0
  262. package/src/language/adapters/svg.ts +137 -0
  263. package/src/language/adapters/swift.ts +44 -0
  264. package/src/language/adapters/terraform.ts +25 -0
  265. package/src/language/adapters/text.ts +195 -0
  266. package/src/language/adapters/toml.ts +82 -0
  267. package/src/language/adapters/typescript.ts +37 -0
  268. package/src/language/adapters/vue.ts +70 -0
  269. package/src/language/adapters/xml.ts +74 -0
  270. package/src/language/adapters/yaml.ts +63 -0
  271. package/src/language/base.ts +167 -0
  272. package/src/language/generic.ts +58 -0
  273. package/src/language/registry.ts +179 -0
  274. package/src/language/types.ts +71 -0
  275. package/src/types/better-sqlite3.d.ts +55 -0
  276. package/src/types/cli-progress.d.ts +32 -0
  277. package/src/types/vitest.d.ts +11 -0
@@ -0,0 +1,167 @@
1
+ import { createRequire } from 'node:module';
2
+ import { Parser, Language } from 'web-tree-sitter';
3
+ import { SymbolType, CodeSymbol, ParseResult, LanguageAdapter } from './types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ export interface GrammarConfig {
8
+ language: string;
9
+ wasmPath: string;
10
+ queryPatterns: Record<string, string>;
11
+ typeMap: Record<string, SymbolType>;
12
+ nameNodeTypes: string[];
13
+ importNodeTypes: string[];
14
+ exportNodeTypes: string[];
15
+ }
16
+
17
+ export abstract class BaseTreeSitterAdapter implements LanguageAdapter {
18
+ protected abstract grammar: GrammarConfig;
19
+ protected parser: Parser | null = null;
20
+ protected loadedLang: any = null;
21
+ private static initialized = false;
22
+ private static loadedGrammars = new Map<string, any>();
23
+
24
+ abstract languageName(): string;
25
+ abstract fileExtensions(): string[];
26
+ fileNames(): string[] { return []; }
27
+
28
+ canParse(filePath: string): boolean {
29
+ const lower = filePath.toLowerCase();
30
+ for (const ext of this.fileExtensions()) {
31
+ if (lower.endsWith(ext)) return true;
32
+ }
33
+ for (const name of this.fileNames()) {
34
+ if (lower === name || lower.endsWith('/' + name)) return true;
35
+ }
36
+ return false;
37
+ }
38
+
39
+ supportsSymbols(): boolean {
40
+ return Object.keys(this.grammar.queryPatterns).length > 0;
41
+ }
42
+
43
+ async loadGrammar(): Promise<void> {
44
+ const key = this.grammar.language;
45
+ if (BaseTreeSitterAdapter.loadedGrammars.has(key)) {
46
+ this.loadedLang = BaseTreeSitterAdapter.loadedGrammars.get(key);
47
+ return;
48
+ }
49
+ if (!BaseTreeSitterAdapter.initialized) {
50
+ await Parser.init();
51
+ BaseTreeSitterAdapter.initialized = true;
52
+ }
53
+ const lang = await Language.load(this.grammar.wasmPath);
54
+ BaseTreeSitterAdapter.loadedGrammars.set(key, lang);
55
+ this.loadedLang = lang;
56
+ this.parser = new Parser();
57
+ this.parser.setLanguage(lang);
58
+ }
59
+
60
+ async parse(content: string, filePath: string): Promise<ParseResult> {
61
+ if (!this.parser) await this.loadGrammar();
62
+
63
+ const tree = this.parser!.parse(content);
64
+ const symbols = await this.extractSymbolsFromTree(tree, filePath, content);
65
+ const imports = this.extractImportsFromTree(tree);
66
+ const exports = this.extractExportsFromTree(tree);
67
+ const comments = this.extractCommentsFromTree(tree);
68
+
69
+ return { symbols, imports, exports, comments };
70
+ }
71
+
72
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
73
+ const symbols: CodeSymbol[] = [];
74
+ if (Object.keys(this.grammar.queryPatterns).length === 0) return symbols;
75
+ this.walkForSymbols(tree.rootNode, symbols, filePath, '');
76
+ return symbols;
77
+ }
78
+
79
+ protected walkForSymbols(node: any, symbols: CodeSymbol[], filePath: string, parentId: string): void {
80
+ const type = node.type;
81
+ const symbolType = this.grammar.typeMap[type];
82
+
83
+ if (symbolType) {
84
+ const name = this.extractName(node);
85
+ if (name) {
86
+ symbols.push({
87
+ id: `${filePath}:${node.startPosition.row + 1}`,
88
+ name,
89
+ type: symbolType,
90
+ language: this.grammar.language,
91
+ file: filePath,
92
+ startLine: node.startPosition.row + 1,
93
+ endLine: node.endPosition.row + 1,
94
+ parent: parentId || null,
95
+ children: [],
96
+ metadata: {},
97
+ });
98
+ }
99
+ }
100
+
101
+ for (let i = 0; i < node.childCount; i++) {
102
+ const childNode = node.child(i);
103
+ if (childNode) {
104
+ this.walkForSymbols(childNode, symbols, filePath, '');
105
+ }
106
+ }
107
+ }
108
+
109
+ protected extractName(node: any): string | null {
110
+ try {
111
+ const nameTypes = new Set([
112
+ 'identifier', 'property_identifier', 'type_identifier',
113
+ 'field_identifier', 'constant', 'variable', 'name', 'type',
114
+ 'selector', 'class_name', 'function_name', 'method_name',
115
+ ]);
116
+ return this.findName(node, nameTypes);
117
+ } catch {
118
+ return null;
119
+ }
120
+ }
121
+
122
+ private findName(node: any, nameTypes: Set<string>): string | null {
123
+ if (nameTypes.has(node.type)) {
124
+ return node.text;
125
+ }
126
+ for (let i = 0; i < node.childCount; i++) {
127
+ const child = node.child(i);
128
+ if (child) {
129
+ const result = this.findName(child, nameTypes);
130
+ if (result) return result;
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+
136
+ protected extractImportsFromTree(tree: any): string[] {
137
+ const imports: string[] = [];
138
+ const importTypes = this.grammar.importNodeTypes;
139
+ if (importTypes.length === 0) return imports;
140
+ this.collectNodesOfType(tree.rootNode, importTypes, imports);
141
+ return imports;
142
+ }
143
+
144
+ protected extractExportsFromTree(tree: any): string[] {
145
+ const exports: string[] = [];
146
+ const exportTypes = this.grammar.exportNodeTypes;
147
+ if (exportTypes.length === 0) return exports;
148
+ this.collectNodesOfType(tree.rootNode, exportTypes, exports);
149
+ return exports;
150
+ }
151
+
152
+ protected extractCommentsFromTree(tree: any): string[] {
153
+ const comments: string[] = [];
154
+ this.collectNodesOfType(tree.rootNode, ['comment', 'block_comment', 'line_comment'], comments);
155
+ return comments;
156
+ }
157
+
158
+ private collectNodesOfType(node: any, types: string[], results: string[]) {
159
+ if (types.includes(node.type)) {
160
+ results.push(node.text || '');
161
+ }
162
+ for (let i = 0; i < node.childCount; i++) {
163
+ const child = node.child(i);
164
+ if (child) this.collectNodesOfType(child, types, results);
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,58 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from './types.js';
2
+
3
+ const BINARY_EXTS = new Set([
4
+ '.exe', '.dll', '.so', '.dylib', '.bin', '.wasm',
5
+ '.o', '.a', '.lib', '.pyc', '.class', '.jar', '.war',
6
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.bmp', '.tiff',
7
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
8
+ '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',
9
+ '.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv',
10
+ '.mp3', '.wav', '.flac', '.ogg',
11
+ ]);
12
+
13
+ export class GenericAdapter implements LanguageAdapter {
14
+ languageName(): string { return 'Generic'; }
15
+ fileExtensions(): string[] { return []; }
16
+ fileNames(): string[] { return []; }
17
+
18
+ canParse(filePath: string): boolean {
19
+ const ext = '.' + filePath.split('.').pop()?.toLowerCase();
20
+ return !BINARY_EXTS.has(ext);
21
+ }
22
+
23
+ supportsSymbols(): boolean { return false; }
24
+
25
+ async parse(content: string, filePath: string): Promise<ParseResult> {
26
+ const lines = content.split('\n');
27
+ const paragraphs = content.split(/\n\s*\n/).filter(p => p.trim().length > 0);
28
+ const symbols: CodeSymbol[] = [];
29
+
30
+ for (let i = 0; i < Math.min(paragraphs.length, 100); i++) {
31
+ const plines = paragraphs[i].split('\n');
32
+ const firstLine = plines[0].trim().substring(0, 80);
33
+ const startLine = this.lineOf(content, paragraphs[i]);
34
+ const endLine = startLine + plines.length - 1;
35
+
36
+ symbols.push({
37
+ id: `${filePath}:${startLine}`,
38
+ name: firstLine || `paragraph_${i}`,
39
+ type: SymbolType.Module,
40
+ language: 'generic',
41
+ file: filePath,
42
+ startLine,
43
+ endLine,
44
+ parent: null,
45
+ children: [],
46
+ metadata: { size: paragraphs[i].length },
47
+ });
48
+ }
49
+
50
+ return { symbols, imports: [], exports: [], comments: [] };
51
+ }
52
+
53
+ private lineOf(content: string, substring: string): number {
54
+ const idx = content.indexOf(substring);
55
+ if (idx < 0) return 1;
56
+ return content.substring(0, idx).split('\n').length;
57
+ }
58
+ }
@@ -0,0 +1,179 @@
1
+ import { LanguageAdapter, AdapterInfo } from './types.js';
2
+ import { TypeScriptAdapter } from './adapters/typescript.js';
3
+ import { JavaScriptAdapter } from './adapters/javascript.js';
4
+ import { PythonAdapter } from './adapters/python.js';
5
+ import { GoAdapter } from './adapters/go.js';
6
+ import { RustAdapter } from './adapters/rust.js';
7
+ import { JavaAdapter } from './adapters/java.js';
8
+ import { RubyAdapter } from './adapters/ruby.js';
9
+ import { CAdapter } from './adapters/c.js';
10
+ import { CppAdapter } from './adapters/cpp.js';
11
+ import { CSharpAdapter } from './adapters/csharp.js';
12
+ import { PhpAdapter } from './adapters/php.js';
13
+ import { HtmlAdapter } from './adapters/html.js';
14
+ import { CssAdapter } from './adapters/css.js';
15
+ import { JsonAdapter } from './adapters/json.js';
16
+ import { SwiftAdapter } from './adapters/swift.js';
17
+ import { KotlinAdapter } from './adapters/kotlin.js';
18
+ import { DartAdapter } from './adapters/dart.js';
19
+ import { ScalaAdapter } from './adapters/scala.js';
20
+ import { HaskellAdapter } from './adapters/haskell.js';
21
+ import { SolidityAdapter } from './adapters/solidity.js';
22
+ import { LuaAdapter } from './adapters/lua.js';
23
+ import { YamlAdapter } from './adapters/yaml.js';
24
+ import { TomlAdapter } from './adapters/toml.js';
25
+ import { SqlAdapter } from './adapters/sql.js';
26
+ import { MarkdownAdapter } from './adapters/markdown.js';
27
+ import { XmlAdapter } from './adapters/xml.js';
28
+ import { VueAdapter } from './adapters/vue.js';
29
+ import { SvelteAdapter } from './adapters/svelte.js';
30
+ import { TerraformAdapter } from './adapters/terraform.js';
31
+ import { DockerfileAdapter } from './adapters/dockerfile.js';
32
+ import { SalesforceAdapter } from './adapters/salesforce.js';
33
+ import { CsvAdapter } from './adapters/csv.js';
34
+ import { JsonVariantsAdapter } from './adapters/json-variants.js';
35
+ import { ConfigAdapter } from './adapters/config.js';
36
+ import { DocumentationAdapter } from './adapters/documentation.js';
37
+ import { SvgAdapter } from './adapters/svg.js';
38
+ import { TextAdapter } from './adapters/text.js';
39
+ import { AstroAdapter } from './adapters/astro.js';
40
+ import { GenericAdapter } from './generic.js';
41
+
42
+ export type AdapterEntry = {
43
+ key: string;
44
+ adapter: LanguageAdapter;
45
+ tier: 1 | 2 | 3;
46
+ };
47
+
48
+ export class LanguageRegistry {
49
+ private adapters: AdapterEntry[] = [];
50
+ private extMap: Map<string, AdapterEntry> = new Map();
51
+ private nameMap: Map<string, AdapterEntry> = new Map();
52
+ private generic: GenericAdapter;
53
+
54
+ constructor() {
55
+ this.generic = new GenericAdapter();
56
+ this.registerDefaults();
57
+ }
58
+
59
+ private registerDefaults() {
60
+ // Tier 1: Full symbol extraction (programming languages)
61
+ this.register('ts', new TypeScriptAdapter(), 1);
62
+ this.register('js', new JavaScriptAdapter(), 1);
63
+ this.register('py', new PythonAdapter(), 1);
64
+ this.register('go', new GoAdapter(), 1);
65
+ this.register('rs', new RustAdapter(), 1);
66
+ this.register('java', new JavaAdapter(), 1);
67
+ this.register('rb', new RubyAdapter(), 1);
68
+ this.register('c', new CAdapter(), 1);
69
+ this.register('cpp', new CppAdapter(), 1);
70
+ this.register('csharp', new CSharpAdapter(), 1);
71
+ this.register('php', new PhpAdapter(), 1);
72
+ this.register('swift', new SwiftAdapter(), 1);
73
+ this.register('kotlin', new KotlinAdapter(), 1);
74
+ this.register('dart', new DartAdapter(), 1);
75
+ this.register('scala', new ScalaAdapter(), 1);
76
+ this.register('haskell', new HaskellAdapter(), 1);
77
+ this.register('solidity', new SolidityAdapter(), 1);
78
+ this.register('lua', new LuaAdapter(), 1);
79
+
80
+ // Tier 2: Structural extraction (markup, config, data)
81
+ this.register('html', new HtmlAdapter(), 2);
82
+ this.register('css', new CssAdapter(), 2);
83
+ this.register('json', new JsonAdapter(), 2);
84
+ this.register('yaml', new YamlAdapter(), 2);
85
+ this.register('toml', new TomlAdapter(), 2);
86
+ this.register('sql', new SqlAdapter(), 2);
87
+ this.register('markdown', new MarkdownAdapter(), 2);
88
+
89
+ // Tier 2: Additional markup and config languages
90
+ this.register('xml', new XmlAdapter(), 2);
91
+ this.register('vue', new VueAdapter(), 2);
92
+ this.register('svelte', new SvelteAdapter(), 2);
93
+ this.register('terraform', new TerraformAdapter(), 2);
94
+ this.register('dockerfile', new DockerfileAdapter(), 2);
95
+ this.register('salesforce', new SalesforceAdapter(), 2);
96
+ this.register('csv', new CsvAdapter(), 2);
97
+ this.register('json-variants', new JsonVariantsAdapter(), 2);
98
+ this.register('config', new ConfigAdapter(), 2);
99
+ this.register('documentation', new DocumentationAdapter(), 2);
100
+ this.register('svg', new SvgAdapter(), 2);
101
+ this.register('text', new TextAdapter(), 2);
102
+ this.register('astro', new AstroAdapter(), 2);
103
+ }
104
+
105
+ register(key: string, adapter: LanguageAdapter, tier: 1 | 2 | 3) {
106
+ const entry: AdapterEntry = { key, adapter, tier };
107
+ this.adapters.push(entry);
108
+ for (const ext of adapter.fileExtensions()) {
109
+ const lower = ext.toLowerCase();
110
+ if (!this.extMap.has(lower)) {
111
+ this.extMap.set(lower, entry);
112
+ }
113
+ }
114
+ for (const name of adapter.fileNames()) {
115
+ const lower = name.toLowerCase();
116
+ if (!this.nameMap.has(lower)) {
117
+ this.nameMap.set(lower, entry);
118
+ }
119
+ }
120
+ }
121
+
122
+ getAdapter(filePath: string): { adapter: LanguageAdapter; key: string } {
123
+ const lower = filePath.toLowerCase();
124
+ const fileName = lower.split('/').pop() || lower;
125
+
126
+ const nameEntry = this.nameMap.get(fileName);
127
+ if (nameEntry) return { adapter: nameEntry.adapter, key: nameEntry.key };
128
+
129
+ for (const [ext, entry] of this.extMap) {
130
+ if (lower.endsWith(ext)) return { adapter: entry.adapter, key: entry.key };
131
+ }
132
+
133
+ return { adapter: this.generic, key: 'generic' };
134
+ }
135
+
136
+ getAdapterByKey(key: string): { adapter: LanguageAdapter; key: string } | null {
137
+ const entry = this.adapters.find(a => a.key === key);
138
+ if (!entry) return null;
139
+ return { adapter: entry.adapter, key: entry.key };
140
+ }
141
+
142
+ getAllAdapters(): AdapterEntry[] {
143
+ return [...this.adapters];
144
+ }
145
+
146
+ getInfoList(): AdapterInfo[] {
147
+ return this.adapters.map(a => ({
148
+ key: a.key,
149
+ name: a.adapter.languageName(),
150
+ extensions: a.adapter.fileExtensions(),
151
+ tier: a.tier,
152
+ supportsSymbols: a.adapter.supportsSymbols(),
153
+ }));
154
+ }
155
+
156
+ getExtensionsForKeys(keys: string[]): string[] {
157
+ const exts: string[] = [];
158
+ for (const key of keys) {
159
+ const entry = this.adapters.find(a => a.key === key);
160
+ if (entry) exts.push(...entry.adapter.fileExtensions());
161
+ }
162
+ return exts;
163
+ }
164
+
165
+ async initialize(keys: string[]): Promise<void> {
166
+ for (const key of keys) {
167
+ const entry = this.adapters.find(a => a.key === key);
168
+ if (entry && entry.adapter instanceof (await import('./base.js')).BaseTreeSitterAdapter) {
169
+ try {
170
+ await (entry.adapter as any).loadGrammar();
171
+ } catch (e) {
172
+ // grammar load failure is non-fatal
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ export const defaultRegistry = new LanguageRegistry();
@@ -0,0 +1,71 @@
1
+ export enum SymbolType {
2
+ Workspace = 'workspace',
3
+ Folder = 'folder',
4
+ File = 'file',
5
+ Module = 'module',
6
+ Namespace = 'namespace',
7
+ Class = 'class',
8
+ Interface = 'interface',
9
+ Enum = 'enum',
10
+ Struct = 'struct',
11
+ Trait = 'trait',
12
+ Function = 'function',
13
+ Method = 'method',
14
+ Variable = 'variable',
15
+ Constant = 'constant',
16
+ Property = 'property',
17
+ Import = 'import',
18
+ Export = 'export',
19
+ Comment = 'comment',
20
+ Unknown = 'unknown',
21
+ Package = 'package',
22
+ Constructor = 'constructor',
23
+ Extension = 'extension',
24
+ Field = 'field',
25
+ TypeAlias = 'type_alias',
26
+ Document = 'document',
27
+ Section = 'section',
28
+ Table = 'table',
29
+ Selector = 'selector',
30
+ Rule = 'rule',
31
+ Actor = 'actor',
32
+ Object = 'object',
33
+ Protocol = 'protocol',
34
+ }
35
+
36
+ export interface CodeSymbol {
37
+ id: string;
38
+ name: string;
39
+ type: SymbolType;
40
+ language: string;
41
+ file: string;
42
+ startLine: number;
43
+ endLine: number;
44
+ parent: string | null;
45
+ children: CodeSymbol[];
46
+ metadata: Record<string, unknown>;
47
+ }
48
+
49
+ export interface ParseResult {
50
+ symbols: CodeSymbol[];
51
+ imports: string[];
52
+ exports: string[];
53
+ comments: string[];
54
+ }
55
+
56
+ export interface LanguageAdapter {
57
+ languageName(): string;
58
+ fileExtensions(): string[];
59
+ fileNames(): string[];
60
+ canParse(filePath: string): boolean;
61
+ parse(content: string, filePath: string): Promise<ParseResult>;
62
+ supportsSymbols(): boolean;
63
+ }
64
+
65
+ export interface AdapterInfo {
66
+ key: string;
67
+ name: string;
68
+ extensions: string[];
69
+ tier: 1 | 2 | 3;
70
+ supportsSymbols: boolean;
71
+ }
@@ -0,0 +1,55 @@
1
+ declare module 'better-sqlite3' {
2
+ namespace Database {
3
+ interface Database {
4
+ prepare(sql: string): Statement;
5
+ exec(sql: string): Database;
6
+ pragma(pragma: string, options?: { simple?: boolean }): any;
7
+ function(name: string, cb: (...args: any[]) => any): Database;
8
+ aggregate(name: string, options: any): Database;
9
+ loadExtension(path: string, entryPoint?: string): Database;
10
+ close(): Database;
11
+ defaultSafeIntegers(toggleState?: boolean): Database;
12
+ unsafeMode(unsafe?: boolean): Database;
13
+ transaction(fn: (...args: any[]) => any): (...args: any[]) => any;
14
+ savepoint(fn: (...args: any[]) => any): (...args: any[]) => any;
15
+ checkpoint(databaseName?: string): Database;
16
+ readonly(toggleState?: boolean): Database;
17
+ open: boolean;
18
+ inTransaction: boolean;
19
+ name: string;
20
+ memory: boolean;
21
+ readonly: boolean;
22
+ }
23
+
24
+ interface Statement {
25
+ database: Database;
26
+ source: string;
27
+ reader: boolean;
28
+ readonly: boolean;
29
+ busy: boolean;
30
+ run(...params: any[]): RunResult;
31
+ get(...params: any[]): any;
32
+ all(...params: any[]): any[];
33
+ iterate(...params: any[]): IterableIterator<any>;
34
+ pluck(toggleState?: boolean): Statement;
35
+ expand(toggleState?: boolean): Statement;
36
+ raw(toggleState?: boolean): Statement;
37
+ columns(toggleState?: boolean): Statement;
38
+ bind(...params: any[]): Statement;
39
+ safeIntegers(toggleState?: boolean): Statement;
40
+ }
41
+
42
+ interface RunResult {
43
+ changes: number;
44
+ lastInsertRowid: number | bigint;
45
+ }
46
+ }
47
+
48
+ interface DatabaseConstructor {
49
+ new(filename?: string | Buffer, options?: any): Database.Database;
50
+ (filename?: string | Buffer, options?: any): Database.Database;
51
+ }
52
+
53
+ const Database: DatabaseConstructor;
54
+ export = Database;
55
+ }
@@ -0,0 +1,32 @@
1
+ declare module 'cli-progress' {
2
+ export class SingleBar {
3
+ constructor(options?: any, preset?: any);
4
+ start(total: number, startValue?: number, payload?: any): void;
5
+ update(current: number, payload?: any): void;
6
+ stop(): void;
7
+ updateETA(): void;
8
+ setTotal(total: number): void;
9
+ getProgress(): number;
10
+ getTotal(): number;
11
+ getETA(): number;
12
+ formatTime(t: number, roundToMultipleOf: number): string;
13
+ }
14
+
15
+ export class MultiBar {
16
+ constructor(options?: any, preset?: any);
17
+ create(total: number, startValue: number, payload?: any): SingleBar;
18
+ stop(): void;
19
+ update(): void;
20
+ log(data: any): void;
21
+ }
22
+
23
+ export class Presets {
24
+ static shades_classic: any;
25
+ static shades_grey: any;
26
+ static rect: any;
27
+ static legacy: any;
28
+ }
29
+
30
+ export const Format: any;
31
+ export const Formatter: any;
32
+ }
@@ -0,0 +1,11 @@
1
+ declare module 'vitest' {
2
+ export function describe(name: string, fn: () => void): void;
3
+ export function it(name: string, fn?: () => void | Promise<void>, timeout?: number): void;
4
+ export function test(name: string, fn?: () => void | Promise<void>, timeout?: number): void;
5
+ export function expect(actual: any): any;
6
+ export function beforeAll(fn: () => void | Promise<void>, timeout?: number): void;
7
+ export function afterAll(fn: () => void | Promise<void>, timeout?: number): void;
8
+ export function beforeEach(fn: () => void | Promise<void>, timeout?: number): void;
9
+ export function afterEach(fn: () => void | Promise<void>, timeout?: number): void;
10
+ }
11
+