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.
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +1 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/mro-strategy.d.ts +38 -16
- package/dist/_shared/mro-strategy.d.ts.map +1 -1
- package/dist/cli/ai-context.js +0 -58
- package/dist/cli/analyze.js +3 -0
- package/dist/core/embeddings/ast-utils.d.ts +22 -0
- package/dist/core/embeddings/ast-utils.js +105 -0
- package/dist/core/embeddings/character-chunk.d.ts +12 -0
- package/dist/core/embeddings/character-chunk.js +43 -0
- package/dist/core/embeddings/chunker.d.ts +14 -0
- package/dist/core/embeddings/chunker.js +234 -0
- package/dist/core/embeddings/embedder.js +5 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +20 -24
- package/dist/core/embeddings/embedding-pipeline.js +176 -107
- package/dist/core/embeddings/line-index.d.ts +7 -0
- package/dist/core/embeddings/line-index.js +42 -0
- package/dist/core/embeddings/server-mapping.d.ts +15 -0
- package/dist/core/embeddings/server-mapping.js +33 -0
- package/dist/core/embeddings/structural-extractor.d.ts +15 -0
- package/dist/core/embeddings/structural-extractor.js +58 -0
- package/dist/core/embeddings/text-generator.d.ts +20 -13
- package/dist/core/embeddings/text-generator.js +151 -119
- package/dist/core/embeddings/types.d.ts +81 -3
- package/dist/core/embeddings/types.js +105 -3
- package/dist/core/group/extractors/http-patterns/node.js +130 -0
- package/dist/core/ingestion/call-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/ingestion/call-extractors/configs/c-cpp.js +8 -0
- package/dist/core/ingestion/call-extractors/configs/csharp.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/csharp.js +6 -0
- package/dist/core/ingestion/call-extractors/configs/dart.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/dart.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/go.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/go.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/jvm.d.ts +3 -0
- package/dist/core/ingestion/call-extractors/configs/jvm.js +51 -0
- package/dist/core/ingestion/call-extractors/configs/php.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/php.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/python.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/python.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/ruby.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/ruby.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/rust.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/rust.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/swift.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/swift.js +5 -0
- package/dist/core/ingestion/call-extractors/configs/typescript-javascript.d.ts +3 -0
- package/dist/core/ingestion/call-extractors/configs/typescript-javascript.js +8 -0
- package/dist/core/ingestion/call-extractors/generic.d.ts +5 -0
- package/dist/core/ingestion/call-extractors/generic.js +59 -0
- package/dist/core/ingestion/call-processor.d.ts +2 -4
- package/dist/core/ingestion/call-processor.js +221 -89
- package/dist/core/ingestion/call-routing.d.ts +8 -12
- package/dist/core/ingestion/call-routing.js +13 -34
- package/dist/core/ingestion/call-types.d.ts +135 -0
- package/dist/core/ingestion/call-types.js +2 -0
- package/dist/core/ingestion/class-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/ingestion/class-extractors/configs/c-cpp.js +11 -0
- package/dist/core/ingestion/class-extractors/configs/csharp.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/csharp.js +21 -0
- package/dist/core/ingestion/class-extractors/configs/dart.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/dart.js +7 -0
- package/dist/core/ingestion/class-extractors/configs/go.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/go.js +20 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.d.ts +3 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +35 -0
- package/dist/core/ingestion/class-extractors/configs/php.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/php.js +7 -0
- package/dist/core/ingestion/class-extractors/configs/python.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/python.js +7 -0
- package/dist/core/ingestion/class-extractors/configs/ruby.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/ruby.js +7 -0
- package/dist/core/ingestion/class-extractors/configs/rust.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/rust.js +7 -0
- package/dist/core/ingestion/class-extractors/configs/swift.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/swift.js +18 -0
- package/dist/core/ingestion/class-extractors/configs/typescript-javascript.d.ts +4 -0
- package/dist/core/ingestion/class-extractors/configs/typescript-javascript.js +28 -0
- package/dist/core/ingestion/field-types.d.ts +1 -1
- package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +13 -0
- package/dist/core/ingestion/heritage-extractors/configs/go.js +20 -0
- package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +18 -0
- package/dist/core/ingestion/heritage-extractors/configs/ruby.js +65 -0
- package/dist/core/ingestion/heritage-extractors/generic.d.ts +23 -0
- package/dist/core/ingestion/heritage-extractors/generic.js +47 -0
- package/dist/core/ingestion/heritage-processor.d.ts +9 -0
- package/dist/core/ingestion/heritage-processor.js +120 -85
- package/dist/core/ingestion/heritage-types.d.ts +73 -0
- package/dist/core/ingestion/heritage-types.js +2 -0
- package/dist/core/ingestion/import-resolvers/configs/c-cpp.d.ts +7 -0
- package/dist/core/ingestion/import-resolvers/configs/c-cpp.js +14 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +27 -0
- package/dist/core/ingestion/import-resolvers/configs/dart.d.ts +17 -0
- package/dist/core/ingestion/import-resolvers/{dart.js → configs/dart.js} +26 -16
- package/dist/core/ingestion/import-resolvers/configs/go.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/configs/go.js +26 -0
- package/dist/core/ingestion/import-resolvers/configs/jvm.d.ts +13 -0
- package/dist/core/ingestion/import-resolvers/configs/jvm.js +68 -0
- package/dist/core/ingestion/import-resolvers/configs/php.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/configs/php.js +15 -0
- package/dist/core/ingestion/import-resolvers/configs/python.d.ts +12 -0
- package/dist/core/ingestion/import-resolvers/configs/python.js +41 -0
- package/dist/core/ingestion/import-resolvers/configs/ruby.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/configs/ruby.js +16 -0
- package/dist/core/ingestion/import-resolvers/configs/rust.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/configs/rust.js +54 -0
- package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +8 -0
- package/dist/core/ingestion/import-resolvers/{swift.js → configs/swift.js} +10 -5
- package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.d.ts +9 -0
- package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.js +23 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +4 -5
- package/dist/core/ingestion/import-resolvers/csharp.js +4 -20
- package/dist/core/ingestion/import-resolvers/go.d.ts +4 -5
- package/dist/core/ingestion/import-resolvers/go.js +4 -19
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +5 -10
- package/dist/core/ingestion/import-resolvers/jvm.js +5 -58
- package/dist/core/ingestion/import-resolvers/php.d.ts +4 -5
- package/dist/core/ingestion/import-resolvers/php.js +4 -7
- package/dist/core/ingestion/import-resolvers/python.d.ts +3 -6
- package/dist/core/ingestion/import-resolvers/python.js +3 -18
- package/dist/core/ingestion/import-resolvers/resolver-factory.d.ts +24 -0
- package/dist/core/ingestion/import-resolvers/resolver-factory.js +33 -0
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +4 -5
- package/dist/core/ingestion/import-resolvers/ruby.js +4 -7
- package/dist/core/ingestion/import-resolvers/rust.d.ts +4 -5
- package/dist/core/ingestion/import-resolvers/rust.js +4 -47
- package/dist/core/ingestion/import-resolvers/standard.d.ts +3 -9
- package/dist/core/ingestion/import-resolvers/standard.js +7 -8
- package/dist/core/ingestion/import-resolvers/types.d.ts +24 -0
- package/dist/core/ingestion/language-provider.d.ts +80 -0
- package/dist/core/ingestion/languages/c-cpp.js +18 -12
- package/dist/core/ingestion/languages/csharp.js +13 -21
- package/dist/core/ingestion/languages/dart.js +13 -7
- package/dist/core/ingestion/languages/go.js +14 -20
- package/dist/core/ingestion/languages/java.js +13 -18
- package/dist/core/ingestion/languages/kotlin.js +13 -13
- package/dist/core/ingestion/languages/php.js +13 -7
- package/dist/core/ingestion/languages/python.js +13 -7
- package/dist/core/ingestion/languages/ruby.js +103 -22
- package/dist/core/ingestion/languages/rust.js +13 -7
- package/dist/core/ingestion/languages/swift.js +13 -18
- package/dist/core/ingestion/languages/typescript.js +18 -23
- package/dist/core/ingestion/languages/vue.js +13 -17
- package/dist/core/ingestion/model/heritage-map.d.ts +35 -0
- package/dist/core/ingestion/model/heritage-map.js +110 -9
- package/dist/core/ingestion/model/index.d.ts +2 -2
- package/dist/core/ingestion/model/index.js +1 -1
- package/dist/core/ingestion/model/resolve.d.ts +33 -28
- package/dist/core/ingestion/model/resolve.js +111 -27
- package/dist/core/ingestion/parsing-processor.d.ts +1 -2
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +9 -3
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +11 -0
- package/dist/core/ingestion/pipeline.js +9 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +81 -0
- package/dist/core/ingestion/type-env.d.ts +1 -1
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -1
- package/dist/core/ingestion/utils/ast-helpers.js +22 -2
- package/dist/core/ingestion/utils/ruby-self-call.d.ts +52 -0
- package/dist/core/ingestion/utils/ruby-self-call.js +59 -0
- package/dist/core/ingestion/variable-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +81 -0
- package/dist/core/ingestion/variable-extractors/configs/csharp.d.ts +9 -0
- package/dist/core/ingestion/variable-extractors/configs/csharp.js +63 -0
- package/dist/core/ingestion/variable-extractors/configs/dart.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/dart.js +94 -0
- package/dist/core/ingestion/variable-extractors/configs/go.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/go.js +83 -0
- package/dist/core/ingestion/variable-extractors/configs/jvm.d.ts +18 -0
- package/dist/core/ingestion/variable-extractors/configs/jvm.js +115 -0
- package/dist/core/ingestion/variable-extractors/configs/php.d.ts +14 -0
- package/dist/core/ingestion/variable-extractors/configs/php.js +58 -0
- package/dist/core/ingestion/variable-extractors/configs/python.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/python.js +101 -0
- package/dist/core/ingestion/variable-extractors/configs/ruby.d.ts +11 -0
- package/dist/core/ingestion/variable-extractors/configs/ruby.js +52 -0
- package/dist/core/ingestion/variable-extractors/configs/rust.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/rust.js +76 -0
- package/dist/core/ingestion/variable-extractors/configs/swift.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/swift.js +88 -0
- package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.d.ts +3 -0
- package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.js +83 -0
- package/dist/core/ingestion/variable-extractors/generic.d.ts +5 -0
- package/dist/core/ingestion/variable-extractors/generic.js +80 -0
- package/dist/core/ingestion/variable-types.d.ts +82 -0
- package/dist/core/ingestion/variable-types.js +2 -0
- package/dist/core/ingestion/workers/parse-worker.js +244 -217
- package/dist/core/ingestion/workers/worker-pool.js +3 -0
- package/dist/core/lbug/csv-generator.js +1 -0
- package/dist/core/lbug/lbug-adapter.d.ts +4 -5
- package/dist/core/lbug/lbug-adapter.js +38 -14
- package/dist/core/lbug/schema.d.ts +2 -1
- package/dist/core/lbug/schema.js +10 -1
- package/dist/core/run-analyze.js +6 -7
- package/dist/core/tree-sitter/parser-loader.d.ts +3 -0
- package/dist/core/tree-sitter/parser-loader.js +17 -8
- package/dist/mcp/core/embedder.js +5 -0
- package/dist/mcp/local/local-backend.js +29 -19
- package/dist/server/api.js +2 -0
- package/dist/types/pipeline.d.ts +6 -0
- package/package.json +8 -7
- package/scripts/build-tree-sitter-proto.cjs +82 -0
- package/vendor/node_modules/node-addon-api/node_addon_api.Makefile +6 -0
- package/vendor/node_modules/node-addon-api/node_addon_api.target.mk +104 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_except.target.mk +108 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_except_all.target.mk +104 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_maybe.target.mk +104 -0
- package/vendor/tree-sitter-proto/package.json +1 -7
- package/dist/core/ingestion/call-sites/extract-language-call-site.d.ts +0 -10
- package/dist/core/ingestion/call-sites/extract-language-call-site.js +0 -22
- package/dist/core/ingestion/call-sites/java.d.ts +0 -9
- package/dist/core/ingestion/call-sites/java.js +0 -30
- package/dist/core/ingestion/import-resolvers/dart.d.ts +0 -7
- package/dist/core/ingestion/import-resolvers/swift.d.ts +0 -7
- package/dist/core/ingestion/import-resolvers/vue.d.ts +0 -8
- package/dist/core/ingestion/import-resolvers/vue.js +0 -9
- 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
|
-
//
|
|
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
|
-
//
|
|
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[
|
|
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[
|
|
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
|
|
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
|
-
|
|
862
|
-
|
|
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
|
-
//
|
|
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);
|
|
903
|
+
map.set(nodeId, STALE_HASH_SENTINEL);
|
|
880
904
|
}
|
|
881
|
-
console.log(`[embed] ${map.size} nodes in legacy DB (
|
|
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";
|
package/dist/core/lbug/schema.js
CHANGED
|
@@ -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 (
|
|
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,
|
package/dist/core/run-analyze.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
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
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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
|
|
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
|
|
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:
|
|
736
|
-
endLine:
|
|
744
|
+
distance: chunk.distance,
|
|
745
|
+
startLine: chunk.startLine,
|
|
746
|
+
endLine: chunk.endLine,
|
|
737
747
|
});
|
|
738
748
|
}
|
|
739
749
|
}
|
package/dist/server/api.js
CHANGED
|
@@ -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);
|
package/dist/types/pipeline.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
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": "^
|
|
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": "^
|
|
59
|
+
"commander": "^14.0.3",
|
|
61
60
|
"cors": "^2.8.5",
|
|
62
61
|
"express": "^4.19.2",
|
|
63
|
-
"glob": "^
|
|
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.
|
|
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
|
+
}
|