gitnexus 1.6.5-rc.46 → 1.6.5-rc.48

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.
@@ -2,8 +2,10 @@ import { KnowledgeGraph } from '../graph/types.js';
2
2
  import { ASTCache } from './ast-cache.js';
3
3
  import type { SymbolDefinition } from '../../_shared/index.js';
4
4
  import type { SymbolTableReader, HeritageMap, ExtractedHeritage } from './model/index.js';
5
+ import Parser from 'tree-sitter';
5
6
  import type { ResolutionContext } from './model/resolution-context.js';
6
7
  import type { TieredCandidates } from './model/resolution-context.js';
8
+ import { SupportedLanguages } from '../../_shared/index.js';
7
9
  import type { TypeEnvironment } from './type-env.js';
8
10
  import type { BindingAccumulator } from './binding-accumulator.js';
9
11
  import type { ExtractedCall, ExtractedAssignment, ExtractedRoute, ExtractedFetchCall, FileConstructorBindings } from './workers/parse-worker.js';
@@ -73,7 +75,16 @@ importedBindingsMap?: ReadonlyMap<string, ReadonlyMap<string, string>>,
73
75
  * Consulted ONLY when SymbolTable has no unambiguous match (local-first principle). */
74
76
  importedReturnTypesMap?: ReadonlyMap<string, ReadonlyMap<string, string>>,
75
77
  /** Phase 14 E3: cross-file RAW return types for for-loop element extraction. Keyed by filePath → Map<calleeName, rawReturnType>. */
76
- importedRawReturnTypesMap?: ReadonlyMap<string, ReadonlyMap<string, string>>, heritageMap?: HeritageMap, bindingAccumulator?: BindingAccumulator) => Promise<ExtractedHeritage[]>;
78
+ importedRawReturnTypesMap?: ReadonlyMap<string, ReadonlyMap<string, string>>, heritageMap?: HeritageMap, bindingAccumulator?: BindingAccumulator,
79
+ /**
80
+ * Optional cache for compiled `Parser.Query` objects keyed by language name.
81
+ * When provided, compiled queries are reused across calls instead of being
82
+ * re-compiled from the query string for every file. Callers that invoke
83
+ * `processCalls` many times with single-file batches (e.g. the cross-file
84
+ * propagation phase) should pass a long-lived map here to avoid O(N)
85
+ * query recompilation overhead.
86
+ */
87
+ compiledQueryCache?: Map<SupportedLanguages, Parser.Query>) => Promise<ExtractedHeritage[]>;
77
88
  /** Per-file cache for module-alias widening. Cleared between files. */
78
89
  type WidenCache = Map<string, readonly SymbolDefinition[]>;
79
90
  /**
@@ -628,7 +628,16 @@ importedBindingsMap,
628
628
  * Consulted ONLY when SymbolTable has no unambiguous match (local-first principle). */
629
629
  importedReturnTypesMap,
630
630
  /** Phase 14 E3: cross-file RAW return types for for-loop element extraction. Keyed by filePath → Map<calleeName, rawReturnType>. */
