gitnexus 1.6.2-rc.8 → 1.6.2

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 (222) hide show
  1. package/dist/_shared/lbug/schema-constants.d.ts +1 -1
  2. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  3. package/dist/_shared/lbug/schema-constants.js +1 -0
  4. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  5. package/dist/_shared/mro-strategy.d.ts +38 -16
  6. package/dist/_shared/mro-strategy.d.ts.map +1 -1
  7. package/dist/cli/ai-context.js +0 -58
  8. package/dist/cli/analyze.js +3 -0
  9. package/dist/core/embeddings/ast-utils.d.ts +22 -0
  10. package/dist/core/embeddings/ast-utils.js +105 -0
  11. package/dist/core/embeddings/character-chunk.d.ts +12 -0
  12. package/dist/core/embeddings/character-chunk.js +43 -0
  13. package/dist/core/embeddings/chunker.d.ts +14 -0
  14. package/dist/core/embeddings/chunker.js +234 -0
  15. package/dist/core/embeddings/embedder.js +5 -0
  16. package/dist/core/embeddings/embedding-pipeline.d.ts +20 -24
  17. package/dist/core/embeddings/embedding-pipeline.js +176 -107
  18. package/dist/core/embeddings/line-index.d.ts +7 -0
  19. package/dist/core/embeddings/line-index.js +42 -0
  20. package/dist/core/embeddings/server-mapping.d.ts +15 -0
  21. package/dist/core/embeddings/server-mapping.js +33 -0
  22. package/dist/core/embeddings/structural-extractor.d.ts +15 -0
  23. package/dist/core/embeddings/structural-extractor.js +58 -0
  24. package/dist/core/embeddings/text-generator.d.ts +20 -13
  25. package/dist/core/embeddings/text-generator.js +151 -119
  26. package/dist/core/embeddings/types.d.ts +81 -3
  27. package/dist/core/embeddings/types.js +105 -3
  28. package/dist/core/group/extractors/http-patterns/node.js +130 -0
  29. package/dist/core/ingestion/call-extractors/configs/c-cpp.d.ts +3 -0
  30. package/dist/core/ingestion/call-extractors/configs/c-cpp.js +8 -0
  31. package/dist/core/ingestion/call-extractors/configs/csharp.d.ts +2 -0
  32. package/dist/core/ingestion/call-extractors/configs/csharp.js +6 -0
  33. package/dist/core/ingestion/call-extractors/configs/dart.d.ts +2 -0
  34. package/dist/core/ingestion/call-extractors/configs/dart.js +5 -0
  35. package/dist/core/ingestion/call-extractors/configs/go.d.ts +2 -0
  36. package/dist/core/ingestion/call-extractors/configs/go.js +5 -0
  37. package/dist/core/ingestion/call-extractors/configs/jvm.d.ts +3 -0
  38. package/dist/core/ingestion/call-extractors/configs/jvm.js +51 -0
  39. package/dist/core/ingestion/call-extractors/configs/php.d.ts +2 -0
  40. package/dist/core/ingestion/call-extractors/configs/php.js +5 -0
  41. package/dist/core/ingestion/call-extractors/configs/python.d.ts +2 -0
  42. package/dist/core/ingestion/call-extractors/configs/python.js +5 -0
  43. package/dist/core/ingestion/call-extractors/configs/ruby.d.ts +2 -0
  44. package/dist/core/ingestion/call-extractors/configs/ruby.js +5 -0
  45. package/dist/core/ingestion/call-extractors/configs/rust.d.ts +2 -0
  46. package/dist/core/ingestion/call-extractors/configs/rust.js +5 -0
  47. package/dist/core/ingestion/call-extractors/configs/swift.d.ts +2 -0
  48. package/dist/core/ingestion/call-extractors/configs/swift.js +5 -0
  49. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.d.ts +3 -0
  50. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.js +8 -0
  51. package/dist/core/ingestion/call-extractors/generic.d.ts +5 -0
  52. package/dist/core/ingestion/call-extractors/generic.js +59 -0
  53. package/dist/core/ingestion/call-processor.d.ts +2 -4
  54. package/dist/core/ingestion/call-processor.js +221 -89
  55. package/dist/core/ingestion/call-routing.d.ts +8 -12
  56. package/dist/core/ingestion/call-routing.js +13 -34
  57. package/dist/core/ingestion/call-types.d.ts +135 -0
  58. package/dist/core/ingestion/call-types.js +2 -0
  59. package/dist/core/ingestion/class-extractors/configs/c-cpp.d.ts +3 -0
  60. package/dist/core/ingestion/class-extractors/configs/c-cpp.js +11 -0
  61. package/dist/core/ingestion/class-extractors/configs/csharp.d.ts +2 -0
  62. package/dist/core/ingestion/class-extractors/configs/csharp.js +21 -0
  63. package/dist/core/ingestion/class-extractors/configs/dart.d.ts +2 -0
  64. package/dist/core/ingestion/class-extractors/configs/dart.js +7 -0
  65. package/dist/core/ingestion/class-extractors/configs/go.d.ts +2 -0
  66. package/dist/core/ingestion/class-extractors/configs/go.js +20 -0
  67. package/dist/core/ingestion/class-extractors/configs/jvm.d.ts +3 -0
  68. package/dist/core/ingestion/class-extractors/configs/jvm.js +35 -0
  69. package/dist/core/ingestion/class-extractors/configs/php.d.ts +2 -0
  70. package/dist/core/ingestion/class-extractors/configs/php.js +7 -0
  71. package/dist/core/ingestion/class-extractors/configs/python.d.ts +2 -0
  72. package/dist/core/ingestion/class-extractors/configs/python.js +7 -0
  73. package/dist/core/ingestion/class-extractors/configs/ruby.d.ts +2 -0
  74. package/dist/core/ingestion/class-extractors/configs/ruby.js +7 -0
  75. package/dist/core/ingestion/class-extractors/configs/rust.d.ts +2 -0
  76. package/dist/core/ingestion/class-extractors/configs/rust.js +7 -0
  77. package/dist/core/ingestion/class-extractors/configs/swift.d.ts +2 -0
  78. package/dist/core/ingestion/class-extractors/configs/swift.js +18 -0
  79. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.d.ts +4 -0
  80. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.js +28 -0
  81. package/dist/core/ingestion/field-types.d.ts +1 -1
  82. package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +13 -0
  83. package/dist/core/ingestion/heritage-extractors/configs/go.js +20 -0
  84. package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +18 -0
  85. package/dist/core/ingestion/heritage-extractors/configs/ruby.js +65 -0
  86. package/dist/core/ingestion/heritage-extractors/generic.d.ts +23 -0
  87. package/dist/core/ingestion/heritage-extractors/generic.js +47 -0
  88. package/dist/core/ingestion/heritage-processor.d.ts +9 -0
  89. package/dist/core/ingestion/heritage-processor.js +120 -85
  90. package/dist/core/ingestion/heritage-types.d.ts +73 -0
  91. package/dist/core/ingestion/heritage-types.js +2 -0
  92. package/dist/core/ingestion/import-resolvers/configs/c-cpp.d.ts +7 -0
  93. package/dist/core/ingestion/import-resolvers/configs/c-cpp.js +14 -0
  94. package/dist/core/ingestion/import-resolvers/configs/csharp.d.ts +8 -0
  95. package/dist/core/ingestion/import-resolvers/configs/csharp.js +27 -0
  96. package/dist/core/ingestion/import-resolvers/configs/dart.d.ts +17 -0
  97. package/dist/core/ingestion/import-resolvers/{dart.js → configs/dart.js} +26 -16
  98. package/dist/core/ingestion/import-resolvers/configs/go.d.ts +8 -0
  99. package/dist/core/ingestion/import-resolvers/configs/go.js +26 -0
  100. package/dist/core/ingestion/import-resolvers/configs/jvm.d.ts +13 -0
  101. package/dist/core/ingestion/import-resolvers/configs/jvm.js +68 -0
  102. package/dist/core/ingestion/import-resolvers/configs/php.d.ts +8 -0
  103. package/dist/core/ingestion/import-resolvers/configs/php.js +15 -0
  104. package/dist/core/ingestion/import-resolvers/configs/python.d.ts +12 -0
  105. package/dist/core/ingestion/import-resolvers/configs/python.js +41 -0
  106. package/dist/core/ingestion/import-resolvers/configs/ruby.d.ts +8 -0
  107. package/dist/core/ingestion/import-resolvers/configs/ruby.js +16 -0
  108. package/dist/core/ingestion/import-resolvers/configs/rust.d.ts +8 -0
  109. package/dist/core/ingestion/import-resolvers/configs/rust.js +54 -0
  110. package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +8 -0
  111. package/dist/core/ingestion/import-resolvers/{swift.js → configs/swift.js} +10 -5
  112. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.d.ts +9 -0
  113. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.js +23 -0
  114. package/dist/core/ingestion/import-resolvers/csharp.d.ts +4 -5
  115. package/dist/core/ingestion/import-resolvers/csharp.js +4 -20
  116. package/dist/core/ingestion/import-resolvers/go.d.ts +4 -5
  117. package/dist/core/ingestion/import-resolvers/go.js +4 -19
  118. package/dist/core/ingestion/import-resolvers/jvm.d.ts +5 -10
  119. package/dist/core/ingestion/import-resolvers/jvm.js +5 -58
  120. package/dist/core/ingestion/import-resolvers/php.d.ts +4 -5
  121. package/dist/core/ingestion/import-resolvers/php.js +4 -7
  122. package/dist/core/ingestion/import-resolvers/python.d.ts +3 -6
  123. package/dist/core/ingestion/import-resolvers/python.js +3 -18
  124. package/dist/core/ingestion/import-resolvers/resolver-factory.d.ts +24 -0
  125. package/dist/core/ingestion/import-resolvers/resolver-factory.js +33 -0
  126. package/dist/core/ingestion/import-resolvers/ruby.d.ts +4 -5
  127. package/dist/core/ingestion/import-resolvers/ruby.js +4 -7
  128. package/dist/core/ingestion/import-resolvers/rust.d.ts +4 -5
  129. package/dist/core/ingestion/import-resolvers/rust.js +4 -47
  130. package/dist/core/ingestion/import-resolvers/standard.d.ts +3 -9
  131. package/dist/core/ingestion/import-resolvers/standard.js +7 -8
  132. package/dist/core/ingestion/import-resolvers/types.d.ts +24 -0
  133. package/dist/core/ingestion/language-provider.d.ts +80 -0
  134. package/dist/core/ingestion/languages/c-cpp.js +18 -12
  135. package/dist/core/ingestion/languages/csharp.js +13 -21
  136. package/dist/core/ingestion/languages/dart.js +13 -7
  137. package/dist/core/ingestion/languages/go.js +14 -20
  138. package/dist/core/ingestion/languages/java.js +13 -18
  139. package/dist/core/ingestion/languages/kotlin.js +13 -13
  140. package/dist/core/ingestion/languages/php.js +13 -7
  141. package/dist/core/ingestion/languages/python.js +13 -7
  142. package/dist/core/ingestion/languages/ruby.js +103 -22
  143. package/dist/core/ingestion/languages/rust.js +13 -7
  144. package/dist/core/ingestion/languages/swift.js +13 -18
  145. package/dist/core/ingestion/languages/typescript.js +18 -23
  146. package/dist/core/ingestion/languages/vue.js +13 -17
  147. package/dist/core/ingestion/model/heritage-map.d.ts +35 -0
  148. package/dist/core/ingestion/model/heritage-map.js +110 -9
  149. package/dist/core/ingestion/model/index.d.ts +2 -2
  150. package/dist/core/ingestion/model/index.js +1 -1
  151. package/dist/core/ingestion/model/resolve.d.ts +33 -28
  152. package/dist/core/ingestion/model/resolve.js +111 -27
  153. package/dist/core/ingestion/parsing-processor.d.ts +1 -2
  154. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +1 -0
  155. package/dist/core/ingestion/pipeline-phases/parse-impl.js +9 -3
  156. package/dist/core/ingestion/pipeline-phases/parse.d.ts +7 -0
  157. package/dist/core/ingestion/pipeline.d.ts +11 -0
  158. package/dist/core/ingestion/pipeline.js +9 -2
  159. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  160. package/dist/core/ingestion/tree-sitter-queries.js +81 -0
  161. package/dist/core/ingestion/type-env.d.ts +1 -1
  162. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -1
  163. package/dist/core/ingestion/utils/ast-helpers.js +22 -2
  164. package/dist/core/ingestion/utils/ruby-self-call.d.ts +52 -0
  165. package/dist/core/ingestion/utils/ruby-self-call.js +59 -0
  166. package/dist/core/ingestion/variable-extractors/configs/c-cpp.d.ts +3 -0
  167. package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +81 -0
  168. package/dist/core/ingestion/variable-extractors/configs/csharp.d.ts +9 -0
  169. package/dist/core/ingestion/variable-extractors/configs/csharp.js +63 -0
  170. package/dist/core/ingestion/variable-extractors/configs/dart.d.ts +2 -0
  171. package/dist/core/ingestion/variable-extractors/configs/dart.js +94 -0
  172. package/dist/core/ingestion/variable-extractors/configs/go.d.ts +2 -0
  173. package/dist/core/ingestion/variable-extractors/configs/go.js +83 -0
  174. package/dist/core/ingestion/variable-extractors/configs/jvm.d.ts +18 -0
  175. package/dist/core/ingestion/variable-extractors/configs/jvm.js +115 -0
  176. package/dist/core/ingestion/variable-extractors/configs/php.d.ts +14 -0
  177. package/dist/core/ingestion/variable-extractors/configs/php.js +58 -0
  178. package/dist/core/ingestion/variable-extractors/configs/python.d.ts +2 -0
  179. package/dist/core/ingestion/variable-extractors/configs/python.js +101 -0
  180. package/dist/core/ingestion/variable-extractors/configs/ruby.d.ts +11 -0
  181. package/dist/core/ingestion/variable-extractors/configs/ruby.js +52 -0
  182. package/dist/core/ingestion/variable-extractors/configs/rust.d.ts +2 -0
  183. package/dist/core/ingestion/variable-extractors/configs/rust.js +76 -0
  184. package/dist/core/ingestion/variable-extractors/configs/swift.d.ts +2 -0
  185. package/dist/core/ingestion/variable-extractors/configs/swift.js +88 -0
  186. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.d.ts +3 -0
  187. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.js +83 -0
  188. package/dist/core/ingestion/variable-extractors/generic.d.ts +5 -0
  189. package/dist/core/ingestion/variable-extractors/generic.js +80 -0
  190. package/dist/core/ingestion/variable-types.d.ts +82 -0
  191. package/dist/core/ingestion/variable-types.js +2 -0
  192. package/dist/core/ingestion/workers/parse-worker.js +244 -217
  193. package/dist/core/ingestion/workers/worker-pool.js +3 -0
  194. package/dist/core/lbug/csv-generator.js +1 -0
  195. package/dist/core/lbug/lbug-adapter.d.ts +4 -5
  196. package/dist/core/lbug/lbug-adapter.js +38 -14
  197. package/dist/core/lbug/schema.d.ts +2 -1
  198. package/dist/core/lbug/schema.js +10 -1
  199. package/dist/core/run-analyze.js +6 -7
  200. package/dist/core/tree-sitter/parser-loader.d.ts +3 -0
  201. package/dist/core/tree-sitter/parser-loader.js +17 -8
  202. package/dist/mcp/core/embedder.js +5 -0
  203. package/dist/mcp/local/local-backend.js +29 -19
  204. package/dist/server/api.js +2 -0
  205. package/dist/types/pipeline.d.ts +6 -0
  206. package/package.json +8 -7
  207. package/scripts/build-tree-sitter-proto.cjs +82 -0
  208. package/vendor/node_modules/node-addon-api/node_addon_api.Makefile +6 -0
  209. package/vendor/node_modules/node-addon-api/node_addon_api.target.mk +104 -0
  210. package/vendor/node_modules/node-addon-api/node_addon_api_except.target.mk +108 -0
  211. package/vendor/node_modules/node-addon-api/node_addon_api_except_all.target.mk +104 -0
  212. package/vendor/node_modules/node-addon-api/node_addon_api_maybe.target.mk +104 -0
  213. package/vendor/tree-sitter-proto/package.json +1 -7
  214. package/dist/core/ingestion/call-sites/extract-language-call-site.d.ts +0 -10
  215. package/dist/core/ingestion/call-sites/extract-language-call-site.js +0 -22
  216. package/dist/core/ingestion/call-sites/java.d.ts +0 -9
  217. package/dist/core/ingestion/call-sites/java.js +0 -30
  218. package/dist/core/ingestion/import-resolvers/dart.d.ts +0 -7
  219. package/dist/core/ingestion/import-resolvers/swift.d.ts +0 -7
  220. package/dist/core/ingestion/import-resolvers/vue.d.ts +0 -8
  221. package/dist/core/ingestion/import-resolvers/vue.js +0 -9
  222. package/scripts/preinstall-cleanup.cjs +0 -34
