23f7624596
ADR-166 MCP Bridge Security Lock / Static-source security lock (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / Compose default binds loopback + Mongo has auth (push) Failing after 2s
CodeQL Advanced / Analyze (rust) (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / plugin-agent-federation bindHost default (push) Failing after 1s
ADR-166 MCP Bridge Security Lock / Runtime behavior — 401 + terminal gate + fail-closed (push) Failing after 4s
business-pods-smoke / smoke (push) Failing after 1s
all-plugins-smoke / smoke-all (push) Failing after 2s
CI/CD Pipeline / Security & Code Quality (push) Failing after 1s
CI/CD Pipeline / Test Suite (ubuntu-latest) (push) Failing after 1s
CI/CD Pipeline / Build & Package (macos-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (ubuntu-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (windows-latest) (push) Has been skipped
CI/CD Pipeline / Documentation & Examples (push) Failing after 1s
Clone Tracker (14-day rolling) / Snapshot clones for ruflo ecosystem (push) Failing after 1s
CodeQL Advanced / Analyze (actions) (push) Failing after 1s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 1s
federation-peer-rust / stable-noop (push) Failing after 1s
metaharness-ci / score (push) Failing after 1s
metaharness-ci / router-compat (push) Failing after 0s
metaharness-ci / similarity-tests (push) Failing after 0s
no-agentbbs-smoke / smoke-without-agentbbs (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (windows-latest) (push) Has been skipped
codex-integration-audit / Codex integration audit (push) Failing after 1s
helpers-manifest-guard / guard (push) Failing after 1s
🔗 Cross-Agent Integration Tests / 🤝 Agent Coordination Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🧠 Memory Sharing Integration (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🛡️ Fault Tolerance Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / ⚡ Performance Integration Tests (push) Has been skipped
metaharness-ci / mcp-scan (push) Failing after 1s
metaharness-ci / eject-dryrun (push) Failing after 1s
metaharness-ci / metaharness-real-data (push) Failing after 0s
no-cli-optdep-bloat-2561 / guard (push) Failing after 1s
no-metaharness-smoke / smoke-without-metaharness (push) Failing after 1s
no-phantom-agentic-flow-subpath / guard (push) Failing after 1s
🔄 Automated Rollback Manager / 🚨 Failure Detection (push) Failing after 1s
V3 CI/CD Pipeline / Plugin hooks smoke / ubuntu-latest / Node 22 (push) Failing after 1s
V3 CI/CD Pipeline / ruflo-graph-intelligence build + test smoke (#2044, ADR-123) (push) Failing after 1s
CVE Audit Gate / Audit root (critical-blocking) (push) Failing after 2s
cost-tracker-smoke / smoke (push) Failing after 3s
oia-audit-weekly / audit (push) Failing after 2s
ruflo-agent-smoke / ruflo-agent structural smoke (push) Failing after 1s
📊 Status Badges Update / 📊 Update Status Badges (push) Failing after 1s
V3 CI/CD Pipeline / Static regression guards (#2267 YAML + (push) Failing after 1s
V3 CI/CD Pipeline / Test V3 Packages (push) Failing after 0s
V3 CI/CD Pipeline / agent_execute provider routing smoke (#2042) (push) Failing after 0s
CVE Audit Gate / Audit v3 (critical-blocking) (push) Failing after 1s
federation-peer-rust / stable-native (push) Failing after 2s
🔗 Cross-Agent Integration Tests / 🚀 Integration Test Setup (push) Failing after 2s
neural-trader-smoke / runtime-smoke (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (macos-latest) (push) Has been skipped
V3 CI/CD Pipeline / Build V3 (ubuntu-latest) (push) Has been skipped
V3 CI/CD Pipeline / Type Check V3 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 24 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 22 (push) Failing after 2s
V3 CI/CD Pipeline / browser rvf create flag smoke (#2015) (push) Failing after 0s
V3 CI/CD Pipeline / Dependency review (#2046) (push) Has been skipped
V3 CI/CD Pipeline / Supply-chain audit (#2046) (push) Failing after 0s
V3 CI/CD Pipeline / witness marker drift smoke (#2021) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader portfolio CG smoke (#2068, ADR-126 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader backtest signing smoke (#2068, ADR-126 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / kg-extract type-import classification smoke (#2049) (push) Failing after 0s
V3 CI/CD Pipeline / witness verify precondition smoke (#1880) (push) Failing after 2s
V3 CI/CD Pipeline / neural-trader pipeline risk-gate smoke (#2068, ADR-126 Phase 5) (push) Failing after 0s
V3 CI/CD Pipeline / neural-trader feature attribution smoke (#2068, ADR-126 Phase 6) (push) Failing after 0s
V3 CI/CD Pipeline / plugin-registry signature verification smoke (#1922, CWE-347) (push) Failing after 4s
V3 CI/CD Pipeline / memory stats legacy-DB smoke (#2120) (push) Failing after 4s
V3 CI/CD Pipeline / github deprecated actions smoke (#2089, ADR-127 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / graph query + pathfinder smoke (ADR-130 P2+P5) (push) Has been skipped
V3 CI/CD Pipeline / graph trajectory hooks smoke (ADR-130 P3) (push) Has been skipped
V3 CI/CD Pipeline / graph plugin adapter smoke (ADR-130 P4) (push) Has been skipped
V3 CI/CD Pipeline / graph benchmark (ADR-130 P6) (push) Has been skipped
V3 CI/CD Pipeline / statusline generator delegation smoke (#2195) (push) Failing after 1s
V3 CI/CD Pipeline / wizard init regression guard (#2206 (push) Failing after 1s
V3 CI/CD Pipeline / memory no-stray-db smoke (ADR-125 P7) (push) Failing after 1s
V3 CI/CD Pipeline / github-safe injection smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github actions pin smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github attribution opt-in smoke (#2089, ADR-127 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / pre-bash hook safety smoke (#2017) (push) Failing after 1s
V3 CI/CD Pipeline / Memory import smoke / ubuntu-latest (push) Failing after 0s
V3 CI/CD Pipeline / MCP protocol smoke / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / ruvllm WASM auto-init smoke (#2086) (push) Failing after 4s
V3 CI/CD Pipeline / MCP paired-tool round-trip smoke (#1889) (push) Failing after 1s
V3 CI/CD Pipeline / Plugin package install-safety (#1902/#1903/#1904) (push) Failing after 1s
V3 CI/CD Pipeline / Tool description discoverability (ADR-112) (push) Failing after 3s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (22) (push) Failing after 1s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (24) (push) Failing after 1s
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Vector-index dimension audit (#1947) (push) Failing after 0s
V3 CI/CD Pipeline / Hook-command install safety (#1921) (push) Failing after 1s
V3 CI/CD Pipeline / ToolOutputGuardrail smoke (ADR-131, (push) Failing after 1s
V3 CI/CD Pipeline / init-bundle invariants smoke (#2095, ADR-128 Phase 5) (push) Failing after 1s
V3 CI/CD Pipeline / wasm provider bridge smoke (ADR-129 P1) (push) Failing after 2s
V3 CI/CD Pipeline / wasm gallery CRUD smoke (ADR-129 P3) (push) Failing after 1s
V3 CI/CD Pipeline / wasm plugin bridge smoke (ADR-129 P4) (push) Failing after 0s
V3 CI/CD Pipeline / wasm compose smoke (ADR-129 P2) (push) Failing after 4s
V3 CI/CD Pipeline / graph schema smoke (ADR-130 P1) (push) Failing after 0s
Validate Marketplace / validate (push) Failing after 1s
🔍 Verification Pipeline / 🚀 Setup Verification (push) Failing after 1s
🔍 Verification Pipeline / 🛡️ Security Verification (push) Has been skipped
🔍 Verification Pipeline / 📝 Code Quality (push) Has been skipped
🔍 Verification Pipeline / 🧪 Test Verification (${{ matrix.os }}, Node ${{ matrix.node }}) (push) Has been skipped
🔍 Verification Pipeline / 🏗️ Build Verification (push) Has been skipped
🔍 Verification Pipeline / 📚 Documentation Verification (push) Has been skipped
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Has been cancelled
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Has been cancelled
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Has been cancelled
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Has been cancelled
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Has been cancelled
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Has been cancelled
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Has been cancelled
CI/CD Pipeline / Deploy & Release (push) Has been cancelled
CI/CD Pipeline / CI Status (push) Has been cancelled
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Has been cancelled
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Has been cancelled
🔍 Verification Pipeline / ⚡ Performance Verification (push) Has been cancelled
🔍 Verification Pipeline / 📊 Verification Report (push) Has been cancelled
289 lines
11 KiB
TypeScript
289 lines
11 KiB
TypeScript
/**
|
|
* RuVector PostgreSQL Bridge - Basic Usage Example
|
|
*
|
|
* This example demonstrates fundamental operations:
|
|
* - Connecting to PostgreSQL with pgvector
|
|
* - Creating collections and inserting vectors
|
|
* - Performing similarity searches
|
|
* - Updating and deleting vectors
|
|
*
|
|
* Prerequisites:
|
|
* - PostgreSQL 14+ with pgvector extension
|
|
* - Docker: docker compose up -d
|
|
*
|
|
* Run with: npx ts-node examples/ruvector/basic-usage.ts
|
|
*
|
|
* @module @claude-flow/plugins/examples/ruvector/basic-usage
|
|
*/
|
|
|
|
import {
|
|
createRuVectorBridge,
|
|
type RuVectorBridge,
|
|
type VectorRecord,
|
|
type VectorSearchOptions,
|
|
} from '../../src/integrations/ruvector/index.js';
|
|
|
|
// ============================================================================
|
|
// Configuration
|
|
// ============================================================================
|
|
|
|
const config = {
|
|
connection: {
|
|
host: process.env.POSTGRES_HOST || 'localhost',
|
|
port: parseInt(process.env.POSTGRES_PORT || '5432', 10),
|
|
database: process.env.POSTGRES_DB || 'vectors',
|
|
user: process.env.POSTGRES_USER || 'postgres',
|
|
password: process.env.POSTGRES_PASSWORD || 'postgres',
|
|
},
|
|
dimensions: 384, // Common embedding dimension (e.g., sentence-transformers/all-MiniLM-L6-v2)
|
|
};
|
|
|
|
// ============================================================================
|
|
// Helper Functions
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Generate a random embedding vector for demonstration.
|
|
* In production, use a proper embedding model.
|
|
*/
|
|
function generateRandomEmbedding(dim: number): number[] {
|
|
const embedding = new Array(dim);
|
|
for (let i = 0; i < dim; i++) {
|
|
embedding[i] = Math.random() * 2 - 1; // Range [-1, 1]
|
|
}
|
|
// Normalize to unit length
|
|
const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
|
|
return embedding.map(v => v / magnitude);
|
|
}
|
|
|
|
/**
|
|
* Print search results in a readable format.
|
|
*/
|
|
function printResults(title: string, results: VectorRecord[]): void {
|
|
console.log(`\n${title}`);
|
|
console.log('='.repeat(50));
|
|
results.forEach((result, i) => {
|
|
console.log(`${i + 1}. ID: ${result.id}`);
|
|
console.log(` Distance: ${result.distance?.toFixed(4) ?? 'N/A'}`);
|
|
console.log(` Metadata: ${JSON.stringify(result.metadata)}`);
|
|
});
|
|
}
|
|
|
|
// ============================================================================
|
|
// Main Example
|
|
// ============================================================================
|
|
|
|
async function main(): Promise<void> {
|
|
console.log('RuVector PostgreSQL Bridge - Basic Usage Example');
|
|
console.log('================================================\n');
|
|
|
|
// Create the bridge instance
|
|
const bridge: RuVectorBridge = createRuVectorBridge({
|
|
connectionString: `postgresql://${config.connection.user}:${config.connection.password}@${config.connection.host}:${config.connection.port}/${config.connection.database}`,
|
|
poolSize: 5,
|
|
});
|
|
|
|
try {
|
|
// ========================================================================
|
|
// 1. Connect to PostgreSQL
|
|
// ========================================================================
|
|
console.log('1. Connecting to PostgreSQL...');
|
|
await bridge.connect();
|
|
console.log(' Connected successfully!\n');
|
|
|
|
// ========================================================================
|
|
// 2. Create a Collection
|
|
// ========================================================================
|
|
console.log('2. Creating collection "documents"...');
|
|
await bridge.createCollection('documents', {
|
|
dimensions: config.dimensions,
|
|
distanceMetric: 'cosine',
|
|
indexType: 'hnsw',
|
|
indexParams: {
|
|
m: 16, // Number of connections per layer
|
|
efConstruction: 64, // Size of dynamic candidate list during construction
|
|
},
|
|
});
|
|
console.log(' Collection created!\n');
|
|
|
|
// ========================================================================
|
|
// 3. Insert Vectors
|
|
// ========================================================================
|
|
console.log('3. Inserting vectors...');
|
|
|
|
// Sample documents with embeddings
|
|
const documents = [
|
|
{ id: 'doc-1', content: 'Introduction to machine learning', category: 'ML' },
|
|
{ id: 'doc-2', content: 'Deep learning fundamentals', category: 'DL' },
|
|
{ id: 'doc-3', content: 'Natural language processing', category: 'NLP' },
|
|
{ id: 'doc-4', content: 'Computer vision basics', category: 'CV' },
|
|
{ id: 'doc-5', content: 'Reinforcement learning guide', category: 'RL' },
|
|
];
|
|
|
|
// Insert each document with its embedding
|
|
for (const doc of documents) {
|
|
const embedding = generateRandomEmbedding(config.dimensions);
|
|
await bridge.insert('documents', {
|
|
id: doc.id,
|
|
embedding,
|
|
metadata: {
|
|
content: doc.content,
|
|
category: doc.category,
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
});
|
|
console.log(` Inserted: ${doc.id}`);
|
|
}
|
|
console.log(' All vectors inserted!\n');
|
|
|
|
// ========================================================================
|
|
// 4. Basic Similarity Search
|
|
// ========================================================================
|
|
console.log('4. Performing similarity search...');
|
|
|
|
// Generate a query vector (in production, embed your query text)
|
|
const queryVector = generateRandomEmbedding(config.dimensions);
|
|
|
|
const searchOptions: VectorSearchOptions = {
|
|
k: 3, // Return top 3 results
|
|
includeMetadata: true,
|
|
includeDistance: true,
|
|
};
|
|
|
|
const searchResults = await bridge.search('documents', queryVector, searchOptions);
|
|
printResults('Top 3 Similar Documents', searchResults);
|
|
|
|
// ========================================================================
|
|
// 5. Filtered Search
|
|
// ========================================================================
|
|
console.log('\n5. Performing filtered search (category = "ML")...');
|
|
|
|
const filteredResults = await bridge.search('documents', queryVector, {
|
|
...searchOptions,
|
|
filter: {
|
|
category: 'ML',
|
|
},
|
|
});
|
|
printResults('Filtered Results (ML category)', filteredResults);
|
|
|
|
// ========================================================================
|
|
// 6. Range Search (by distance threshold)
|
|
// ========================================================================
|
|
console.log('\n6. Performing range search (distance < 0.8)...');
|
|
|
|
const rangeResults = await bridge.search('documents', queryVector, {
|
|
k: 10,
|
|
includeMetadata: true,
|
|
includeDistance: true,
|
|
distanceThreshold: 0.8, // Only return results within this distance
|
|
});
|
|
printResults('Range Search Results', rangeResults);
|
|
|
|
// ========================================================================
|
|
// 7. Update a Vector
|
|
// ========================================================================
|
|
console.log('\n7. Updating vector "doc-1"...');
|
|
|
|
const newEmbedding = generateRandomEmbedding(config.dimensions);
|
|
await bridge.update('documents', 'doc-1', {
|
|
embedding: newEmbedding,
|
|
metadata: {
|
|
content: 'Introduction to machine learning (Updated)',
|
|
category: 'ML',
|
|
updatedAt: new Date().toISOString(),
|
|
},
|
|
});
|
|
console.log(' Vector updated!');
|
|
|
|
// Verify the update
|
|
const updatedDoc = await bridge.get('documents', 'doc-1');
|
|
if (updatedDoc) {
|
|
console.log(` Verified: ${JSON.stringify(updatedDoc.metadata)}`);
|
|
}
|
|
|
|
// ========================================================================
|
|
// 8. Batch Insert
|
|
// ========================================================================
|
|
console.log('\n8. Batch inserting 100 vectors...');
|
|
|
|
const batchRecords: VectorRecord[] = [];
|
|
for (let i = 0; i < 100; i++) {
|
|
batchRecords.push({
|
|
id: `batch-${i}`,
|
|
embedding: generateRandomEmbedding(config.dimensions),
|
|
metadata: {
|
|
batchIndex: i,
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
});
|
|
}
|
|
|
|
const startTime = performance.now();
|
|
await bridge.insertBatch('documents', batchRecords);
|
|
const duration = performance.now() - startTime;
|
|
|
|
console.log(` Inserted 100 vectors in ${duration.toFixed(2)}ms`);
|
|
console.log(` Throughput: ${(100 / (duration / 1000)).toFixed(0)} vectors/second`);
|
|
|
|
// ========================================================================
|
|
// 9. Get Collection Statistics
|
|
// ========================================================================
|
|
console.log('\n9. Collection statistics...');
|
|
|
|
const stats = await bridge.getCollectionStats('documents');
|
|
console.log(` Total vectors: ${stats.vectorCount}`);
|
|
console.log(` Dimensions: ${stats.dimensions}`);
|
|
console.log(` Index type: ${stats.indexType}`);
|
|
console.log(` Index size: ${(stats.indexSizeBytes / 1024).toFixed(2)} KB`);
|
|
|
|
// ========================================================================
|
|
// 10. Delete Vectors
|
|
// ========================================================================
|
|
console.log('\n10. Deleting vectors...');
|
|
|
|
// Delete a single vector
|
|
await bridge.delete('documents', 'doc-5');
|
|
console.log(' Deleted: doc-5');
|
|
|
|
// Delete multiple vectors
|
|
const idsToDelete = ['batch-0', 'batch-1', 'batch-2'];
|
|
for (const id of idsToDelete) {
|
|
await bridge.delete('documents', id);
|
|
}
|
|
console.log(` Deleted: ${idsToDelete.join(', ')}`);
|
|
|
|
// Verify deletion
|
|
const deletedDoc = await bridge.get('documents', 'doc-5');
|
|
console.log(` Verification - doc-5 exists: ${deletedDoc !== null}`);
|
|
|
|
// ========================================================================
|
|
// 11. Cleanup (Optional)
|
|
// ========================================================================
|
|
console.log('\n11. Cleanup...');
|
|
|
|
// Uncomment to drop the collection when done
|
|
// await bridge.dropCollection('documents');
|
|
// console.log(' Collection dropped!');
|
|
|
|
console.log(' Skipping collection drop (uncomment to enable)');
|
|
|
|
// ========================================================================
|
|
// Done
|
|
// ========================================================================
|
|
console.log('\n' + '='.repeat(50));
|
|
console.log('Basic usage example completed successfully!');
|
|
console.log('='.repeat(50));
|
|
|
|
} catch (error) {
|
|
console.error('Error:', error);
|
|
throw error;
|
|
} finally {
|
|
// Always disconnect
|
|
await bridge.disconnect();
|
|
console.log('\nDisconnected from PostgreSQL.');
|
|
}
|
|
}
|
|
|
|
// Run the example
|
|
main().catch(console.error);
|