631
- importedRawReturnTypesMap, heritageMap, bindingAccumulator) => {
631
+ importedRawReturnTypesMap, heritageMap, bindingAccumulator,
632
+ /**
633
+ * Optional cache for compiled `Parser.Query` objects keyed by language name.
634
+ * When provided, compiled queries are reused across calls instead of being
635
+ * re-compiled from the query string for every file. Callers that invoke
636
+ * `processCalls` many times with single-file batches (e.g. the cross-file
637
+ * propagation phase) should pass a long-lived map here to avoid O(N)
638
+ * query recompilation overhead.
639
+ */
640
+ compiledQueryCache) => {
632
641
  const parser = await loadParser();
633
642
  const collectedHeritage = [];
634
643
  const pendingWrites = [];
@@ -678,7 +687,11 @@ importedRawReturnTypesMap, heritageMap, bindingAccumulator) => {
678
687
  let matches;
679
688
  try {
680
689
  const lang = parser.getLanguage();
681
- const query = new Parser.Query(lang, queryStr);
690
+ let query = compiledQueryCache?.get(language);
691
+ if (!query) {
692
+ query = new Parser.Query(lang, queryStr);
693
+ compiledQueryCache?.set(language, query);
694
+ }
682
695
  matches = query.matches(tree.rootNode);
683
696
  }
684
697
  catch (queryError) {
@@ -9,9 +9,10 @@
9
9
  */
10
10
  import { processCalls, buildImportedReturnTypes, buildImportedRawReturnTypes, } from '../call-processor.js';
11
11
  import { createASTCache } from '../ast-cache.js';
12
- import { getLanguageFromFilename } from '../../../_shared/index.js';
12
+ import { getLanguageFromFilename, } from '../../../_shared/index.js';
13
13
  import { readFileContents } from '../filesystem-walker.js';
14
14
  import { isLanguageAvailable } from '../../tree-sitter/parser-loader.js';
15
+ import { isRegistryPrimary } from '../registry-primary-flag.js';
15
16
  import { topologicalLevelSort } from '../utils/graph-sort.js';
16
17
  import { isDev } from '../utils/env.js';
17
18
  import { logger } from '../../logger.js';
@@ -88,6 +89,40 @@ export async function runCrossFileBindingPropagation(graph, ctx, parseExportedTy
88
89
  let crossFileResolved = 0;
89
90
  const crossFileStart = Date.now();
90
91
  const astCache = createASTCache(AST_CACHE_CAP);
92
+ // Compiled query objects keyed by language name. Shared across all processCalls
93
+ // invocations in this phase so the same tree-sitter query string is only
94
+ // compiled once per language instead of once per file (O(1) vs O(N)).
95
+ const compiledQueryCache = new Map();
96
+ // Snapshot total topological candidates for progress math. We walk the
97
+ // levels once more here (fast — no I/O) so we can report meaningful
98
+ // percentages rather than a frozen display.
99
+ let totalCandidates = 0;
100
+ for (const level of levels) {
101
+ for (const filePath of level) {
102
+ if (totalCandidates >= MAX_CROSS_FILE_REPROCESS)
103
+ break;
104
+ const imports = ctx.namedImportMap.get(filePath);
105
+ if (!imports)
106
+ continue;
107
+ if (!allPathSet.has(filePath))
108
+ continue;
109
+ const lang = getLanguageFromFilename(filePath);
110
+ if (!lang || !isLanguageAvailable(lang))
111
+ continue;
112
+ // Registry-primary languages have their call resolution handled by the
113
+ // scope-resolution pipeline — processCalls skips them immediately. Skip
114
+ // here too so we avoid the I/O cost (readFileContents) and map-building
115
+ // overhead for files that would be no-ops anyway.
116
+ if (isRegistryPrimary(lang))
117
+ continue;
118
+ totalCandidates++;
119
+ }
120
+ if (totalCandidates >= MAX_CROSS_FILE_REPROCESS)
121
+ break;
122
+ }
123
+ const cappedTotal = Math.min(totalCandidates, MAX_CROSS_FILE_REPROCESS);
124
+ /** Emit a progress event every PROGRESS_INTERVAL files so the UI stays alive. */
125
+ const PROGRESS_INTERVAL = 25;
91
126
  for (const level of levels) {
92
127
  const levelCandidates = [];
93
128
  for (const filePath of level) {
@@ -114,6 +149,11 @@ export async function runCrossFileBindingPropagation(graph, ctx, parseExportedTy
114
149
  const lang = getLanguageFromFilename(filePath);
115
150
  if (!lang || !isLanguageAvailable(lang))
116
151
  continue;
152
+ // Registry-primary languages have their call resolution handled by the
153
+ // scope-resolution pipeline — processCalls skips them immediately. Skip
154
+ // here to avoid readFileContents I/O and map-building for no-op files.
155
+ if (isRegistryPrimary(lang))
156
+ continue;
117
157
  levelCandidates.push({ filePath, seeded, importedReturns, importedRawReturns });
118
158
  }
119
159
  if (levelCandidates.length === 0)
@@ -136,8 +176,20 @@ export async function runCrossFileBindingPropagation(graph, ctx, parseExportedTy
136
176
  if (importedRawReturns.size > 0) {
137
177
  importedRawReturnTypesMap.set(filePath, importedRawReturns);
138
178
  }
139
- await processCalls(graph, reFile, astCache, ctx, undefined, exportedTypeMap, bindings.size > 0 ? bindings : undefined, importedReturnTypesMap.size > 0 ? importedReturnTypesMap : undefined, importedRawReturnTypesMap.size > 0 ? importedRawReturnTypesMap : undefined);
179
+ await processCalls(graph, reFile, astCache, ctx, undefined, exportedTypeMap, bindings.size > 0 ? bindings : undefined, importedReturnTypesMap.size > 0 ? importedReturnTypesMap : undefined, importedRawReturnTypesMap.size > 0 ? importedRawReturnTypesMap : undefined, undefined, undefined, compiledQueryCache);
140
180
  crossFileResolved++;
181
+ // Emit progress every PROGRESS_INTERVAL files so the UI shows real
182
+ // movement instead of a frozen display (cross-file can take minutes
183
+ // on large repos with many cross-file imports).
184
+ if (crossFileResolved % PROGRESS_INTERVAL === 0 || crossFileResolved === cappedTotal) {
185
+ const pct = cappedTotal > 0 ? Math.round((crossFileResolved / cappedTotal) * 8) : 0;
186
+ onProgress({
187
+ phase: 'parsing',
188
+ percent: 82 + pct,
189
+ message: `Cross-file type propagation (${crossFileResolved}/${cappedTotal} files)...`,
190
+ stats: { filesProcessed: crossFileResolved, totalFiles, nodesCreated: graph.nodeCount },
191
+ });
192
+ }
141
193
  }
142
194
  if (crossFileResolved >= MAX_CROSS_FILE_REPROCESS) {
143
195
  if (isDev)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitnexus",
3
- "version": "1.6.5-rc.46",
3
+ "version": "1.6.5-rc.48",
4
4
  "description": "Graph-powered code intelligence for AI agents. Index any codebase, query via MCP or CLI.",
5
5
  "author": "Abhigyan Patwari",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
@@ -35,16 +35,16 @@ CFLAGS_CC_Debug := \
35
35
  -fno-rtti \
36
36
  -fno-exceptions \
37
37
  -fno-strict-aliasing \
38
- -std=gnu++17
38
+ -std=gnu++20
39
39
 
40
40
  INCS_Debug := \
41
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
42
- -I/home/runner/.cache/node-gyp/22.22.2/src \
43
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
44
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
45
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
46
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
47
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
41
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
42
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
43
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
44
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
45
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
46
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
47
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
48
48
 
49
49
  DEFS_Release := \
50
50
  '-DNODE_GYP_MODULE_NAME=node_addon_api' \
@@ -77,16 +77,16 @@ CFLAGS_CC_Release := \
77
77
  -fno-rtti \
78
78
  -fno-exceptions \
79
79
  -fno-strict-aliasing \
80
- -std=gnu++17
80
+ -std=gnu++20
81
81
 
82
82
  INCS_Release := \
83
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
84
- -I/home/runner/.cache/node-gyp/22.22.2/src \
85
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
86
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
87
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
88
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
89
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
83
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
84
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
85
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
86
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
87
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
88
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
89
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
90
90
 
91
91
  OBJS :=
92
92
 
@@ -35,16 +35,16 @@ CFLAGS_CC_Debug := \
35
35
  -fno-rtti \
36
36
  -fno-exceptions \
37
37
  -fno-strict-aliasing \
38
- -std=gnu++17
38
+ -std=gnu++20
39
39
 
40
40
  INCS_Debug := \
41
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
42
- -I/home/runner/.cache/node-gyp/22.22.2/src \
43
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
44
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
45
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
46
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
47
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
41
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
42
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
43
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
44
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
45
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
46
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
47
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
48
48
 
49
49
  DEFS_Release := \
50
50
  '-DNODE_GYP_MODULE_NAME=node_addon_api_except' \
@@ -77,16 +77,16 @@ CFLAGS_CC_Release := \
77
77
  -fno-rtti \
78
78
  -fno-exceptions \
79
79
  -fno-strict-aliasing \
80
- -std=gnu++17
80
+ -std=gnu++20
81
81
 
82
82
  INCS_Release := \
83
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
84
- -I/home/runner/.cache/node-gyp/22.22.2/src \
85
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
86
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
87
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
88
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
89
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
83
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
84
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
85
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
86
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
87
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
88
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
89
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
90
90
 
91
91
  OBJS :=
92
92
 
@@ -35,16 +35,16 @@ CFLAGS_CC_Debug := \
35
35
  -fno-rtti \
36
36
  -fno-exceptions \
37
37
  -fno-strict-aliasing \
38
- -std=gnu++17
38
+ -std=gnu++20
39
39
 
40
40
  INCS_Debug := \
41
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
42
- -I/home/runner/.cache/node-gyp/22.22.2/src \
43
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
44
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
45
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
46
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
47
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
41
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
42
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
43
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
44
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
45
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
46
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
47
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
48
48
 
49
49
  DEFS_Release := \
50
50
  '-DNODE_GYP_MODULE_NAME=node_addon_api_except_all' \
@@ -77,16 +77,16 @@ CFLAGS_CC_Release := \
77
77
  -fno-rtti \
78
78
  -fno-exceptions \
79
79
  -fno-strict-aliasing \
80
- -std=gnu++17
80
+ -std=gnu++20
81
81
 
82
82
  INCS_Release := \
83
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
84
- -I/home/runner/.cache/node-gyp/22.22.2/src \
85
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
86
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
87
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
88
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
89
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
83
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
84
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
85
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
86
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
87
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
88
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
89
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
90
90
 
91
91
  OBJS :=
92
92
 
@@ -35,16 +35,16 @@ CFLAGS_CC_Debug := \
35
35
  -fno-rtti \
36
36
  -fno-exceptions \
37
37
  -fno-strict-aliasing \
38
- -std=gnu++17
38
+ -std=gnu++20
39
39
 
40
40
  INCS_Debug := \
41
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
42
- -I/home/runner/.cache/node-gyp/22.22.2/src \
43
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
44
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
45
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
46
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
47
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
41
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
42
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
43
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
44
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
45
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
46
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
47
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
48
48
 
49
49
  DEFS_Release := \
50
50
  '-DNODE_GYP_MODULE_NAME=node_addon_api_maybe' \
@@ -77,16 +77,16 @@ CFLAGS_CC_Release := \
77
77
  -fno-rtti \
78
78
  -fno-exceptions \
79
79
  -fno-strict-aliasing \
80
- -std=gnu++17
80
+ -std=gnu++20
81
81
 
82
82
  INCS_Release := \
83
- -I/home/runner/.cache/node-gyp/22.22.2/include/node \
84
- -I/home/runner/.cache/node-gyp/22.22.2/src \
85
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/config \
86
- -I/home/runner/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
87
- -I/home/runner/.cache/node-gyp/22.22.2/deps/uv/include \
88
- -I/home/runner/.cache/node-gyp/22.22.2/deps/zlib \
89
- -I/home/runner/.cache/node-gyp/22.22.2/deps/v8/include
83
+ -I/home/runner/.cache/node-gyp/24.15.0/include/node \
84
+ -I/home/runner/.cache/node-gyp/24.15.0/src \
85
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/config \
86
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/openssl/openssl/include \
87
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/uv/include \
88
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/zlib \
89
+ -I/home/runner/.cache/node-gyp/24.15.0/deps/v8/include
90
90
 
91
91
  OBJS :=
92
92