UNPKG

@chainlink/mcp-server

Version:
112 lines 4.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateRelevance = exports.searchInCcipDataSources = void 0; const strings_1 = require("./strings"); const searchInCcipDataSources = (data, query, specificChain, environment, dataType) => { const results = []; const lowercaseQuery = query.toLowerCase(); if (typeof data === "object" && data !== null) { for (const [key, value] of Object.entries(data)) { const lowercaseKey = key.toLowerCase(); let matches = false; if (specificChain) { const normalizedChain = specificChain .toLowerCase() .replace(strings_1.CHAIN_NAME_NORMALIZER, ""); const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); matches = normalizedKey.includes(normalizedChain) || normalizedChain.includes(normalizedKey); } else { const normalizedQuery = lowercaseQuery.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); matches = lowercaseKey.includes(lowercaseQuery) || lowercaseQuery.includes(lowercaseKey) || normalizedKey.includes(normalizedQuery) || normalizedQuery.includes(normalizedKey); } if (matches) { results.push({ environment, dataType, key, data: value, relevance: (0, exports.calculateRelevance)(key, query, specificChain), }); } if (typeof value === "object" && value !== null) { const nestedResults = (0, exports.searchInCcipDataSources)(value, query, specificChain, environment, `${dataType}.${key}`); results.push(...nestedResults); } } } return results; }; exports.searchInCcipDataSources = searchInCcipDataSources; const calculateRelevance = (key, query, specificChain) => { let score = 0; const lowercaseKey = key.toLowerCase(); const lowercaseQuery = query.toLowerCase(); const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); const normalizedQuery = lowercaseQuery.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); if (lowercaseKey === lowercaseQuery) score += 100; else if (normalizedKey === normalizedQuery) score += 90; else if (lowercaseKey.includes(lowercaseQuery)) score += 50; else if (normalizedKey.includes(normalizedQuery)) score += 45; else if (lowercaseQuery.includes(lowercaseKey)) score += 30; else if (normalizedQuery.includes(normalizedKey)) score += 25; if (score === 0) { const keyParts = lowercaseKey.split(/[-_]/); for (const part of keyParts) { if (part.length > 2 && lowercaseQuery.includes(part)) { score += 40; break; } } } if (lowercaseQuery.includes("sepolia")) { const keyParts = lowercaseKey.split("-"); if (keyParts.includes("sepolia")) { const contextWords = keyParts.filter((part) => part !== "sepolia" && part.length > 1); const contextMatches = contextWords.filter((word) => lowercaseQuery.includes(word)); score += contextMatches.length * 15; if (keyParts.includes("ethereum") && keyParts.includes("testnet")) { if (contextMatches.length === 0) score += 10; } } } if (specificChain) { const lowercaseChain = specificChain.toLowerCase(); const normalizedChain = lowercaseChain.replace(strings_1.CHAIN_NAME_NORMALIZER, ""); if (lowercaseKey === lowercaseChain) { score += 200; const queryParts = lowercaseQuery.replace(/[^\w\s]/g, "").split(/\s+/); const chainParts = lowercaseChain.split(/[-_]/); let mentionedParts = 0; for (const chainPart of chainParts) { if (chainPart.length > 2 && queryParts.includes(chainPart)) mentionedParts++; } if (mentionedParts > 1) score += 50; } else if (normalizedKey === normalizedChain) score += 180; else if (lowercaseKey.includes(lowercaseChain)) score += 75; else if (normalizedKey.includes(normalizedChain)) score += 65; } return score; }; exports.calculateRelevance = calculateRelevance; //# sourceMappingURL=search.js.map