pindex 1.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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +767 -0
  3. package/dist/cli/daemon.d.ts +13 -0
  4. package/dist/cli/daemon.d.ts.map +1 -0
  5. package/dist/cli/daemon.js +70 -0
  6. package/dist/cli/daemon.js.map +1 -0
  7. package/dist/cli/index.d.ts +4 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +212 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/init.d.ts +44 -0
  12. package/dist/cli/init.d.ts.map +1 -0
  13. package/dist/cli/init.js +301 -0
  14. package/dist/cli/init.js.map +1 -0
  15. package/dist/cli/project-detector.d.ts +44 -0
  16. package/dist/cli/project-detector.d.ts.map +1 -0
  17. package/dist/cli/project-detector.js +144 -0
  18. package/dist/cli/project-detector.js.map +1 -0
  19. package/dist/cli/setup.d.ts +9 -0
  20. package/dist/cli/setup.d.ts.map +1 -0
  21. package/dist/cli/setup.js +110 -0
  22. package/dist/cli/setup.js.map +1 -0
  23. package/dist/db/database.d.ts +5 -0
  24. package/dist/db/database.d.ts.map +1 -0
  25. package/dist/db/database.js +19 -0
  26. package/dist/db/database.js.map +1 -0
  27. package/dist/db/migrations.d.ts +6 -0
  28. package/dist/db/migrations.d.ts.map +1 -0
  29. package/dist/db/migrations.js +32 -0
  30. package/dist/db/migrations.js.map +1 -0
  31. package/dist/db/queries.d.ts +132 -0
  32. package/dist/db/queries.d.ts.map +1 -0
  33. package/dist/db/queries.js +222 -0
  34. package/dist/db/queries.js.map +1 -0
  35. package/dist/db/schema.d.ts +5 -0
  36. package/dist/db/schema.d.ts.map +1 -0
  37. package/dist/db/schema.js +179 -0
  38. package/dist/db/schema.js.map +1 -0
  39. package/dist/gui/index.d.ts +3 -0
  40. package/dist/gui/index.d.ts.map +1 -0
  41. package/dist/gui/index.js +56 -0
  42. package/dist/gui/index.js.map +1 -0
  43. package/dist/gui/server.d.ts +31 -0
  44. package/dist/gui/server.d.ts.map +1 -0
  45. package/dist/gui/server.js +729 -0
  46. package/dist/gui/server.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +93 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/indexer/index.d.ts +38 -0
  52. package/dist/indexer/index.d.ts.map +1 -0
  53. package/dist/indexer/index.js +283 -0
  54. package/dist/indexer/index.js.map +1 -0
  55. package/dist/indexer/parser.d.ts +20 -0
  56. package/dist/indexer/parser.d.ts.map +1 -0
  57. package/dist/indexer/parser.js +431 -0
  58. package/dist/indexer/parser.js.map +1 -0
  59. package/dist/indexer/summarizer.d.ts +15 -0
  60. package/dist/indexer/summarizer.d.ts.map +1 -0
  61. package/dist/indexer/summarizer.js +24 -0
  62. package/dist/indexer/summarizer.js.map +1 -0
  63. package/dist/indexer/watcher.d.ts +25 -0
  64. package/dist/indexer/watcher.d.ts.map +1 -0
  65. package/dist/indexer/watcher.js +54 -0
  66. package/dist/indexer/watcher.js.map +1 -0
  67. package/dist/monitoring/estimator.d.ts +20 -0
  68. package/dist/monitoring/estimator.d.ts.map +1 -0
  69. package/dist/monitoring/estimator.js +94 -0
  70. package/dist/monitoring/estimator.js.map +1 -0
  71. package/dist/monitoring/server.d.ts +20 -0
  72. package/dist/monitoring/server.d.ts.map +1 -0
  73. package/dist/monitoring/server.js +86 -0
  74. package/dist/monitoring/server.js.map +1 -0
  75. package/dist/monitoring/token-logger.d.ts +26 -0
  76. package/dist/monitoring/token-logger.d.ts.map +1 -0
  77. package/dist/monitoring/token-logger.js +47 -0
  78. package/dist/monitoring/token-logger.js.map +1 -0
  79. package/dist/server.d.ts +18 -0
  80. package/dist/server.d.ts.map +1 -0
  81. package/dist/server.js +310 -0
  82. package/dist/server.js.map +1 -0
  83. package/dist/tools/find_usages.d.ts +4 -0
  84. package/dist/tools/find_usages.d.ts.map +1 -0
  85. package/dist/tools/find_usages.js +13 -0
  86. package/dist/tools/find_usages.js.map +1 -0
  87. package/dist/tools/get_context.d.ts +6 -0
  88. package/dist/tools/get_context.d.ts.map +1 -0
  89. package/dist/tools/get_context.js +36 -0
  90. package/dist/tools/get_context.js.map +1 -0
  91. package/dist/tools/get_dependencies.d.ts +4 -0
  92. package/dist/tools/get_dependencies.d.ts.map +1 -0
  93. package/dist/tools/get_dependencies.js +16 -0
  94. package/dist/tools/get_dependencies.js.map +1 -0
  95. package/dist/tools/get_doc_chunk.d.ts +4 -0
  96. package/dist/tools/get_doc_chunk.d.ts.map +1 -0
  97. package/dist/tools/get_doc_chunk.js +32 -0
  98. package/dist/tools/get_doc_chunk.js.map +1 -0
  99. package/dist/tools/get_file_summary.d.ts +4 -0
  100. package/dist/tools/get_file_summary.d.ts.map +1 -0
  101. package/dist/tools/get_file_summary.js +23 -0
  102. package/dist/tools/get_file_summary.js.map +1 -0
  103. package/dist/tools/get_project_overview.d.ts +5 -0
  104. package/dist/tools/get_project_overview.d.ts.map +1 -0
  105. package/dist/tools/get_project_overview.js +60 -0
  106. package/dist/tools/get_project_overview.js.map +1 -0
  107. package/dist/tools/get_symbol.d.ts +4 -0
  108. package/dist/tools/get_symbol.d.ts.map +1 -0
  109. package/dist/tools/get_symbol.js +21 -0
  110. package/dist/tools/get_symbol.js.map +1 -0
  111. package/dist/tools/get_token_stats.d.ts +4 -0
  112. package/dist/tools/get_token_stats.d.ts.map +1 -0
  113. package/dist/tools/get_token_stats.js +6 -0
  114. package/dist/tools/get_token_stats.js.map +1 -0
  115. package/dist/tools/reindex.d.ts +5 -0
  116. package/dist/tools/reindex.d.ts.map +1 -0
  117. package/dist/tools/reindex.js +21 -0
  118. package/dist/tools/reindex.js.map +1 -0
  119. package/dist/tools/save_context.d.ts +4 -0
  120. package/dist/tools/save_context.d.ts.map +1 -0
  121. package/dist/tools/save_context.js +17 -0
  122. package/dist/tools/save_context.js.map +1 -0
  123. package/dist/tools/search_docs.d.ts +4 -0
  124. package/dist/tools/search_docs.d.ts.map +1 -0
  125. package/dist/tools/search_docs.js +42 -0
  126. package/dist/tools/search_docs.js.map +1 -0
  127. package/dist/tools/search_symbols.d.ts +5 -0
  128. package/dist/tools/search_symbols.d.ts.map +1 -0
  129. package/dist/tools/search_symbols.js +36 -0
  130. package/dist/tools/search_symbols.js.map +1 -0
  131. package/dist/tools/start_comparison.d.ts +4 -0
  132. package/dist/tools/start_comparison.d.ts.map +1 -0
  133. package/dist/tools/start_comparison.js +15 -0
  134. package/dist/tools/start_comparison.js.map +1 -0
  135. package/dist/types.d.ts +318 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +3 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +69 -0