@@ -791,6 +791,8 @@ export const getLbugStats = async () => {
791
791
  * Load cached embeddings from LadybugDB before a rebuild.
792
792
  * Returns all embedding vectors so they can be re-inserted after the graph is reloaded,
793
793
  * avoiding expensive re-embedding of unchanged nodes.
794
+ *
795
+ * Detects old schema (no chunkIndex column) and returns empty cache to trigger rebuild.
794
796
  */
795
797
  export const loadCachedEmbeddings = async () => {
796
798
  if (!conn) {
@@ -799,19 +801,29 @@ export const loadCachedEmbeddings = async () => {
799
801
  const embeddingNodeIds = new Set();
800
802
  const embeddings = [];
801
803
  try {
802
- // Try to read contentHash alongside the embedding
804
+ // Schema migration detection: query with new columns to verify schema version.
805
+ // Old schema only had (nodeId, embedding); new schema adds (id, chunkIndex, startLine, endLine, contentHash).
806
+ // If the query fails (column missing), we return empty cache to force a full rebuild.
807
+ try {
808
+ const check = await conn.query(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.chunkIndex AS chunkIndex LIMIT 1`);
809
+ const checkResult = Array.isArray(check) ? check[0] : check;
810
+ await checkResult.getAll();
811
+ }
812
+ catch {
813
+ return { embeddingNodeIds: new Set(), embeddings: [] };
814
+ }
815
+ // Try to read contentHash alongside chunk columns
803
816
  let rows;
804
817
  let hasContentHash = true;
805
818
  try {
806
- rows = await conn.query(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.embedding AS embedding, e.contentHash AS contentHash`);
819
+ rows = await conn.query(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.chunkIndex AS chunkIndex, e.startLine AS startLine, e.endLine AS endLine, e.embedding AS embedding, e.contentHash AS contentHash`);
807
820
  }
808
821
  catch (err) {
809
- // Only fall back for missing-column errors (legacy DBs without contentHash).
810
- // Rethrow transient / connection errors so callers see them.
822
+ // Fallback for legacy DBs without contentHash column
811
823
  const msg = err?.message ?? '';
812
824
  if (isMissingColumnOrTableError(msg)) {
813
825
  hasContentHash = false;
814
- rows = await conn.query(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.embedding AS embedding`);
826
+ rows = await conn.query(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.chunkIndex AS chunkIndex, e.startLine AS startLine, e.endLine AS endLine, e.embedding AS embedding`);
815
827
  }
816
828
  else {
817
829
  throw err;
@@ -823,14 +835,17 @@ export const loadCachedEmbeddings = async () => {
823
835
  if (!nodeId)
824
836
  continue;
825
837
  embeddingNodeIds.add(nodeId);
826
- const embedding = row.embedding ?? row[1];
838
+ const embedding = row.embedding ?? row[4];
827
839
  if (embedding) {
828
840
  embeddings.push({
829
841
  nodeId,
842
+ chunkIndex: Number(row.chunkIndex ?? row[1] ?? 0),
843
+ startLine: Number(row.startLine ?? row[2] ?? 0),
844
+ endLine: Number(row.endLine ?? row[3] ?? 0),
830
845
  embedding: Array.isArray(embedding)
831
846
  ? embedding.map(Number)
832
847
  : Array.from(embedding).map(Number),
833
- contentHash: hasContentHash ? (row.contentHash ?? row[2] ?? undefined) : undefined,
848
+ contentHash: hasContentHash ? (row.contentHash ?? row[5] ?? undefined) : undefined,
834
849
  });
835
850
  }
836
851
  }
@@ -850,16 +865,25 @@ export const loadCachedEmbeddings = async () => {
850
865
  */
851
866
  export const fetchExistingEmbeddingHashes = async (execQuery) => {
852
867
  try {
853
- const rows = await execQuery(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.contentHash AS contentHash`);
868
+ const rows = await execQuery(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId, e.chunkIndex AS chunkIndex, e.startLine AS startLine, e.endLine AS endLine, e.contentHash AS contentHash`);
854
869
  if (!rows || rows.length === 0)
855
870
  return undefined;
856
871
  const map = new Map();
857
872
  for (const r of rows) {
858
873
  const nodeId = r.nodeId ?? r[0];
859
- const hash = r.contentHash ?? r[1] ?? STALE_HASH_SENTINEL;
874
+ const chunkIndex = r.chunkIndex ?? r[1];
875
+ const startLine = r.startLine ?? r[2];
876
+ const endLine = r.endLine ?? r[3];
877
+ const hash = r.contentHash ?? r[4] ?? STALE_HASH_SENTINEL;
860
878
  if (nodeId) {
861
- // Empty/null contentHash means legacy row — treat as stale so it gets re-embedded
862
- map.set(nodeId, hash || STALE_HASH_SENTINEL);
879
+ const hasChunkMetadata = chunkIndex !== undefined &&
880
+ chunkIndex !== null &&
881
+ startLine !== undefined &&
882
+ startLine !== null &&
883
+ endLine !== undefined &&
884
+ endLine !== null;
885
+ // Empty/null contentHash or missing chunk metadata means legacy row — treat as stale.
886
+ map.set(nodeId, hasChunkMetadata && hash ? hash : STALE_HASH_SENTINEL);
863
887
  }
864
888
  }
865
889
  return map;
@@ -867,7 +891,7 @@ export const fetchExistingEmbeddingHashes = async (execQuery) => {
867
891
  catch (err) {
868
892
  const msg = err?.message ?? '';
869
893
  if (isMissingColumnOrTableError(msg)) {
870
- // Column or table missing — try fallback without contentHash
894
+ // Legacy rows missing chunk-aware columns treat every row as stale.
871
895
  try {
872
896
  const rows = await execQuery(`MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN e.nodeId AS nodeId`);
873
897
  if (!rows || rows.length === 0)
@@ -876,9 +900,9 @@ export const fetchExistingEmbeddingHashes = async (execQuery) => {
876
900
  for (const r of rows) {
877
901
  const nodeId = r.nodeId ?? r[0];
878
902
  if (nodeId)
879
- map.set(nodeId, STALE_HASH_SENTINEL); // no contentHash — treat as stale
903
+ map.set(nodeId, STALE_HASH_SENTINEL);
880
904
  }
881
- console.log(`[embed] ${map.size} nodes in legacy DB (no contentHash) — all treated as stale`);
905
+ console.log(`[embed] ${map.size} nodes in legacy DB (missing chunk-aware columns) — all treated as stale`);
882
906
  return map;
883
907
  }
884
908
  catch (fallbackErr) {
@@ -31,6 +31,7 @@ export declare const IMPL_SCHEMA: string;
31
31
  export declare const TYPE_ALIAS_SCHEMA: string;
32
32
  export declare const CONST_SCHEMA: string;
33
33
  export declare const STATIC_SCHEMA: string;
34
+ export declare const VARIABLE_SCHEMA: string;
34
35
  export declare const PROPERTY_SCHEMA: string;
35
36
  export declare const RECORD_SCHEMA: string;
36
37
  export declare const DELEGATE_SCHEMA: string;
@@ -41,7 +42,7 @@ export declare const MODULE_SCHEMA: string;
41
42
  export declare const ROUTE_SCHEMA = "\nCREATE NODE TABLE Route (\n id STRING,\n name STRING,\n filePath STRING,\n responseKeys STRING[],\n errorKeys STRING[],\n middleware STRING[],\n PRIMARY KEY (id)\n)";
42
43
  export declare const TOOL_SCHEMA = "\nCREATE NODE TABLE Tool (\n id STRING,\n name STRING,\n filePath STRING,\n description STRING,\n PRIMARY KEY (id)\n)";
43
44
  export declare const SECTION_SCHEMA = "\nCREATE NODE TABLE Section (\n id STRING,\n name STRING,\n filePath STRING,\n startLine INT64,\n endLine INT64,\n level INT64,\n content STRING,\n description STRING,\n PRIMARY KEY (id)\n)";
44
- export declare const RELATION_SCHEMA = "\nCREATE REL TABLE CodeRelation (\n FROM File TO File,\n FROM File TO Folder,\n FROM File TO Function,\n FROM File TO Class,\n FROM File TO Interface,\n FROM File TO Method,\n FROM File TO CodeElement,\n FROM File TO `Struct`,\n FROM File TO `Enum`,\n FROM File TO `Macro`,\n FROM File TO `Typedef`,\n FROM File TO `Union`,\n FROM File TO `Namespace`,\n FROM File TO `Trait`,\n FROM File TO `Impl`,\n FROM File TO `TypeAlias`,\n FROM File TO `Const`,\n FROM File TO `Static`,\n FROM File TO `Property`,\n FROM File TO `Record`,\n FROM File TO `Delegate`,\n FROM File TO `Annotation`,\n FROM File TO `Constructor`,\n FROM File TO `Template`,\n FROM File TO `Module`,\n FROM File TO Section,\n FROM Folder TO Folder,\n FROM Folder TO File,\n FROM Function TO Function,\n FROM Function TO Method,\n FROM Function TO Class,\n FROM Function TO Community,\n FROM Function TO `Macro`,\n FROM Function TO `Struct`,\n FROM Function TO `Template`,\n FROM Function TO `Enum`,\n FROM Function TO `Namespace`,\n FROM Function TO `TypeAlias`,\n FROM Function TO `Module`,\n FROM Function TO `Impl`,\n FROM Function TO Interface,\n FROM Function TO `Constructor`,\n FROM Function TO `Const`,\n FROM Function TO `Typedef`,\n FROM Function TO `Union`,\n FROM Function TO `Property`,\n FROM Function TO CodeElement,\n FROM Class TO Method,\n FROM Class TO Function,\n FROM Class TO Class,\n FROM Class TO Interface,\n FROM Class TO Community,\n FROM Class TO `Template`,\n FROM Class TO `TypeAlias`,\n FROM Class TO `Struct`,\n FROM Class TO `Enum`,\n FROM Class TO `Annotation`,\n FROM Class TO `Constructor`,\n FROM Class TO `Trait`,\n FROM Class TO `Macro`,\n FROM Class TO `Impl`,\n FROM Class TO `Union`,\n FROM Class TO `Namespace`,\n FROM Class TO `Typedef`,\n FROM Class TO `Property`,\n FROM Method TO Function,\n FROM Method TO Method,\n FROM Method TO Class,\n FROM Method TO Community,\n FROM Method TO `Template`,\n FROM Method TO `Struct`,\n FROM Method TO `TypeAlias`,\n FROM Method TO `Enum`,\n FROM Method TO `Macro`,\n FROM Method TO `Namespace`,\n FROM Method TO `Module`,\n FROM Method TO `Impl`,\n FROM Method TO Interface,\n FROM Method TO `Constructor`,\n FROM Method TO `Property`,\n FROM Method TO CodeElement,\n FROM `Template` TO `Template`,\n FROM `Template` TO Function,\n FROM `Template` TO Method,\n FROM `Template` TO Class,\n FROM `Template` TO `Struct`,\n FROM `Template` TO `TypeAlias`,\n FROM `Template` TO `Enum`,\n FROM `Template` TO `Macro`,\n FROM `Template` TO Interface,\n FROM `Template` TO `Constructor`,\n FROM `Module` TO `Module`,\n FROM Section TO Section,\n FROM Section TO File,\n FROM File TO Route,\n FROM Function TO Route,\n FROM Method TO Route,\n FROM File TO Tool,\n FROM Function TO Tool,\n FROM Method TO Tool,\n FROM CodeElement TO Community,\n FROM Interface TO Community,\n FROM Interface TO Function,\n FROM Interface TO Method,\n FROM Interface TO Class,\n FROM Interface TO Interface,\n FROM Interface TO `TypeAlias`,\n FROM Interface TO `Struct`,\n FROM Interface TO `Constructor`,\n FROM Interface TO `Property`,\n FROM `Struct` TO Community,\n FROM `Struct` TO `Trait`,\n FROM `Struct` TO `Struct`,\n FROM `Struct` TO Class,\n FROM `Struct` TO `Enum`,\n FROM `Struct` TO Function,\n FROM `Struct` TO Method,\n FROM `Struct` TO Interface,\n FROM `Struct` TO `Constructor`,\n FROM `Struct` TO `Property`,\n FROM `Enum` TO `Enum`,\n FROM `Enum` TO Community,\n FROM `Enum` TO Class,\n FROM `Enum` TO Interface,\n FROM `Macro` TO Community,\n FROM `Macro` TO Function,\n FROM `Macro` TO Method,\n FROM `Module` TO Function,\n FROM `Module` TO Method,\n FROM `Typedef` TO Community,\n FROM `Union` TO Community,\n FROM `Namespace` TO Community,\n FROM `Namespace` TO `Struct`,\n FROM `Trait` TO Method,\n FROM `Trait` TO `Constructor`,\n FROM `Trait` TO `Property`,\n FROM `Trait` TO Community,\n FROM `Impl` TO Method,\n FROM `Impl` TO `Constructor`,\n FROM `Impl` TO `Property`,\n FROM `Impl` TO Community,\n FROM `Impl` TO `Trait`,\n FROM `Impl` TO `Struct`,\n FROM `Impl` TO `Impl`,\n FROM `TypeAlias` TO Community,\n FROM `TypeAlias` TO `Trait`,\n FROM `TypeAlias` TO Class,\n FROM `Const` TO Community,\n FROM `Static` TO Community,\n FROM `Property` TO Community,\n FROM `Record` TO Method,\n FROM `Record` TO `Constructor`,\n FROM `Record` TO `Property`,\n FROM `Record` TO Community,\n FROM `Delegate` TO Community,\n FROM `Annotation` TO Community,\n FROM `Constructor` TO Community,\n FROM `Constructor` TO Interface,\n FROM `Constructor` TO Class,\n FROM `Constructor` TO Method,\n FROM `Constructor` TO Function,\n FROM `Constructor` TO `Constructor`,\n FROM `Constructor` TO `Struct`,\n FROM `Constructor` TO `Macro`,\n FROM `Constructor` TO `Template`,\n FROM `Constructor` TO `TypeAlias`,\n FROM `Constructor` TO `Enum`,\n FROM `Constructor` TO `Annotation`,\n FROM `Constructor` TO `Impl`,\n FROM `Constructor` TO `Namespace`,\n FROM `Constructor` TO `Module`,\n FROM `Constructor` TO `Property`,\n FROM `Constructor` TO `Typedef`,\n FROM `Template` TO Community,\n FROM `Module` TO Community,\n FROM Function TO Process,\n FROM Method TO Process,\n FROM Class TO Process,\n FROM Interface TO Process,\n FROM `Struct` TO Process,\n FROM `Constructor` TO Process,\n FROM `Module` TO Process,\n FROM `Macro` TO Process,\n FROM `Impl` TO Process,\n FROM `Typedef` TO Process,\n FROM `TypeAlias` TO Process,\n FROM `Enum` TO Process,\n FROM `Union` TO Process,\n FROM `Namespace` TO Process,\n FROM `Trait` TO Process,\n FROM `Const` TO Process,\n FROM `Static` TO Process,\n FROM `Property` TO Process,\n FROM `Record` TO Process,\n FROM `Delegate` TO Process,\n FROM `Annotation` TO Process,\n FROM `Template` TO Process,\n FROM CodeElement TO Process,\n FROM Route TO Process,\n FROM Tool TO Process,\n type STRING,\n confidence DOUBLE,\n reason STRING,\n step INT32\n)";
45
+ export declare const RELATION_SCHEMA = "\nCREATE REL TABLE CodeRelation (\n FROM File TO File,\n FROM File TO Folder,\n FROM File TO Function,\n FROM File TO Class,\n FROM File TO Interface,\n FROM File TO Method,\n FROM File TO CodeElement,\n FROM File TO `Struct`,\n FROM File TO `Enum`,\n FROM File TO `Macro`,\n FROM File TO `Typedef`,\n FROM File TO `Union`,\n FROM File TO `Namespace`,\n FROM File TO `Trait`,\n FROM File TO `Impl`,\n FROM File TO `TypeAlias`,\n FROM File TO `Const`,\n FROM File TO `Static`,\n FROM File TO `Variable`,\n FROM File TO `Property`,\n FROM File TO `Record`,\n FROM File TO `Delegate`,\n FROM File TO `Annotation`,\n FROM File TO `Constructor`,\n FROM File TO `Template`,\n FROM File TO `Module`,\n FROM File TO Section,\n FROM Folder TO Folder,\n FROM Folder TO File,\n FROM Function TO Function,\n FROM Function TO Method,\n FROM Function TO Class,\n FROM Function TO Community,\n FROM Function TO `Macro`,\n FROM Function TO `Struct`,\n FROM Function TO `Template`,\n FROM Function TO `Enum`,\n FROM Function TO `Namespace`,\n FROM Function TO `TypeAlias`,\n FROM Function TO `Module`,\n FROM Function TO `Impl`,\n FROM Function TO Interface,\n FROM Function TO `Constructor`,\n FROM Function TO `Const`,\n FROM Function TO `Typedef`,\n FROM Function TO `Union`,\n FROM Function TO `Property`,\n FROM Function TO CodeElement,\n FROM Class TO Method,\n FROM Class TO Function,\n FROM Class TO Class,\n FROM Class TO Interface,\n FROM Class TO Community,\n FROM Class TO `Template`,\n FROM Class TO `TypeAlias`,\n FROM Class TO `Struct`,\n FROM Class TO `Enum`,\n FROM Class TO `Annotation`,\n FROM Class TO `Constructor`,\n FROM Class TO `Trait`,\n FROM Class TO `Macro`,\n FROM Class TO `Impl`,\n FROM Class TO `Union`,\n FROM Class TO `Namespace`,\n FROM Class TO `Typedef`,\n FROM Class TO `Property`,\n FROM Method TO Function,\n FROM Method TO Method,\n FROM Method TO Class,\n FROM Method TO Community,\n FROM Method TO `Template`,\n FROM Method TO `Struct`,\n FROM Method TO `TypeAlias`,\n FROM Method TO `Enum`,\n FROM Method TO `Macro`,\n FROM Method TO `Namespace`,\n FROM Method TO `Module`,\n FROM Method TO `Impl`,\n FROM Method TO Interface,\n FROM Method TO `Constructor`,\n FROM Method TO `Property`,\n FROM Method TO CodeElement,\n FROM `Template` TO `Template`,\n FROM `Template` TO Function,\n FROM `Template` TO Method,\n FROM `Template` TO Class,\n FROM `Template` TO `Struct`,\n FROM `Template` TO `TypeAlias`,\n FROM `Template` TO `Enum`,\n FROM `Template` TO `Macro`,\n FROM `Template` TO Interface,\n FROM `Template` TO `Constructor`,\n FROM `Module` TO `Module`,\n FROM Section TO Section,\n FROM Section TO File,\n FROM File TO Route,\n FROM Function TO Route,\n FROM Method TO Route,\n FROM File TO Tool,\n FROM Function TO Tool,\n FROM Method TO Tool,\n FROM CodeElement TO Community,\n FROM Interface TO Community,\n FROM Interface TO Function,\n FROM Interface TO Method,\n FROM Interface TO Class,\n FROM Interface TO Interface,\n FROM Interface TO `TypeAlias`,\n FROM Interface TO `Struct`,\n FROM Interface TO `Constructor`,\n FROM Interface TO `Property`,\n FROM `Struct` TO Community,\n FROM `Struct` TO `Trait`,\n FROM `Struct` TO `Struct`,\n FROM `Struct` TO Class,\n FROM `Struct` TO `Enum`,\n FROM `Struct` TO Function,\n FROM `Struct` TO Method,\n FROM `Struct` TO Interface,\n FROM `Struct` TO `Constructor`,\n FROM `Struct` TO `Property`,\n FROM `Enum` TO `Enum`,\n FROM `Enum` TO Community,\n FROM `Enum` TO Class,\n FROM `Enum` TO Interface,\n FROM `Macro` TO Community,\n FROM `Macro` TO Function,\n FROM `Macro` TO Method,\n FROM `Module` TO Function,\n FROM `Module` TO Method,\n FROM `Typedef` TO Community,\n FROM `Union` TO Community,\n FROM `Namespace` TO Community,\n FROM `Namespace` TO `Struct`,\n FROM `Trait` TO Method,\n FROM `Trait` TO `Constructor`,\n FROM `Trait` TO `Property`,\n FROM `Trait` TO Community,\n FROM `Impl` TO Method,\n FROM `Impl` TO `Constructor`,\n FROM `Impl` TO `Property`,\n FROM `Impl` TO Community,\n FROM `Impl` TO `Trait`,\n FROM `Impl` TO `Struct`,\n FROM `Impl` TO `Impl`,\n FROM `TypeAlias` TO Community,\n FROM `TypeAlias` TO `Trait`,\n FROM `TypeAlias` TO Class,\n FROM `Const` TO Community,\n FROM `Static` TO Community,\n FROM `Variable` TO Community,\n FROM `Property` TO Community,\n FROM `Record` TO Method,\n FROM `Record` TO `Constructor`,\n FROM `Record` TO `Property`,\n FROM `Record` TO Community,\n FROM `Delegate` TO Community,\n FROM `Annotation` TO Community,\n FROM `Constructor` TO Community,\n FROM `Constructor` TO Interface,\n FROM `Constructor` TO Class,\n FROM `Constructor` TO Method,\n FROM `Constructor` TO Function,\n FROM `Constructor` TO `Constructor`,\n FROM `Constructor` TO `Struct`,\n FROM `Constructor` TO `Macro`,\n FROM `Constructor` TO `Template`,\n FROM `Constructor` TO `TypeAlias`,\n FROM `Constructor` TO `Enum`,\n FROM `Constructor` TO `Annotation`,\n FROM `Constructor` TO `Impl`,\n FROM `Constructor` TO `Namespace`,\n FROM `Constructor` TO `Module`,\n FROM `Constructor` TO `Property`,\n FROM `Constructor` TO `Typedef`,\n FROM `Template` TO Community,\n FROM `Module` TO Community,\n FROM Function TO Process,\n FROM Method TO Process,\n FROM Class TO Process,\n FROM Interface TO Process,\n FROM `Struct` TO Process,\n FROM `Constructor` TO Process,\n FROM `Module` TO Process,\n FROM `Macro` TO Process,\n FROM `Impl` TO Process,\n FROM `Typedef` TO Process,\n FROM `TypeAlias` TO Process,\n FROM `Enum` TO Process,\n FROM `Union` TO Process,\n FROM `Namespace` TO Process,\n FROM `Trait` TO Process,\n FROM `Const` TO Process,\n FROM `Static` TO Process,\n FROM `Variable` TO Process,\n FROM `Property` TO Process,\n FROM `Record` TO Process,\n FROM `Delegate` TO Process,\n FROM `Annotation` TO Process,\n FROM `Template` TO Process,\n FROM CodeElement TO Process,\n FROM Route TO Process,\n FROM Tool TO Process,\n type STRING,\n confidence DOUBLE,\n reason STRING,\n step INT32\n)";
45
46
  export declare const EMBEDDING_DIMS: number;
46
47
  /** HNSW vector index name for the CodeEmbedding table. */
47
48
  export declare const EMBEDDING_INDEX_NAME = "code_embedding_idx";
@@ -149,6 +149,7 @@ export const IMPL_SCHEMA = CODE_ELEMENT_BASE('Impl');
149
149
  export const TYPE_ALIAS_SCHEMA = CODE_ELEMENT_BASE('TypeAlias');
150
150
  export const CONST_SCHEMA = CODE_ELEMENT_BASE('Const');
151
151
  export const STATIC_SCHEMA = CODE_ELEMENT_BASE('Static');
152
+ export const VARIABLE_SCHEMA = CODE_ELEMENT_BASE('Variable');
152
153
  export const PROPERTY_SCHEMA = CODE_ELEMENT_BASE('Property');
153
154
  export const RECORD_SCHEMA = CODE_ELEMENT_BASE('Record');
154
155
  export const DELEGATE_SCHEMA = CODE_ELEMENT_BASE('Delegate');
@@ -213,6 +214,7 @@ CREATE REL TABLE ${REL_TABLE_NAME} (
213
214
  FROM File TO \`TypeAlias\`,
214
215
  FROM File TO \`Const\`,
215
216
  FROM File TO \`Static\`,
217
+ FROM File TO \`Variable\`,
216
218
  FROM File TO \`Property\`,
217
219
  FROM File TO \`Record\`,
218
220
  FROM File TO \`Delegate\`,
@@ -344,6 +346,7 @@ CREATE REL TABLE ${REL_TABLE_NAME} (
344
346
  FROM \`TypeAlias\` TO Class,
345
347
  FROM \`Const\` TO Community,
346
348
  FROM \`Static\` TO Community,
349
+ FROM \`Variable\` TO Community,
347
350
  FROM \`Property\` TO Community,
348
351
  FROM \`Record\` TO Method,
349
352
  FROM \`Record\` TO \`Constructor\`,
@@ -387,6 +390,7 @@ CREATE REL TABLE ${REL_TABLE_NAME} (
387
390
  FROM \`Trait\` TO Process,
388
391
  FROM \`Const\` TO Process,
389
392
  FROM \`Static\` TO Process,
393
+ FROM \`Variable\` TO Process,
390
394
  FROM \`Property\` TO Process,
391
395
  FROM \`Record\` TO Process,
392
396
  FROM \`Delegate\` TO Process,
@@ -419,10 +423,14 @@ export const EMBEDDING_INDEX_NAME = 'code_embedding_idx';
419
423
  export const STALE_HASH_SENTINEL = '';
420
424
  export const EMBEDDING_SCHEMA = `
421
425
  CREATE NODE TABLE ${EMBEDDING_TABLE_NAME} (
426
+ id STRING,
422
427
  nodeId STRING,
428
+ chunkIndex INT32,
429
+ startLine INT64,
430
+ endLine INT64,
423
431
  embedding FLOAT[${EMBEDDING_DIMS}],
424
432
  contentHash STRING,
425
- PRIMARY KEY (nodeId)
433
+ PRIMARY KEY (id)
426
434
  )`;
427
435
  /**
428
436
  * Create vector index for semantic search
@@ -457,6 +465,7 @@ export const NODE_SCHEMA_QUERIES = [
457
465
  TYPE_ALIAS_SCHEMA,
458
466
  CONST_SCHEMA,
459
467
  STATIC_SCHEMA,
468
+ VARIABLE_SCHEMA,
460
469
  PROPERTY_SCHEMA,
461
470
  RECORD_SCHEMA,
462
471
  DELEGATE_SCHEMA,
@@ -146,16 +146,12 @@ export async function runFullAnalysis(repoPath, options, callbacks) {
146
146
  }
147
147
  else {
148
148
  progress('embeddings', 88, `Restoring ${cachedEmbeddings.length} cached embeddings...`);
149
+ const { batchInsertEmbeddings: batchInsert } = await import('./embeddings/embedding-pipeline.js');
149
150
  const EMBED_BATCH = 200;
150
151
  for (let i = 0; i < cachedEmbeddings.length; i += EMBED_BATCH) {
151
152
  const batch = cachedEmbeddings.slice(i, i + EMBED_BATCH);
152
- const paramsList = batch.map((e) => ({
153
- nodeId: e.nodeId,
154
- embedding: e.embedding,
155
- contentHash: e.contentHash ?? STALE_HASH_SENTINEL,
156
- }));
157
153
  try {
158
- await executeWithReusedStatement(`MERGE (e:${EMBEDDING_TABLE_NAME} {nodeId: $nodeId}) SET e.embedding = $embedding, e.contentHash = $contentHash`, paramsList);
154
+ await batchInsert(executeWithReusedStatement, batch);
159
155
  }
160
156
  catch {
161
157
  /* some may fail if node was removed, that's fine */
@@ -184,6 +180,9 @@ export async function runFullAnalysis(repoPath, options, callbacks) {
184
180
  existingEmbeddings.set(e.nodeId, e.contentHash ?? STALE_HASH_SENTINEL);
185
181
  }
186
182
  }
183
+ const { readServerMapping } = await import('./embeddings/server-mapping.js');
184
+ const projectName = path.basename(repoPath);
185
+ const serverName = await readServerMapping(projectName);
187
186
  await runEmbeddingPipeline(executeQuery, executeWithReusedStatement, (p) => {
188
187
  const scaled = 90 + Math.round((p.percent / 100) * 8);
189
188
  const label = p.phase === 'loading-model'
@@ -192,7 +191,7 @@ export async function runFullAnalysis(repoPath, options, callbacks) {
192
191
  : 'Loading embedding model...'
193
192
  : `Embedding ${p.nodesProcessed || 0}/${p.totalNodes || '?'}`;
194
193
  progress('embeddings', scaled, label);
195
- }, {}, existingEmbeddings);
194
+ }, {}, cachedEmbeddingNodeIds.size > 0 ? cachedEmbeddingNodeIds : undefined, { repoName: projectName, serverName }, existingEmbeddings);
196
195
  }
197
196
  // ── Phase 5: Finalize (98–100%) ───────────────────────────────────
198
197
  progress('done', 98, 'Saving metadata...');
@@ -1,5 +1,8 @@
1
1
  import Parser from 'tree-sitter';
2
2
  import { SupportedLanguages } from '../../_shared/index.js';
3
3
  export declare const isLanguageAvailable: (language: SupportedLanguages) => boolean;
4
+ export declare const resolveLanguageKey: (language: SupportedLanguages, filePath?: string) => string;
5
+ export declare const getLanguageGrammar: (language: SupportedLanguages, filePath?: string) => any;
4
6
  export declare const loadParser: () => Promise<Parser>;
5
7
  export declare const loadLanguage: (language: SupportedLanguages, filePath?: string) => Promise<void>;
8
+ export declare const createParserForLanguage: (language: SupportedLanguages, filePath?: string) => Promise<Parser>;
@@ -50,6 +50,17 @@ const languageMap = {
50
50
  ...(Swift ? { [SupportedLanguages.Swift]: Swift } : {}),
51
51
  };
52
52
  export const isLanguageAvailable = (language) => language in languageMap;
53
+ export const resolveLanguageKey = (language, filePath) => language === SupportedLanguages.TypeScript && filePath?.endsWith('.tsx')
54
+ ? `${language}:tsx`
55
+ : language;
56
+ export const getLanguageGrammar = (language, filePath) => {
57
+ const key = resolveLanguageKey(language, filePath);
58
+ const lang = languageMap[key];
59
+ if (!lang) {
60
+ throw new Error(`Unsupported language: ${language}`);
61
+ }
62
+ return lang;
63
+ };
53
64
  export const loadParser = async () => {
54
65
  if (parser)
55
66
  return parser;
@@ -59,12 +70,10 @@ export const loadParser = async () => {
59
70
  export const loadLanguage = async (language, filePath) => {
60
71
  if (!parser)
61
72
  await loadParser();
62
- const key = language === SupportedLanguages.TypeScript && filePath?.endsWith('.tsx')
63
- ? `${language}:tsx`
64
- : language;
65
- const lang = languageMap[key];
66
- if (!lang) {
67
- throw new Error(`Unsupported language: ${language}`);
68
- }
69
- parser.setLanguage(lang);
73
+ parser.setLanguage(getLanguageGrammar(language, filePath));
74
+ };
75
+ export const createParserForLanguage = async (language, filePath) => {
76
+ const freshParser = new Parser();
77
+ freshParser.setLanguage(getLanguageGrammar(language, filePath));
78
+ return freshParser;
70
79
  };
@@ -30,6 +30,11 @@ export const initEmbedder = async () => {
30
30
  initPromise = (async () => {
31
31
  try {
32
32
  env.allowLocalModels = false;
33
+ // Default cache to user-writable location. transformers.js defaults to
34
+ // ./node_modules/.cache inside its own install dir, which is unwritable
35
+ // when gitnexus is installed globally (e.g. /usr/lib/node_modules/).
36
+ // Respect HF_HOME if set, otherwise fall back to ~/.cache/huggingface.
37
+ env.cacheDir = process.env.HF_HOME ?? `${process.env.HOME}/.cache/huggingface`;
33
38
  console.error('GitNexus: Loading embedding model (first search may take a moment)...');
34
39
  // Try GPU first (DirectML on Windows, CUDA on Linux), fall back to CPU
35
40
  const isWindows = process.platform === 'win32';
@@ -16,6 +16,8 @@ export { isWriteQuery };
16
16
  import { parseDiffHunks } from '../../storage/git.js';
17
17
  import { listRegisteredRepos, cleanupOldKuzuFiles, } from '../../storage/repo-manager.js';
18
18
  import { GroupService } from '../../core/group/service.js';
19
+ import { collectBestChunks } from '../../core/embeddings/types.js';
20
+ import { EMBEDDING_TABLE_NAME, EMBEDDING_INDEX_NAME } from '../../core/lbug/schema.js';
19
21
  // AI context generation is CLI-only (gitnexus analyze)
20
22
  // import { generateAIContextFiles } from '../../cli/ai-context.js';
21
23
  /**
@@ -691,29 +693,37 @@ export class LocalBackend {
691
693
  async semanticSearch(repo, query, limit) {
692
694
  try {
693
695
  // Check if embedding table exists before loading the model (avoids heavy model init when embeddings are off)
694
- const tableCheck = await executeQuery(repo.id, `MATCH (e:CodeEmbedding) RETURN COUNT(*) AS cnt LIMIT 1`);
696
+ const tableCheck = await executeQuery(repo.id, `MATCH (e:${EMBEDDING_TABLE_NAME}) RETURN COUNT(*) AS cnt LIMIT 1`);
695
697
  if (!tableCheck.length || (tableCheck[0].cnt ?? tableCheck[0][0]) === 0)
696
698
  return [];
697
699
  const { embedQuery, getEmbeddingDims } = await import('../core/embedder.js');
698
700
  const queryVec = await embedQuery(query);
699
701
  const dims = getEmbeddingDims();
700
702
  const queryVecStr = `[${queryVec.join(',')}]`;
701
- const vectorQuery = `
702
- CALL QUERY_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx',
703
- CAST(${queryVecStr} AS FLOAT[${dims}]), ${limit})
704
- YIELD node AS emb, distance
705
- WITH emb, distance
706
- WHERE distance < 0.6
707
- RETURN emb.nodeId AS nodeId, distance
708
- ORDER BY distance
709
- `;
710
- const embResults = await executeQuery(repo.id, vectorQuery);
711
- if (embResults.length === 0)
703
+ const bestChunks = await collectBestChunks(limit, async (fetchLimit) => {
704
+ const vectorQuery = `
705
+ CALL QUERY_VECTOR_INDEX('${EMBEDDING_TABLE_NAME}', '${EMBEDDING_INDEX_NAME}',
706
+ CAST(${queryVecStr} AS FLOAT[${dims}]), ${fetchLimit})
707
+ YIELD node AS emb, distance
708
+ WITH emb, distance
709
+ WHERE distance < 0.6
710
+ RETURN emb.nodeId AS nodeId, emb.chunkIndex AS chunkIndex,
711
+ emb.startLine AS startLine, emb.endLine AS endLine, distance
712
+ ORDER BY distance
713
+ `;
714
+ const embResults = await executeQuery(repo.id, vectorQuery);
715
+ return embResults.map((row) => ({
716
+ nodeId: row.nodeId ?? row[0],
717
+ chunkIndex: row.chunkIndex ?? row[1] ?? 0,
718
+ startLine: row.startLine ?? row[2] ?? 0,
719
+ endLine: row.endLine ?? row[3] ?? 0,
720
+ distance: row.distance ?? row[4],
721
+ }));
722
+ });
723
+ if (bestChunks.size === 0)
712
724
  return [];
713
725
  const results = [];
714
- for (const embRow of embResults) {
715
- const nodeId = embRow.nodeId ?? embRow[0];
716
- const distance = embRow.distance ?? embRow[1];
726
+ for (const [nodeId, chunk] of Array.from(bestChunks.entries()).slice(0, limit)) {
717
727
  const labelEndIdx = nodeId.indexOf(':');
718
728
  const label = labelEndIdx > 0 ? nodeId.substring(0, labelEndIdx) : 'Unknown';
719
729
  // Validate label against known node types to prevent Cypher injection
@@ -722,7 +732,7 @@ export class LocalBackend {
722
732
  try {
723
733
  const nodeQuery = label === 'File'
724
734
  ? `MATCH (n:File {id: $nodeId}) RETURN n.name AS name, n.filePath AS filePath`
725
- : `MATCH (n:\`${label}\` {id: $nodeId}) RETURN n.name AS name, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine`;
735
+ : `MATCH (n:\`${label}\` {id: $nodeId}) RETURN n.name AS name, n.filePath AS filePath`;
726
736
  const nodeRows = await executeParameterized(repo.id, nodeQuery, { nodeId });
727
737
  if (nodeRows.length > 0) {
728
738
  const nodeRow = nodeRows[0];
@@ -731,9 +741,9 @@ export class LocalBackend {
731
741
  name: nodeRow.name ?? nodeRow[0] ?? '',
732
742
  type: label,
733
743
  filePath: nodeRow.filePath ?? nodeRow[1] ?? '',
734
- distance,
735
- startLine: label !== 'File' ? (nodeRow.startLine ?? nodeRow[2]) : undefined,
736
- endLine: label !== 'File' ? (nodeRow.endLine ?? nodeRow[3]) : undefined,
744
+ distance: chunk.distance,
745
+ startLine: chunk.startLine,
746
+ endLine: chunk.endLine,
737
747
  });
738
748
  }
739
749
  }
@@ -1301,6 +1301,8 @@ export const createServer = async (port, host = '127.0.0.1') => {
1301
1301
  },
1302
1302
  });
1303
1303
  }, {}, // config: use defaults
1304
+ undefined, // skipNodeIds
1305
+ undefined, // context
1304
1306
  existingEmbeddings);
1305
1307
  });
