@massa-ai/tools-api 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +120 -120
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -114859,122 +114859,6 @@ var init_search_diagnostics = __esm(() => {
|
|
|
114859
114859
|
};
|
|
114860
114860
|
});
|
|
114861
114861
|
|
|
114862
|
-
// ../../packages/core/dist/services/search/rlm-fusion.js
|
|
114863
|
-
function fuseResultsImpl(rlm, resultSets, query, explainScores = false) {
|
|
114864
|
-
const scoreMap = new Map;
|
|
114865
|
-
const hasCodePattern = (text2) => {
|
|
114866
|
-
const codePatterns = [
|
|
114867
|
-
/\w+\(\)/,
|
|
114868
|
-
/\bfunction\b/i,
|
|
114869
|
-
/\bclass\b/i,
|
|
114870
|
-
/\binterface\b/i,
|
|
114871
|
-
/\benum\b/i,
|
|
114872
|
-
/\btype\b/i,
|
|
114873
|
-
/\bconst\b/i,
|
|
114874
|
-
/\bimport\b/i,
|
|
114875
|
-
/\bexport\b/i
|
|
114876
|
-
];
|
|
114877
|
-
return codePatterns.some((pattern) => pattern.test(text2));
|
|
114878
|
-
};
|
|
114879
|
-
const isCodeQuery = hasCodePattern(query);
|
|
114880
|
-
const codeKeywordBoostRaw = Number(process.env.RRF_KEYWORD_BOOST ?? "2.5");
|
|
114881
|
-
const codeKeywordBoost = Number.isFinite(codeKeywordBoostRaw) && codeKeywordBoostRaw > 0 ? codeKeywordBoostRaw : 2.5;
|
|
114882
|
-
const KEYWORD_BOOST = isCodeQuery ? codeKeywordBoost : 1;
|
|
114883
|
-
logger.debug("RRF fusion parameters", {
|
|
114884
|
-
query,
|
|
114885
|
-
isCodeQuery,
|
|
114886
|
-
keywordBoost: KEYWORD_BOOST,
|
|
114887
|
-
vectorResults: resultSets[0]?.length || 0,
|
|
114888
|
-
keywordResults: resultSets[1]?.length || 0
|
|
114889
|
-
});
|
|
114890
|
-
for (let i = 0;i < resultSets.length; i++) {
|
|
114891
|
-
const results = resultSets[i];
|
|
114892
|
-
const isVector = i === 0;
|
|
114893
|
-
const isMemoryStream = results.some((r2) => r2.source === "memory" || r2.metadata?.context?.graphNeighbor === true);
|
|
114894
|
-
const boost = isVector ? 1 : isMemoryStream ? 1 : KEYWORD_BOOST;
|
|
114895
|
-
results.forEach((result, rank) => {
|
|
114896
|
-
const rrfScore = 1 / (rlm.RRF_K + rank + 1) * boost;
|
|
114897
|
-
if (scoreMap.has(result.id)) {
|
|
114898
|
-
const existing = scoreMap.get(result.id);
|
|
114899
|
-
if (isVector) {
|
|
114900
|
-
existing.vectorRrfScore += rrfScore;
|
|
114901
|
-
existing.vectorRank = rank;
|
|
114902
|
-
existing.vectorScore = result.score;
|
|
114903
|
-
} else if (isMemoryStream) {
|
|
114904
|
-
existing.memoryRrfScore += rrfScore;
|
|
114905
|
-
} else {
|
|
114906
|
-
existing.lexicalRrfScore = Math.max(existing.lexicalRrfScore, rrfScore);
|
|
114907
|
-
if (existing.keywordRank === undefined || rank < existing.keywordRank) {
|
|
114908
|
-
existing.keywordRank = rank;
|
|
114909
|
-
existing.keywordScore = result.score;
|
|
114910
|
-
}
|
|
114911
|
-
}
|
|
114912
|
-
existing.rrfScore = existing.vectorRrfScore + existing.lexicalRrfScore + existing.memoryRrfScore;
|
|
114913
|
-
} else {
|
|
114914
|
-
const vectorRrfScore = isVector ? rrfScore : 0;
|
|
114915
|
-
const lexicalRrfScore = !isVector && !isMemoryStream ? rrfScore : 0;
|
|
114916
|
-
const memoryRrfScore = isMemoryStream ? rrfScore : 0;
|
|
114917
|
-
scoreMap.set(result.id, {
|
|
114918
|
-
result: { ...result },
|
|
114919
|
-
rrfScore: vectorRrfScore + lexicalRrfScore + memoryRrfScore,
|
|
114920
|
-
vectorRrfScore,
|
|
114921
|
-
lexicalRrfScore,
|
|
114922
|
-
memoryRrfScore,
|
|
114923
|
-
vectorRank: isVector ? rank : undefined,
|
|
114924
|
-
keywordRank: !isVector && !isMemoryStream ? rank : undefined,
|
|
114925
|
-
vectorScore: isVector ? result.score : undefined,
|
|
114926
|
-
keywordScore: !isVector && !isMemoryStream ? result.score : undefined
|
|
114927
|
-
});
|
|
114928
|
-
}
|
|
114929
|
-
});
|
|
114930
|
-
}
|
|
114931
|
-
const sorted = Array.from(scoreMap.values()).sort((a12, b) => b.rrfScore - a12.rrfScore);
|
|
114932
|
-
const maxRrfScore = sorted[0]?.rrfScore || 1;
|
|
114933
|
-
const vectorWeightRaw = Number(process.env.RRF_VECTOR_WEIGHT ?? "0.3");
|
|
114934
|
-
const vectorWeight = Number.isFinite(vectorWeightRaw) ? Math.min(1, Math.max(0, vectorWeightRaw)) : 0.3;
|
|
114935
|
-
return sorted.map(({ result, rrfScore, vectorRank, keywordRank, vectorScore, keywordScore, vectorRrfScore, lexicalRrfScore, memoryRrfScore }, index) => {
|
|
114936
|
-
const rrfNormalized = rrfScore / maxRrfScore;
|
|
114937
|
-
const vectorSimilarity = vectorScore || 0;
|
|
114938
|
-
const combinedScore = rrfNormalized * (1 - vectorWeight) + vectorSimilarity * vectorWeight;
|
|
114939
|
-
const centralityScore = typeof result.metadata?.centralityScore === "number" ? result.metadata.centralityScore : 0;
|
|
114940
|
-
const normalizedScore = Math.min(1, combinedScore * (1 + 0.2 * centralityScore));
|
|
114941
|
-
const memoryOnly = memoryRrfScore > 0 && vectorRrfScore === 0 && lexicalRrfScore === 0;
|
|
114942
|
-
const explanation = explainScores ? generateScoreExplanationImpl(normalizedScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, index) : undefined;
|
|
114943
|
-
return {
|
|
114944
|
-
...result,
|
|
114945
|
-
score: normalizedScore,
|
|
114946
|
-
explanation,
|
|
114947
|
-
metadata: {
|
|
114948
|
-
...result.metadata,
|
|
114949
|
-
_rrfRawVectorScore: vectorScore ?? (memoryOnly ? 0 : undefined)
|
|
114950
|
-
}
|
|
114951
|
-
};
|
|
114952
|
-
});
|
|
114953
|
-
}
|
|
114954
|
-
function generateScoreExplanationImpl(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank) {
|
|
114955
|
-
const parts = [];
|
|
114956
|
-
if (vectorScore != null && vectorRank != null) {
|
|
114957
|
-
parts.push(`Vector: ${(vectorScore * 100).toFixed(1)}% (rank #${vectorRank + 1})`);
|
|
114958
|
-
}
|
|
114959
|
-
if (keywordScore != null && keywordRank != null) {
|
|
114960
|
-
parts.push(`Keyword: ${(keywordScore * 100).toFixed(1)}% (rank #${keywordRank + 1})`);
|
|
114961
|
-
}
|
|
114962
|
-
const breakdown = parts.join(" + ") + ` \u2192 RRF: ${rrfScore.toFixed(4)} \u2192 Final: ${(finalScore * 100).toFixed(1)}%`;
|
|
114963
|
-
return {
|
|
114964
|
-
finalScore,
|
|
114965
|
-
vectorScore: vectorScore ?? undefined,
|
|
114966
|
-
keywordScore: keywordScore ?? undefined,
|
|
114967
|
-
rrfScore,
|
|
114968
|
-
vectorRank: vectorRank != null ? vectorRank + 1 : undefined,
|
|
114969
|
-
keywordRank: keywordRank != null ? keywordRank + 1 : undefined,
|
|
114970
|
-
combinedRank: combinedRank != null ? combinedRank + 1 : undefined,
|
|
114971
|
-
breakdown
|
|
114972
|
-
};
|
|
114973
|
-
}
|
|
114974
|
-
var init_rlm_fusion = __esm(() => {
|
|
114975
|
-
init_dist();
|
|
114976
|
-
});
|
|
114977
|
-
|
|
114978
114862
|
// ../../packages/core/dist/services/search/rlm-search.js
|
|
114979
114863
|
async function searchImpl(rlm, query, projectId, options = {}) {
|
|
114980
114864
|
try {
|
|
@@ -115359,7 +115243,123 @@ var init_rlm_search = __esm(() => {
|
|
|
115359
115243
|
init_lexical_search();
|
|
115360
115244
|
init_event_bus();
|
|
115361
115245
|
init_search_diagnostics();
|
|
115362
|
-
|
|
115246
|
+
});
|
|
115247
|
+
|
|
115248
|
+
// ../../packages/core/dist/services/search/result-fusion.js
|
|
115249
|
+
function fuseResults(resultSets, query, explainScores = false) {
|
|
115250
|
+
const scoreMap = new Map;
|
|
115251
|
+
const hasCodePattern = (text2) => {
|
|
115252
|
+
const codePatterns = [
|
|
115253
|
+
/\w+\(\)/,
|
|
115254
|
+
/\bfunction\b/i,
|
|
115255
|
+
/\bclass\b/i,
|
|
115256
|
+
/\binterface\b/i,
|
|
115257
|
+
/\benum\b/i,
|
|
115258
|
+
/\btype\b/i,
|
|
115259
|
+
/\bconst\b/i,
|
|
115260
|
+
/\bimport\b/i,
|
|
115261
|
+
/\bexport\b/i
|
|
115262
|
+
];
|
|
115263
|
+
return codePatterns.some((pattern) => pattern.test(text2));
|
|
115264
|
+
};
|
|
115265
|
+
const isCodeQuery = hasCodePattern(query);
|
|
115266
|
+
const codeKeywordBoostRaw = Number(process.env.RRF_KEYWORD_BOOST ?? "2.5");
|
|
115267
|
+
const codeKeywordBoost = Number.isFinite(codeKeywordBoostRaw) && codeKeywordBoostRaw > 0 ? codeKeywordBoostRaw : 2.5;
|
|
115268
|
+
const KEYWORD_BOOST = isCodeQuery ? codeKeywordBoost : 1;
|
|
115269
|
+
logger.debug("RRF fusion parameters", {
|
|
115270
|
+
query,
|
|
115271
|
+
isCodeQuery,
|
|
115272
|
+
keywordBoost: KEYWORD_BOOST,
|
|
115273
|
+
vectorResults: resultSets[0]?.length || 0,
|
|
115274
|
+
keywordResults: resultSets[1]?.length || 0
|
|
115275
|
+
});
|
|
115276
|
+
for (let i = 0;i < resultSets.length; i++) {
|
|
115277
|
+
const results = resultSets[i];
|
|
115278
|
+
const isVector = i === 0;
|
|
115279
|
+
const isMemoryStream = results.some((r2) => r2.source === "memory" || r2.metadata?.context?.graphNeighbor === true);
|
|
115280
|
+
const boost = isVector ? 1 : isMemoryStream ? 1 : KEYWORD_BOOST;
|
|
115281
|
+
results.forEach((result, rank) => {
|
|
115282
|
+
const rrfScore = 1 / (RRF_K + rank + 1) * boost;
|
|
115283
|
+
if (scoreMap.has(result.id)) {
|
|
115284
|
+
const existing = scoreMap.get(result.id);
|
|
115285
|
+
if (isVector) {
|
|
115286
|
+
existing.vectorRrfScore += rrfScore;
|
|
115287
|
+
existing.vectorRank = rank;
|
|
115288
|
+
existing.vectorScore = result.score;
|
|
115289
|
+
} else if (isMemoryStream) {
|
|
115290
|
+
existing.memoryRrfScore += rrfScore;
|
|
115291
|
+
} else {
|
|
115292
|
+
existing.lexicalRrfScore = Math.max(existing.lexicalRrfScore, rrfScore);
|
|
115293
|
+
if (existing.keywordRank === undefined || rank < existing.keywordRank) {
|
|
115294
|
+
existing.keywordRank = rank;
|
|
115295
|
+
existing.keywordScore = result.score;
|
|
115296
|
+
}
|
|
115297
|
+
}
|
|
115298
|
+
existing.rrfScore = existing.vectorRrfScore + existing.lexicalRrfScore + existing.memoryRrfScore;
|
|
115299
|
+
} else {
|
|
115300
|
+
const vectorRrfScore = isVector ? rrfScore : 0;
|
|
115301
|
+
const lexicalRrfScore = !isVector && !isMemoryStream ? rrfScore : 0;
|
|
115302
|
+
const memoryRrfScore = isMemoryStream ? rrfScore : 0;
|
|
115303
|
+
scoreMap.set(result.id, {
|
|
115304
|
+
result: { ...result },
|
|
115305
|
+
rrfScore: vectorRrfScore + lexicalRrfScore + memoryRrfScore,
|
|
115306
|
+
vectorRrfScore,
|
|
115307
|
+
lexicalRrfScore,
|
|
115308
|
+
memoryRrfScore,
|
|
115309
|
+
vectorRank: isVector ? rank : undefined,
|
|
115310
|
+
keywordRank: !isVector && !isMemoryStream ? rank : undefined,
|
|
115311
|
+
vectorScore: isVector ? result.score : undefined,
|
|
115312
|
+
keywordScore: !isVector && !isMemoryStream ? result.score : undefined
|
|
115313
|
+
});
|
|
115314
|
+
}
|
|
115315
|
+
});
|
|
115316
|
+
}
|
|
115317
|
+
const sorted = Array.from(scoreMap.values()).sort((a12, b) => b.rrfScore - a12.rrfScore);
|
|
115318
|
+
const maxRrfScore = sorted[0]?.rrfScore || 1;
|
|
115319
|
+
const vectorWeightRaw = Number(process.env.RRF_VECTOR_WEIGHT ?? "0.3");
|
|
115320
|
+
const vectorWeight = Number.isFinite(vectorWeightRaw) ? Math.min(1, Math.max(0, vectorWeightRaw)) : 0.3;
|
|
115321
|
+
return sorted.map(({ result, rrfScore, vectorRank, keywordRank, vectorScore, keywordScore, vectorRrfScore, lexicalRrfScore, memoryRrfScore }, index) => {
|
|
115322
|
+
const rrfNormalized = rrfScore / maxRrfScore;
|
|
115323
|
+
const vectorSimilarity = vectorScore || 0;
|
|
115324
|
+
const combinedScore = rrfNormalized * (1 - vectorWeight) + vectorSimilarity * vectorWeight;
|
|
115325
|
+
const centralityScore = typeof result.metadata?.centralityScore === "number" ? result.metadata.centralityScore : 0;
|
|
115326
|
+
const normalizedScore = Math.min(1, combinedScore * (1 + 0.2 * centralityScore));
|
|
115327
|
+
const memoryOnly = memoryRrfScore > 0 && vectorRrfScore === 0 && lexicalRrfScore === 0;
|
|
115328
|
+
const explanation = explainScores ? generateScoreExplanation(normalizedScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, index) : undefined;
|
|
115329
|
+
return {
|
|
115330
|
+
...result,
|
|
115331
|
+
score: normalizedScore,
|
|
115332
|
+
explanation,
|
|
115333
|
+
metadata: {
|
|
115334
|
+
...result.metadata,
|
|
115335
|
+
_rrfRawVectorScore: vectorScore ?? (memoryOnly ? 0 : undefined)
|
|
115336
|
+
}
|
|
115337
|
+
};
|
|
115338
|
+
});
|
|
115339
|
+
}
|
|
115340
|
+
function generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank) {
|
|
115341
|
+
const parts = [];
|
|
115342
|
+
if (vectorScore != null && vectorRank != null) {
|
|
115343
|
+
parts.push(`Vector: ${(vectorScore * 100).toFixed(1)}% (rank #${vectorRank + 1})`);
|
|
115344
|
+
}
|
|
115345
|
+
if (keywordScore != null && keywordRank != null) {
|
|
115346
|
+
parts.push(`Keyword: ${(keywordScore * 100).toFixed(1)}% (rank #${keywordRank + 1})`);
|
|
115347
|
+
}
|
|
115348
|
+
const breakdown = parts.join(" + ") + ` \u2192 RRF: ${rrfScore.toFixed(4)} \u2192 Final: ${(finalScore * 100).toFixed(1)}%`;
|
|
115349
|
+
return {
|
|
115350
|
+
finalScore,
|
|
115351
|
+
vectorScore: vectorScore ?? undefined,
|
|
115352
|
+
keywordScore: keywordScore ?? undefined,
|
|
115353
|
+
rrfScore,
|
|
115354
|
+
vectorRank: vectorRank != null ? vectorRank + 1 : undefined,
|
|
115355
|
+
keywordRank: keywordRank != null ? keywordRank + 1 : undefined,
|
|
115356
|
+
combinedRank: combinedRank != null ? combinedRank + 1 : undefined,
|
|
115357
|
+
breakdown
|
|
115358
|
+
};
|
|
115359
|
+
}
|
|
115360
|
+
var RRF_K = 60;
|
|
115361
|
+
var init_result_fusion = __esm(() => {
|
|
115362
|
+
init_dist();
|
|
115363
115363
|
});
|
|
115364
115364
|
|
|
115365
115365
|
// ../../packages/core/dist/services/search/rlm-admin.js
|
|
@@ -115451,6 +115451,7 @@ var init_contextual_search_rlm = __esm(() => {
|
|
|
115451
115451
|
init_rlm_indexing();
|
|
115452
115452
|
init_rlm_synapse();
|
|
115453
115453
|
init_rlm_search();
|
|
115454
|
+
init_result_fusion();
|
|
115454
115455
|
init_rlm_admin();
|
|
115455
115456
|
ContextualSearchRLM = class ContextualSearchRLM {
|
|
115456
115457
|
keywordSearch;
|
|
@@ -115461,7 +115462,6 @@ var init_contextual_search_rlm = __esm(() => {
|
|
|
115461
115462
|
symbolRepo;
|
|
115462
115463
|
fileFilterCache;
|
|
115463
115464
|
queryUnderstanding;
|
|
115464
|
-
RRF_K = 60;
|
|
115465
115465
|
initialized = false;
|
|
115466
115466
|
static indexingLocks = new Map;
|
|
115467
115467
|
injectedDeps;
|
|
@@ -115505,10 +115505,10 @@ var init_contextual_search_rlm = __esm(() => {
|
|
|
115505
115505
|
return buildGraphStreamImpl(this, resultSets, maxResults, projectId, reportDegradation);
|
|
115506
115506
|
}
|
|
115507
115507
|
fuseResults(resultSets, query, explainScores = false) {
|
|
115508
|
-
return
|
|
115508
|
+
return fuseResults(resultSets, query, explainScores);
|
|
115509
115509
|
}
|
|
115510
115510
|
generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank) {
|
|
115511
|
-
return
|
|
115511
|
+
return generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank);
|
|
115512
115512
|
}
|
|
115513
115513
|
async addContextToResults(results, _projectId) {
|
|
115514
115514
|
return addContextToResultsImpl(this, results, _projectId);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@massa-ai/tools-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"author": "luizgmassa",
|
|
5
5
|
"description": "massa-ai REST API server - Semantic code search, memory, and context compression",
|
|
6
6
|
"type": "module",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"test": "bun scripts/run-tests-isolated.ts"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@massa-ai/core": "^1.
|
|
25
|
-
"@massa-ai/shared": "^1.
|
|
24
|
+
"@massa-ai/core": "^1.12.0",
|
|
25
|
+
"@massa-ai/shared": "^1.12.0",
|
|
26
26
|
"elysia": "^1.2.25",
|
|
27
27
|
"@elysiajs/swagger": "^1.2.0",
|
|
28
28
|
"@elysiajs/cors": "^1.2.0",
|