@@ -0,0 +1,431 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createRequire } from 'node:module';
3
+ // CJS require wrapper — needed because tree-sitter ships as CommonJS but this
4
+ // package uses ESM ("type": "module"). createRequire gives us a proper require
5
+ // that also works with vi.mock() in Vitest (same module cache is used).
6
+ const _require = createRequire(import.meta.url);
7
+ // ─── Language Detection ───────────────────────────────────────────────────────
8
+ const EXTENSION_MAP = {
9
+ ts: 'typescript',
10
+ tsx: 'tsx',
11
+ js: 'javascript',
12
+ mjs: 'javascript',
13
+ cjs: 'javascript',
14
+ jsx: 'jsx',
15
+ py: 'python',
16
+ go: 'go',
17
+ rs: 'rust',
18
+ java: 'java',
19
+ kt: 'kotlin',
20
+ kts: 'kotlin',
21
+ vue: 'vue',
22
+ svelte: 'svelte',
23
+ php: 'php',
24
+ rb: 'ruby',
25
+ cs: 'csharp',
26
+ md: 'markdown',
27
+ markdown: 'markdown',
28
+ yaml: 'yaml',
29
+ yml: 'yaml',
30
+ txt: 'text',
31
+ };
32
+ /** Returns true for file types that should be indexed as text documents (not code). */
33
+ export function isDocumentLanguage(language) {
34
+ return language === 'markdown' || language === 'yaml' || language === 'text';
35
+ }
36
+ export function detectLanguage(filePath) {
37
+ const ext = filePath.split('.').pop()?.toLowerCase() ?? '';
38
+ return EXTENSION_MAP[ext] ?? 'unknown';
39
+ }
40
+ // ─── Token Estimation ─────────────────────────────────────────────────────────
41
+ /** Estimates token count using the ~4 chars/token heuristic. */
42
+ export function estimateTokens(content) {
43
+ if (!content)
44
+ return 0;
45
+ return Math.ceil(content.length / 4);
46
+ }
47
+ // ─── Signature Building ───────────────────────────────────────────────────────
48
+ /** Builds a concise one-line signature for a declaration node. */
49
+ export function buildSignature(node, kind) {
50
+ const namePart = node.childForFieldName('name');
51
+ const name = namePart?.text ?? '';
52
+ switch (kind) {
53
+ case 'function':
54
+ case 'method': {
55
+ const params = node.childForFieldName('parameters');
56
+ const returnType = node.childForFieldName('return_type');
57
+ const paramText = params?.text ?? '()';
58
+ const retText = returnType?.text ?? '';
59
+ return `${name}${paramText}${retText}`.replace(/\s+/g, ' ').trim();
60
+ }
61
+ case 'class': {
62
+ const heritage = node.childForFieldName('class_heritage');
63
+ return heritage ? `class ${name} ${heritage.text}` : `class ${name}`;
64
+ }
65
+ case 'interface': {
66
+ const heritage = node.childForFieldName('extends_clause');
67
+ return heritage ? `interface ${name} ${heritage.text}` : `interface ${name}`;
68
+ }
69
+ case 'type': {
70
+ const value = node.childForFieldName('value');
71
+ const valueText = value?.text ?? '...';
72
+ const truncated = valueText.length > 50 ? valueText.substring(0, 47) + '...' : valueText;
73
+ return `type ${name} = ${truncated}`;
74
+ }
75
+ case 'enum': {
76
+ return `enum ${name}`;
77
+ }
78
+ default:
79
+ return name || node.text.split('\n')[0].trim().substring(0, 60);
80
+ }
81
+ }
82
+ // ─── Symbol Extraction ────────────────────────────────────────────────────────
83
+ const DECLARATION_TYPES = [
84
+ { nodeType: 'function_declaration', kind: 'function' },
85
+ { nodeType: 'class_declaration', kind: 'class' },
86
+ { nodeType: 'interface_declaration', kind: 'interface' },
87
+ { nodeType: 'type_alias_declaration', kind: 'type' },
88
+ { nodeType: 'enum_declaration', kind: 'enum' },
89
+ ];
90
+ function extractFromDeclarationNode(node, kind, isExported) {
91
+ const nameNode = node.childForFieldName('name');
92
+ if (!nameNode)
93
+ return null;
94
+ return {
95
+ name: nameNode.text,
96
+ kind,
97
+ signature: buildSignature(node, kind),
98
+ startLine: node.startPosition.row + 1, // convert 0-indexed to 1-indexed
99
+ endLine: node.endPosition.row + 1,
100
+ isExported,
101
+ };
102
+ }
103
+ function extractMethodsFromClass(classNode) {
104
+ const methods = [];
105
+ const methodNodes = classNode.descendantsOfType('method_definition');
106
+ for (const methodNode of methodNodes) {
107
+ const nameNode = methodNode.childForFieldName('name');
108
+ if (!nameNode)
109
+ continue;
110
+ const methodName = nameNode.text;
111
+ if (methodName === 'constructor')
112
+ continue;
113
+ methods.push({
114
+ name: methodName,
115
+ kind: 'method',
116
+ signature: buildSignature(methodNode, 'method'),
117
+ startLine: methodNode.startPosition.row + 1,
118
+ endLine: methodNode.endPosition.row + 1,
119
+ isExported: false,
120
+ });
121
+ }
122
+ return methods;
123
+ }
124
+ function extractFromExportStatement(node) {
125
+ const declaration = node.childForFieldName('declaration');
126
+ if (!declaration)
127
+ return [];
128
+ const symbols = [];
129
+ for (const { nodeType, kind } of DECLARATION_TYPES) {
130
+ if (declaration.type === nodeType) {
131
+ const sym = extractFromDeclarationNode(declaration, kind, true);
132
+ if (sym) {
133
+ symbols.push(sym);
134
+ if (kind === 'class') {
135
+ symbols.push(...extractMethodsFromClass(declaration));
136
+ }
137
+ }
138
+ return symbols;
139
+ }
140
+ }
141
+ // export const x = ...
142
+ if (declaration.type === 'lexical_declaration' ||
143
+ declaration.type === 'variable_declaration') {
144
+ const declarators = declaration.descendantsOfType('variable_declarator');
145
+ for (const decl of declarators) {
146
+ const nameNode = decl.childForFieldName('name');
147
+ if (!nameNode)
148
+ continue;
149
+ symbols.push({
150
+ name: nameNode.text,
151
+ kind: 'const',
152
+ signature: nameNode.text,
153
+ startLine: declaration.startPosition.row + 1,
154
+ endLine: declaration.endPosition.row + 1,
155
+ isExported: true,
156
+ });
157
+ }
158
+ }
159
+ return symbols;
160
+ }
161
+ /** Extracts all symbols from a parsed AST root node. */
162
+ export function extractSymbols(rootNode, _content) {
163
+ const symbols = [];
164
+ for (const child of rootNode.namedChildren) {
165
+ // Handle export statements
166
+ if (child.type === 'export_statement') {
167
+ symbols.push(...extractFromExportStatement(child));
168
+ continue;
169
+ }
170
+ // Handle direct declarations
171
+ for (const { nodeType, kind } of DECLARATION_TYPES) {
172
+ if (child.type === nodeType) {
173
+ const sym = extractFromDeclarationNode(child, kind, false);
174
+ if (sym) {
175
+ symbols.push(sym);
176
+ if (kind === 'class') {
177
+ symbols.push(...extractMethodsFromClass(child));
178
+ }
179
+ }
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ return symbols;
185
+ }
186
+ // ─── Import Extraction ────────────────────────────────────────────────────────
187
+ /** Extracts all import statements from a parsed AST root node. */
188
+ export function extractImports(rootNode) {
189
+ const imports = [];
190
+ const importNodes = rootNode.descendantsOfType('import_statement');
191
+ for (const importNode of importNodes) {
192
+ const sourceNode = importNode.childForFieldName('source');
193
+ if (!sourceNode)
194
+ continue;
195
+ // Strip quotes from the source string
196
+ const source = sourceNode.text.replace(/^['"`]|['"`]$/g, '');
197
+ // Extract named imports
198
+ const specifiers = importNode.descendantsOfType('import_specifier');
199
+ const symbols = specifiers.map((spec) => {
200
+ const nameNode = spec.childForFieldName('name');
201
+ return nameNode?.text ?? spec.text;
202
+ }).filter(Boolean);
203
+ imports.push({ source, symbols });
204
+ }
205
+ return imports;
206
+ }
207
+ // ─── Regex-based Symbol Extraction ───────────────────────────────────────────
208
+ // Used for languages without a tree-sitter grammar. Each extractor returns
209
+ // symbols and imports parsed from the raw source text via regular expressions.
210
+ function regexSymbols(content, patterns) {
211
+ const symbols = [];
212
+ const lines = content.split('\n');
213
+ for (const { re, kind } of patterns) {
214
+ let m;
215
+ re.lastIndex = 0;
216
+ while ((m = re.exec(content)) !== null) {
217
+ const name = m[1] ?? m[2];
218
+ if (!name)
219
+ continue;
220
+ const lineNum = content.slice(0, m.index).split('\n').length;
221
+ const rawLine = lines[lineNum - 1] ?? '';
222
+ const sig = rawLine.trim().replace(/\s+/g, ' ').substring(0, 80);
223
+ symbols.push({ name, kind, signature: sig, startLine: lineNum, endLine: lineNum, isExported: true });
224
+ }
225
+ }
226
+ return symbols;
227
+ }
228
+ function parseJava(content) {
229
+ const symbols = regexSymbols(content, [
230
+ { re: /^[ \t]*(?:(?:public|protected|private|static|abstract|final|sealed|non-sealed)\s+)*(?:class|interface|enum|record|@interface)\s+(\w+)/gm, kind: 'class' },
231
+ { re: /^[ \t]+(?:(?:public|protected|private|static|abstract|final|synchronized|default|native)\s+)*(?:<[^>]+>\s+)?(?:void|boolean|int|long|double|float|String|[\w][\w.<>, \[\]]*?)\s+(\w+)\s*\(/gm, kind: 'method' },
232
+ ]);
233
+ const imports = [];
234
+ const importRe = /^import\s+(?:static\s+)?([^;]+);/gm;
235
+ let m;
236
+ while ((m = importRe.exec(content)) !== null) {
237
+ const parts = m[1].trim().split('.');
238
+ const sym = parts.pop() ?? '';
239
+ imports.push({ source: parts.join('.'), symbols: sym === '*' ? [] : [sym] });
240
+ }
241
+ return { symbols, imports };
242
+ }
243
+ function parseKotlin(content) {
244
+ const symbols = regexSymbols(content, [
245
+ { re: /^[ \t]*(?:(?:public|private|protected|internal|abstract|open|sealed|data|inner|inline|value|annotation|enum)\s+)*(?:class|interface|object)\s+(\w+)/gm, kind: 'class' },
246
+ { re: /^[ \t]*(?:(?:public|private|protected|internal|override|abstract|open|suspend|inline|operator|infix|tailrec|external)\s+)*fun\s+(?:<[^>]+>\s+)?(\w+)\s*[(<]/gm, kind: 'function' },
247
+ ]);
248
+ const imports = [];
249
+ const importRe = /^import\s+([\w.]+)(?:\s+as\s+\w+)?/gm;
250
+ let m;
251
+ while ((m = importRe.exec(content)) !== null) {
252
+ const parts = m[1].split('.');
253
+ const sym = parts.pop() ?? '';
254
+ imports.push({ source: parts.join('.'), symbols: sym === '*' ? [] : [sym] });
255
+ }
256
+ return { symbols, imports };
257
+ }
258
+ function parsePython(content) {
259
+ const symbols = regexSymbols(content, [
260
+ { re: /^class\s+(\w+)/gm, kind: 'class' },
261
+ { re: /^(?:async\s+)?def\s+(\w+)/gm, kind: 'function' },
262
+ ]);
263
+ const imports = [];
264
+ const fromRe = /^from\s+(\S+)\s+import\s+(.+)/gm;
265
+ const plainRe = /^import\s+(\S+)/gm;
266
+ let m;
267
+ while ((m = fromRe.exec(content)) !== null) {
268
+ const syms = m[2].split(',').map((s) => s.trim().split(/\s+as\s+/)[0].trim()).filter(Boolean);
269
+ imports.push({ source: m[1], symbols: syms });
270
+ }
271
+ while ((m = plainRe.exec(content)) !== null) {
272
+ imports.push({ source: m[1], symbols: [] });
273
+ }
274
+ return { symbols, imports };
275
+ }
276
+ function parsePhp(content) {
277
+ const symbols = regexSymbols(content, [
278
+ { re: /^(?:(?:abstract|final|readonly)\s+)*(?:class|interface|trait|enum)\s+(\w+)/gm, kind: 'class' },
279
+ { re: /^[ \t]*(?:(?:public|protected|private|static|abstract|final)\s+)*function\s+(\w+)\s*\(/gm, kind: 'function' },
280
+ ]);
281
+ const imports = [];
282
+ const useRe = /^use\s+([^;]+);/gm;
283
+ let m;
284
+ while ((m = useRe.exec(content)) !== null) {
285
+ const parts = m[1].trim().split('\\');
286
+ const sym = parts.pop() ?? '';
287
+ imports.push({ source: parts.join('\\'), symbols: [sym] });
288
+ }
289
+ return { symbols, imports };
290
+ }
291
+ /** Extracts the script block content from a Vue or Svelte SFC. */
292
+ function extractSfcScript(content) {
293
+ const m = /<script(?:\s[^>]*)?>([^]*?)<\/script>/i.exec(content);
294
+ return m?.[1] ?? '';
295
+ }
296
+ // ─── Main Parse Function ──────────────────────────────────────────────────────
297
+ /** Parses a source file using tree-sitter and extracts symbols + imports.
298
+ * Falls back gracefully if tree-sitter fails. */
299
+ export function parseFile(filePath, content) {
300
+ const language = detectLanguage(filePath);
301
+ const rawTokenEstimate = estimateTokens(content);
302
+ try {
303
+ // _require is a createRequire-based CJS loader (see top of file).
304
+ // Using _require keeps vi.mock('tree-sitter') working in Vitest because
305
+ // both createRequire and vi.mock share the same Node module cache.
306
+ const Parser = _require('tree-sitter');
307
+ const parser = new Parser();
308
+ // Route non-TS languages to regex-based parsers (no tree-sitter needed)
309
+ if (language === 'java') {
310
+ const { symbols, imports } = parseJava(content);
311
+ return { language, symbols, imports, rawTokenEstimate };
312
+ }
313
+ if (language === 'kotlin') {
314
+ const { symbols, imports } = parseKotlin(content);
315
+ return { language, symbols, imports, rawTokenEstimate };
316
+ }
317
+ if (language === 'python') {
318
+ const { symbols, imports } = parsePython(content);
319
+ return { language, symbols, imports, rawTokenEstimate };
320
+ }
321
+ if (language === 'php') {
322
+ const { symbols, imports } = parsePhp(content);
323
+ return { language, symbols, imports, rawTokenEstimate };
324
+ }
325
+ if (language === 'vue' || language === 'svelte') {
326
+ // Parse the <script> block as TypeScript via tree-sitter
327
+ const scriptContent = extractSfcScript(content);
328
+ if (!scriptContent.trim())
329
+ return { language, symbols: [], imports: [], rawTokenEstimate };
330
+ const Parser = _require('tree-sitter');
331
+ const parser = new Parser();
332
+ const tsLangs = _require('tree-sitter-typescript');
333
+ parser.setLanguage(tsLangs.typescript);
334
+ const tree = parser.parse(scriptContent);
335
+ const symbols = extractSymbols(tree.rootNode, scriptContent);
336
+ const imports = extractImports(tree.rootNode);
337
+ return { language, symbols, imports, rawTokenEstimate };
338
+ }
339
+ let lang;
340
+ if (language === 'typescript' || language === 'tsx') {
341
+ const tsLangs = _require('tree-sitter-typescript');
342
+ lang = language === 'tsx' ? tsLangs.tsx : tsLangs.typescript;
343
+ }
344
+ else {
345
+ return { language, symbols: [], imports: [], rawTokenEstimate };
346
+ }
347
+ parser.setLanguage(lang);
348
+ const tree = parser.parse(content);
349
+ const symbols = extractSymbols(tree.rootNode, content);
350
+ const imports = extractImports(tree.rootNode);
351
+ return { language, symbols, imports, rawTokenEstimate };
352
+ }
353
+ catch {
354
+ // tree-sitter not available or failed – return metadata only
355
+ return { language, symbols: [], imports: [], rawTokenEstimate };
356
+ }
357
+ }
358
+ // ─── Document Parsing ─────────────────────────────────────────────────────────
359
+ const CHUNK_SIZE = 50; // lines per chunk for non-markdown files
360
+ /** Splits markdown content into chunks at heading boundaries. */
361
+ function splitMarkdownByHeadings(lines) {
362
+ const chunks = [];
363
+ let chunkIndex = 0;
364
+ let chunkStart = 0;
365
+ let currentHeading = null;
366
+ let chunkLines = [];
367
+ function flush(endLine) {
368
+ if (chunkLines.length === 0)
369
+ return;
370
+ chunks.push({
371
+ chunkIndex: chunkIndex++,
372
+ heading: currentHeading,
373
+ startLine: chunkStart + 1, // 1-indexed
374
+ endLine: endLine,
375
+ content: chunkLines.join('\n'),
376
+ });
377
+ chunkLines = [];
378
+ }
379
+ for (let i = 0; i < lines.length; i++) {
380
+ const line = lines[i];
381
+ const headingMatch = /^#{1,3}\s+(.+)$/.exec(line);
382
+ if (headingMatch) {
383
+ if (i > chunkStart) {
384
+ flush(i); // end previous chunk before heading
385
+ chunkStart = i;
386
+ }
387
+ currentHeading = headingMatch[1].trim(); // always capture heading, even at line 0
388
+ }
389
+ chunkLines.push(line);
390
+ }
391
+ flush(lines.length);
392
+ return chunks;
393
+ }
394
+ /** Splits any text into fixed-size line chunks. */
395
+ function splitByLines(lines, chunkSize) {
396
+ const chunks = [];
397
+ for (let i = 0; i < lines.length; i += chunkSize) {
398
+ const slice = lines.slice(i, i + chunkSize);
399
+ chunks.push({
400
+ chunkIndex: chunks.length,
401
+ heading: null,
402
+ startLine: i + 1, // 1-indexed
403
+ endLine: Math.min(i + chunkSize, lines.length),
404
+ content: slice.join('\n'),
405
+ });
406
+ }
407
+ return chunks;
408
+ }
409
+ /** Parses a document file into text chunks for indexing. */
410
+ export function parseDocument(filePath, content) {
411
+ const language = detectLanguage(filePath);
412
+ const rawTokenEstimate = estimateTokens(content);
413
+ const lines = content.split('\n');
414
+ let chunks;
415
+ if (language === 'markdown') {
416
+ chunks = splitMarkdownByHeadings(lines);
417
+ }
418
+ else {
419
+ chunks = splitByLines(lines, CHUNK_SIZE);
420
+ }
421
+ // Filter empty chunks
422
+ chunks = chunks.filter((c) => c.content.trim().length > 0);
423
+ // Re-number after filtering
424
+ chunks.forEach((c, i) => { c.chunkIndex = i; });
425
+ return { language, chunks, rawTokenEstimate };
426
+ }
427
+ /** Computes an MD5 hash of the file content for change detection. */
428
+ export function hashContent(content) {
429
+ return createHash('md5').update(content).digest('hex');
430
+ }
431
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/indexer/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Summarizer – optional LLM-based file/symbol summaries.
2
+ * Currently a stub. When GENERATE_SUMMARIES=true and an API key is available,
3
+ * this module would call an LLM to generate 1-2 sentence summaries. */
4
+ export interface SummarizerOptions {
5
+ enabled: boolean;
6
+ }
7
+ export declare class Summarizer {
8
+ private readonly enabled;
9
+ constructor(options?: SummarizerOptions);
10
+ /** Generates a summary for a symbol. Returns null if disabled. */
11
+ summarizeSymbol(_signature: string, _codeSnippet: string): Promise<string | null>;
12
+ /** Generates a summary for a file. Returns null if disabled. */
13
+ summarizeFile(_filePath: string, _content: string): Promise<string | null>;
14
+ }
15
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/indexer/summarizer.ts"],"names":[],"mappings":"AAAA;;wEAEwE;AAExE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,GAAE,iBAAsC;IAI3D,kEAAkE;IAC5D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMvF,gEAAgE;IAC1D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAKjF"}
@@ -0,0 +1,24 @@
1
+ /** Summarizer – optional LLM-based file/symbol summaries.
2
+ * Currently a stub. When GENERATE_SUMMARIES=true and an API key is available,
3
+ * this module would call an LLM to generate 1-2 sentence summaries. */
4
+ export class Summarizer {
5
+ enabled;
6
+ constructor(options = { enabled: false }) {
7
+ this.enabled = options.enabled;
8
+ }
9
+ /** Generates a summary for a symbol. Returns null if disabled. */
10
+ async summarizeSymbol(_signature, _codeSnippet) {
11
+ if (!this.enabled)
12
+ return null;
13
+ // TODO: Implement LLM-based summary generation
14
+ return null;
15
+ }
16
+ /** Generates a summary for a file. Returns null if disabled. */
17
+ async summarizeFile(_filePath, _content) {
18
+ if (!this.enabled)
19
+ return null;
20
+ // TODO: Implement LLM-based summary generation
21
+ return null;
22
+ }
23
+ }
24
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/indexer/summarizer.ts"],"names":[],"mappings":"AAAA;;wEAEwE;AAMxE,MAAM,OAAO,UAAU;IACJ,OAAO,CAAU;IAElC,YAAY,UAA6B,EAAE,OAAO,EAAE,KAAK,EAAE;QACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,YAAoB;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,QAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type Database from 'better-sqlite3';
3
+ import type { Indexer } from './index.js';
4
+ export interface WatcherOptions {
5
+ db: Database.Database;
6
+ indexer: Indexer;
7
+ projectRoot: string;
8
+ }
9
+ export interface FileChangeEvent {
10
+ type: 'add' | 'change' | 'unlink';
11
+ path: string;
12
+ }
13
+ export declare class FileWatcher extends EventEmitter {
14
+ private readonly options;
15
+ private readonly indexer;
16
+ private watcher;
17
+ private started;
18
+ constructor(options: WatcherOptions);
19
+ /** Starts watching the project directory for file changes. */
20
+ start(): Promise<void>;
21
+ /** Stops the file watcher. */
22
+ stop(): Promise<void>;
23
+ private handleChange;
24
+ }
25
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,WAAY,SAAQ,YAAY;IAK/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEK,OAAO,EAAE,cAAc;IAKpD,8DAA8D;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B,8BAA8B;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,YAAY;CAe3B"}
@@ -0,0 +1,54 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export class FileWatcher extends EventEmitter {
3
+ options;
4
+ indexer;
5
+ watcher = null;
6
+ started = false;
7
+ constructor(options) {
8
+ super();
9
+ this.options = options;
10
+ this.indexer = options.indexer;
11
+ }
12
+ /** Starts watching the project directory for file changes. */
13
+ async start() {
14
+ if (this.started)
15
+ return;
16
+ this.started = true;
17
+ // Dynamic import allows mocking chokidar in tests
18
+ const { default: chokidar } = await import('chokidar');
19
+ this.watcher = chokidar.watch(['**/*.ts', '**/*.tsx', '**/*.js'], {
20
+ cwd: this.options.projectRoot,
21
+ ignored: ['**/node_modules/**', '**/.git/**', '**/dist/**'],
22
+ persistent: true,
23
+ ignoreInitial: true,
24
+ });
25
+ this.watcher
26
+ .on('add', (path) => this.handleChange('add', path))
27
+ .on('change', (path) => this.handleChange('change', path))
28
+ .on('unlink', (path) => this.handleChange('unlink', path));
29
+ }
30
+ /** Stops the file watcher. */
31
+ async stop() {
32
+ if (this.watcher) {
33
+ await this.watcher.close();
34
+ this.watcher = null;
35
+ this.started = false;
36
+ }
37
+ }
38
+ async handleChange(type, path) {
39
+ const event = { type, path };
40
+ this.emit('change', event);
41
+ if (type === 'add' || type === 'change') {
42
+ try {
43
+ await this.indexer.indexFile(path, true);
44
+ this.emit('indexed', path);
45
+ }
46
+ catch (err) {
47
+ this.emit('error', err);
48
+ }
49
+ }
50
+ // Note: 'unlink' events could trigger file removal from the index
51
+ // (future enhancement – for now we leave stale entries)
52
+ }
53
+ }
54
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,OAAO,WAAY,SAAQ,YAAY;IAKd;IAJZ,OAAO,CAAU;IAC1B,OAAO,GAAY,IAAI,CAAC;IACxB,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,OAAuB;QAClD,KAAK,EAAE,CAAC;QADmB,YAAO,GAAP,OAAO,CAAgB;QAElD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,kDAAkD;QAClD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAEvD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;YAChE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YAC7B,OAAO,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,CAAC;YAC3D,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEF,IAAI,CAAC,OAA6C;aAChD,EAAE,CAAC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aAC3D,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aACjE,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAO,IAAI,CAAC,OAAsC,CAAC,KAAK,EAAE,CAAC;YAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAiC,EAAE,IAAY;QACxE,MAAM,KAAK,GAAoB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE3B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,kEAAkE;QAClE,wDAAwD;IAC1D,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type Database from 'better-sqlite3';
2
+ /** Estimates token count for a raw string using ~4 chars/token heuristic. */
3
+ export declare function estimateFileTokens(content: string): number;
4
+ export interface ToolCallContext {
5
+ tool: string;
6
+ /** Query string (for search_symbols) */
7
+ query?: string;
8
+ /** Symbol name (for get_symbol) */
9
+ name?: string;
10
+ /** Target file path (for get_symbol, get_context, get_dependencies) */
11
+ targetFile?: string;
12
+ /** Actual tokens used (fallback multiplier) */
13
+ tokensUsed?: number;
14
+ }
15
+ /** Estimates how many tokens the same request would have used WITHOUT the index.
16
+ *
17
+ * This is a heuristic – not an exact measurement. The intent is to give a
18
+ * conservative lower bound for the "without index" scenario. */
19
+ export declare function estimateWithoutIndex(db: Database.Database, ctx: ToolCallContext): number;
20
+ //# sourceMappingURL=estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimator.d.ts","sourceRoot":"","sources":["../../src/monitoring/estimator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1D;AAID,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;iEAGiE;AACjE,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,eAAe,GACnB,MAAM,CAqFR"}