il2cpp-dump-analyzer-mcp
Version:
Agentic RAG system for analyzing IL2CPP dump.cs files from Unity games
94 lines • 3.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.IL2CPPEmbeddingManager = void 0;
const documents_1 = require("@langchain/core/documents");
const xenova_embeddings_1 = require("./xenova-embeddings");
const dotenv_1 = __importDefault(require("dotenv"));
// Load environment variables
dotenv_1.default.config();
/**
* Manages the creation and storage of embeddings for IL2CPP code chunks
*/
class IL2CPPEmbeddingManager {
constructor() {
// Initialize the embeddings model
const modelName = process.env.EMBEDDING_MODEL || 'Xenova/all-MiniLM-L6-v2';
this.embeddings = new xenova_embeddings_1.XenovaEmbeddings(modelName);
}
/**
* Convert code chunks to LangChain documents with embeddings
* @param chunks Array of code chunks
* @returns Array of documents with embeddings
*/
async createEmbeddings(chunks) {
// Convert chunks to documents
const documents = chunks.map(chunk => new documents_1.Document({
pageContent: chunk.text,
metadata: chunk.metadata
}));
// Create embeddings for all documents
await this.embeddings.embedDocuments(documents.map(doc => doc.pageContent));
return documents;
}
/**
* Create an embedding for a query string
* @param query Query string
* @returns Embedding vector
*/
async createQueryEmbedding(query) {
return this.embeddings.embedQuery(query);
}
/**
* Find similar documents to a query
* @param query Query string
* @param documents Array of documents to search
* @param k Number of results to return
* @returns Array of documents with similarity scores
*/
async findSimilarDocuments(query, documents, k = 5) {
const queryEmbedding = await this.createQueryEmbedding(query);
const documentEmbeddings = await this.embeddings.embedDocuments(documents.map(doc => doc.pageContent));
// Calculate similarity scores
const similarities = [];
for (let i = 0; i < documents.length; i++) {
const similarity = this.cosineSimilarity(queryEmbedding, documentEmbeddings[i]);
similarities.push([documents[i], similarity]);
}
// Sort by similarity (descending)
similarities.sort((a, b) => b[1] - a[1]);
// Return top k results
return similarities.slice(0, k);
}
/**
* Calculate cosine similarity between two vectors
* @param a First vector
* @param b Second vector
* @returns Cosine similarity score
*/
cosineSimilarity(a, b) {
let dotProduct = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < a.length; i++) {
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
if (normA === 0 || normB === 0) {
return 0;
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
/**
* Get the dimensionality of the embeddings
* @returns The number of dimensions in the embedding vectors
*/
getDimension() {
return this.embeddings.getDimension();
}
}
exports.IL2CPPEmbeddingManager = IL2CPPEmbeddingManager;
//# sourceMappingURL=embeddings.js.map