1306
1308
  clearTimeout(embedTimeout);
@@ -9,4 +9,10 @@ export interface PipelineResult {
9
9
  totalFileCount: number;
10
10
  communityResult?: CommunityDetectionResult;
11
11
  processResult?: ProcessDetectionResult;
12
+ /**
13
+ * True if the parse phase spawned a worker pool for this run. False means
14
+ * the sequential fallback handled every chunk. Primarily a test affordance
15
+ * so regression suites can prove which path executed.
16
+ */
17
+ usedWorkerPool: boolean;
12
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitnexus",
3
- "version": "1.6.2-rc.8",
3
+ "version": "1.6.2",
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",
@@ -46,28 +46,27 @@
46
46
  "test:integration": "vitest run test/integration",
47
47
  "test:watch": "vitest",
48
48
  "test:coverage": "vitest run --coverage",
49
- "preinstall": "node scripts/preinstall-cleanup.cjs",
50
- "postinstall": "node scripts/patch-tree-sitter-swift.cjs",
49
+ "postinstall": "node scripts/patch-tree-sitter-swift.cjs && node scripts/build-tree-sitter-proto.cjs",
51
50
  "prepare": "node scripts/build.js",
52
51
  "prepack": "node scripts/build.js"
53
52
  },
54
53
  "dependencies": {
55
- "@huggingface/transformers": "^3.0.0",
54
+ "@huggingface/transformers": "^4.1.0",
56
55
  "@ladybugdb/core": "^0.15.2",
57
56
  "@modelcontextprotocol/sdk": "^1.0.0",
58
57
  "@scarf/scarf": "^1.4.0",
59
58
  "cli-progress": "^3.12.0",
60
- "commander": "^12.0.0",
59
+ "commander": "^14.0.3",
61
60
  "cors": "^2.8.5",
62
61
  "express": "^4.19.2",
63
- "glob": "^11.0.0",
62
+ "glob": "^13.0.6",
64
63
  "graphology": "^0.25.4",
65
64
  "graphology-indices": "^0.17.0",
66
65
  "graphology-utils": "^2.3.0",
67
66
  "ignore": "^7.0.5",
68
67
  "js-yaml": "^4.1.1",
69
68
  "lru-cache": "^11.0.0",
70
- "mnemonist": "^0.39.0",
69
+ "mnemonist": "^0.40.3",
71
70
  "onnxruntime-node": "^1.24.0",
72
71
  "pandemonium": "^2.4.0",
73
72
  "tree-sitter": "^0.21.1",
@@ -85,6 +84,8 @@
85
84
  "uuid": "^13.0.0"
86
85
  },
