@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.
Files changed (2) hide show
  1. package/dist/index.js +120 -120
  2. 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
- init_rlm_fusion();
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 fuseResultsImpl(this, resultSets, query, explainScores);
115508
+ return fuseResults(resultSets, query, explainScores);
115509
115509
  }
115510
115510
  generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank) {
115511
- return generateScoreExplanationImpl(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank);
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.10.0",
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.10.0",
25
- "@massa-ai/shared": "^1.10.0",
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",