ruvector-fixed / dist /workers /native-worker.js
Archie
Fix dimension/dimensions bug and positional insert/search args
40d7073
"use strict";
/**
* Native Worker Runner for RuVector
*
* Direct integration with:
* - ONNX embedder (384d, SIMD-accelerated)
* - VectorDB (HNSW indexing)
* - Intelligence engine (Q-learning, memory)
*
* No delegation to external tools - pure ruvector execution.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.NativeWorker = void 0;
exports.createSecurityWorker = createSecurityWorker;
exports.createAnalysisWorker = createAnalysisWorker;
exports.createLearningWorker = createLearningWorker;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const glob_1 = require("glob");
const onnx_embedder_1 = require("../core/onnx-embedder");
const security_1 = require("../analysis/security");
const complexity_1 = require("../analysis/complexity");
const patterns_1 = require("../analysis/patterns");
// Lazy imports for optional dependencies
let VectorDb = null;
let intelligence = null;
async function loadOptionalDeps() {
try {
const core = await Promise.resolve().then(() => __importStar(require('@ruvector/core')));
VectorDb = core.VectorDb;
}
catch {
// VectorDB not available
}
try {
const intel = await Promise.resolve().then(() => __importStar(require('../core/intelligence-engine')));
intelligence = intel;
}
catch {
// Intelligence not available
}
}
/**
* Native Worker Runner
*/
class NativeWorker {
constructor(config) {
this.vectorDb = null;
this.findings = [];
this.stats = {
filesAnalyzed: 0,
patternsFound: 0,
embeddingsGenerated: 0,
vectorsStored: 0,
};
this.config = config;
}
/**
* Initialize worker with capabilities
*/
async init() {
await loadOptionalDeps();
// Initialize ONNX embedder if needed
if (this.config.capabilities?.onnxEmbeddings) {
await (0, onnx_embedder_1.initOnnxEmbedder)();
}
// Initialize VectorDB if needed
if (this.config.capabilities?.vectorDb && VectorDb) {
const dbPath = path.join(process.cwd(), '.ruvector', 'workers', `${this.config.name}.db`);
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
this.vectorDb = new VectorDb({
dimensions: 384,
storagePath: dbPath,
});
}
}
/**
* Run all phases in sequence
*/
async run(targetPath = '.') {
const startTime = performance.now();
const phaseResults = [];
await this.init();
let context = { targetPath, files: [], patterns: [], embeddings: [] };
for (const phaseConfig of this.config.phases) {
const phaseStart = performance.now();
try {
context = await this.executePhase(phaseConfig.type, context, phaseConfig.config);
phaseResults.push({
phase: phaseConfig.type,
success: true,
data: this.summarizePhaseData(phaseConfig.type, context),
timeMs: performance.now() - phaseStart,
});
}
catch (error) {
phaseResults.push({
phase: phaseConfig.type,
success: false,
data: null,
timeMs: performance.now() - phaseStart,
error: error.message,
});
// Continue to next phase on error (fault-tolerant)
}
}
const totalTimeMs = performance.now() - startTime;
return {
worker: this.config.name,
success: phaseResults.every(p => p.success),
phases: phaseResults,
totalTimeMs,
summary: {
filesAnalyzed: this.stats.filesAnalyzed,
patternsFound: this.stats.patternsFound,
embeddingsGenerated: this.stats.embeddingsGenerated,
vectorsStored: this.stats.vectorsStored,
findings: this.findings,
},
};
}
/**
* Execute a single phase
*/
async executePhase(type, context, config) {
switch (type) {
case 'file-discovery':
return this.phaseFileDiscovery(context, config);
case 'pattern-extraction':
return this.phasePatternExtraction(context, config);
case 'embedding-generation':
return this.phaseEmbeddingGeneration(context, config);
case 'vector-storage':
return this.phaseVectorStorage(context, config);
case 'similarity-search':
return this.phaseSimilaritySearch(context, config);
case 'security-scan':
return this.phaseSecurityScan(context, config);
case 'complexity-analysis':
return this.phaseComplexityAnalysis(context, config);
case 'summarization':
return this.phaseSummarization(context, config);
default:
throw new Error(`Unknown phase: ${type}`);
}
}
/**
* Phase: File Discovery
*/
async phaseFileDiscovery(context, config) {
const patterns = config?.patterns || ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx'];
const exclude = config?.exclude || ['**/node_modules/**', '**/dist/**', '**/.git/**'];
const files = [];
for (const pattern of patterns) {
const matches = await (0, glob_1.glob)(pattern, {
cwd: context.targetPath,
ignore: exclude,
nodir: true,
});
files.push(...matches.map(f => path.join(context.targetPath, f)));
}
this.stats.filesAnalyzed = files.length;
return { ...context, files };
}
/**
* Phase: Pattern Extraction (uses shared analysis module)
*/
async phasePatternExtraction(context, config) {
const patterns = [];
const patternTypes = config?.types || ['function', 'class', 'import', 'export', 'todo'];
for (const file of context.files.slice(0, 100)) {
try {
const filePatterns = (0, patterns_1.extractAllPatterns)(file);
const matches = (0, patterns_1.toPatternMatches)(filePatterns);
// Filter by requested pattern types
for (const match of matches) {
if (patternTypes.includes(match.type)) {
patterns.push(match);
// Add findings for TODOs
if (match.type === 'todo') {
this.findings.push({
type: 'info',
message: match.match,
file,
});
}
}
}
}
catch {
// Skip unreadable files
}
}
this.stats.patternsFound = patterns.length;
return { ...context, patterns };
}
/**
* Phase: Embedding Generation (ONNX)
*/
async phaseEmbeddingGeneration(context, config) {
if (!(0, onnx_embedder_1.isReady)()) {
await (0, onnx_embedder_1.initOnnxEmbedder)();
}
const embeddings = [];
const batchSize = config?.batchSize || 32;
// Collect texts to embed
const texts = [];
// Embed file content summaries
for (const file of context.files.slice(0, 50)) {
try {
const content = fs.readFileSync(file, 'utf-8');
const summary = content.slice(0, 512); // First 512 chars
texts.push({ text: summary, file });
}
catch {
// Skip
}
}
// Embed patterns
for (const pattern of context.patterns.slice(0, 100)) {
texts.push({ text: pattern.match, file: pattern.file });
}
// Batch embed
for (let i = 0; i < texts.length; i += batchSize) {
const batch = texts.slice(i, i + batchSize);
const results = await (0, onnx_embedder_1.embedBatch)(batch.map(t => t.text));
for (let j = 0; j < results.length; j++) {
embeddings.push({
text: batch[j].text,
embedding: results[j].embedding,
file: batch[j].file,
});
}
}
this.stats.embeddingsGenerated = embeddings.length;
return { ...context, embeddings };
}
/**
* Phase: Vector Storage
*/
async phaseVectorStorage(context, config) {
if (!this.vectorDb) {
return context;
}
let stored = 0;
for (const item of context.embeddings) {
try {
await this.vectorDb.insert({
vector: new Float32Array(item.embedding),
metadata: {
text: item.text.slice(0, 200),
file: item.file,
worker: this.config.name,
timestamp: Date.now(),
},
});
stored++;
}
catch {
// Skip duplicates/errors
}
}
this.stats.vectorsStored = stored;
return context;
}
/**
* Phase: Similarity Search
*/
async phaseSimilaritySearch(context, config) {
if (!this.vectorDb || context.embeddings.length === 0) {
return context;
}
const query = config?.query || context.embeddings[0]?.text;
if (!query)
return context;
const queryResult = await (0, onnx_embedder_1.embed)(query);
const results = await this.vectorDb.search({
vector: new Float32Array(queryResult.embedding),
k: config?.k || 5,
});
return { ...context, searchResults: results };
}
/**
* Phase: Security Scan (uses shared analysis module)
*/
async phaseSecurityScan(context, config) {
// Use consolidated security scanner
const findings = (0, security_1.scanFiles)(context.files, undefined, 100);
// Convert to worker findings format
for (const finding of findings) {
this.findings.push({
type: 'security',
message: `${finding.rule}: ${finding.message}`,
file: finding.file,
line: finding.line,
severity: finding.severity === 'critical' ? 4 :
finding.severity === 'high' ? 3 :
finding.severity === 'medium' ? 2 : 1,
});
}
return context;
}
/**
* Phase: Complexity Analysis (uses shared analysis module)
*/
async phaseComplexityAnalysis(context, config) {
const complexityThreshold = config?.threshold || 10;
const complexFiles = [];
for (const file of context.files.slice(0, 50)) {
// Use consolidated complexity analyzer
const result = (0, complexity_1.analyzeFile)(file);
if (result.cyclomaticComplexity > complexityThreshold) {
complexFiles.push(result);
const rating = (0, complexity_1.getComplexityRating)(result.cyclomaticComplexity);
this.findings.push({
type: 'warning',
message: `High complexity: ${result.cyclomaticComplexity} (threshold: ${complexityThreshold})`,
file,
severity: rating === 'critical' ? 4 : rating === 'high' ? 3 : 2,
});
}
}
return { ...context, complexFiles };
}
/**
* Phase: Summarization
*/
async phaseSummarization(context, config) {
const summary = {
filesAnalyzed: context.files?.length || 0,
patternsFound: context.patterns?.length || 0,
embeddingsGenerated: context.embeddings?.length || 0,
findingsCount: this.findings.length,
findingsByType: {
info: this.findings.filter(f => f.type === 'info').length,
warning: this.findings.filter(f => f.type === 'warning').length,
error: this.findings.filter(f => f.type === 'error').length,
security: this.findings.filter(f => f.type === 'security').length,
},
topFindings: this.findings.slice(0, 10),
};
return { ...context, summary };
}
/**
* Summarize phase data for results
*/
summarizePhaseData(type, context) {
switch (type) {
case 'file-discovery':
return { filesFound: context.files?.length || 0 };
case 'pattern-extraction':
return { patternsFound: context.patterns?.length || 0 };
case 'embedding-generation':
return { embeddingsGenerated: context.embeddings?.length || 0 };
case 'vector-storage':
return { vectorsStored: this.stats.vectorsStored };
case 'similarity-search':
return { resultsFound: context.searchResults?.length || 0 };
case 'security-scan':
return { securityFindings: this.findings.filter(f => f.type === 'security').length };
case 'complexity-analysis':
return { complexFiles: context.complexFiles?.length || 0 };
case 'summarization':
return context.summary;
default:
return {};
}
}
}
exports.NativeWorker = NativeWorker;
/**
* Quick worker factory functions
*/
function createSecurityWorker(name = 'security-scanner') {
return new NativeWorker({
name,
description: 'Security vulnerability scanner',
phases: [
{ type: 'file-discovery', config: { patterns: ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx'] } },
{ type: 'security-scan' },
{ type: 'summarization' },
],
capabilities: { onnxEmbeddings: false, vectorDb: false },
});
}
function createAnalysisWorker(name = 'code-analyzer') {
return new NativeWorker({
name,
description: 'Code analysis with embeddings',
phases: [
{ type: 'file-discovery' },
{ type: 'pattern-extraction' },
{ type: 'embedding-generation' },
{ type: 'vector-storage' },
{ type: 'complexity-analysis' },
{ type: 'summarization' },
],
capabilities: { onnxEmbeddings: true, vectorDb: true },
});
}
function createLearningWorker(name = 'pattern-learner') {
return new NativeWorker({
name,
description: 'Pattern learning with vector storage',
phases: [
{ type: 'file-discovery' },
{ type: 'pattern-extraction' },
{ type: 'embedding-generation' },
{ type: 'vector-storage' },
{ type: 'summarization' },
],
capabilities: { onnxEmbeddings: true, vectorDb: true, intelligenceMemory: true },
});
}