87
86
  "optionalDependencies": {
87
+ "node-addon-api": "^8.0.0",
88
+ "node-gyp-build": "^4.8.0",
88
89
  "tree-sitter-dart": "git+https://github.com/UserNobody14/tree-sitter-dart.git#80e23c07b64494f7e21090bb3450223ef0b192f4",
89
90
  "tree-sitter-kotlin": "^0.3.8",
90
91
  "tree-sitter-proto": "file:./vendor/tree-sitter-proto",
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Build tree-sitter-proto native binding.
4
+ *
5
+ * Why this script exists:
6
+ * tree-sitter-proto is vendored under gitnexus/vendor/tree-sitter-proto/
7
+ * and declared as a `file:` optionalDependency. Previously, the vendored
8
+ * package had its own `dependencies` and `install` script, which caused
9
+ * npm to create `vendor/tree-sitter-proto/node_modules/` and
10
+ * `vendor/tree-sitter-proto/build/` during install. Those directories
11
+ * blocked `rmdir` on global-install upgrade, producing:
12
+ *
13
+ * ENOTEMPTY: directory not empty, rmdir
14
+ * '.../gitnexus/vendor/tree-sitter-proto/node_modules/node-addon-api'
15
+ *
16
+ * (See https://github.com/abhigyanpatwari/GitNexus/issues/836.)
17
+ *
18
+ * We stripped `dependencies` and the `install` script from the vendored
19
+ * package.json, hoisted `node-addon-api` and `node-gyp-build` into
20
+ * gitnexus's own optionalDependencies, and moved native compilation here.
21
+ *
22
+ * What this does:
23
+ * Runs `npx node-gyp rebuild` inside `node_modules/tree-sitter-proto/`
24
+ * (which npm creates as a copy of vendor/tree-sitter-proto/ when
25
+ * resolving the file: dep). Build output lands in
26
+ * `node_modules/tree-sitter-proto/build/Release/tree_sitter_proto_binding.node`
27
+ * — under npm-managed territory, safe on upgrade.
28
+ *
29
+ * Mirrors scripts/patch-tree-sitter-swift.cjs. Best-effort: if any
30
+ * precondition fails (optional dep absent, no toolchain, --ignore-scripts),
31
+ * warn and exit 0 so gitnexus install still succeeds.
32
+ */
33
+ const fs = require('fs');
34
+ const path = require('path');
35
+ const { execSync } = require('child_process');
36
+
37
+ const protoDir = path.join(__dirname, '..', 'node_modules', 'tree-sitter-proto');
38
+ const bindingGyp = path.join(protoDir, 'binding.gyp');
39
+ const bindingNode = path.join(protoDir, 'build', 'Release', 'tree_sitter_proto_binding.node');
40
+
41
+ try {
42
+ if (!fs.existsSync(bindingGyp)) {
43
+ // tree-sitter-proto is an optionalDependency; absent when install
44
+ // skipped optional deps or the file: dep was not resolved.
45
+ process.exit(0);
46
+ }
47
+
48
+ // Skip if the native binding already exists (idempotent re-run).
49
+ if (fs.existsSync(bindingNode)) {
50
+ process.exit(0);
51
+ }
52
+
53
+ // Pre-flight: the hoisted build deps must be resolvable.
54
+ try {
55
+ require.resolve('node-addon-api');
56
+ require.resolve('node-gyp-build');
57
+ } catch (resolveErr) {
58
+ console.warn(
59
+ '[tree-sitter-proto] Skipping build: hoisted build deps not resolvable (%s).',
60
+ resolveErr.message,
61
+ );
62
+ console.warn(
63
+ '[tree-sitter-proto] Proto parsing will be unavailable. Install without --no-optional and with scripts enabled to build.',
64
+ );
65
+ process.exit(0);
66
+ }
67
+
68
+ console.log('[tree-sitter-proto] Building native binding...');
69
+ execSync('npx node-gyp rebuild', {
70
+ cwd: protoDir,
71
+ stdio: 'pipe',
72
+ timeout: 180000,
73
+ });
74
+ console.log('[tree-sitter-proto] Native binding built successfully');
75
+ } catch (err) {
76
+ console.warn('[tree-sitter-proto] Could not build native binding:', err.message);
77
+ console.warn(
78
+ '[tree-sitter-proto] Proto (.proto) parsing will be unavailable. Non-proto gitnexus functionality is unaffected.',
79
+ );
80
+ // Exit 0: optionalDependency failures must not fail the gitnexus install.
81
+ process.exit(0);
82
+ }
@@ -0,0 +1,6 @@
1
+ # This file is generated by gyp; do not edit.
2
+
3
+ export builddir_name ?= ./build/../../node_modules/node-addon-api/.
4
+ .PHONY: all
5
+ all:
6
+ $(MAKE) -C ../../tree-sitter-proto/build node_addon_api_except