From 524be5010b6e7eb30d3c5768a42a6c715a7603b6 Mon Sep 17 00:00:00 2001 From: David Snelling Date: Mon, 28 Jul 2025 16:25:11 -0700 Subject: [PATCH] No commit message can be generated for the provided diff as it appears to be incomplete. Please provide a more descriptive or complete diff to enable me to generate a relevant commit message for you. --- .gitignore | 1 + .npmignore | 1 + REALTIME_UPDATES.md | 182 ++++++++++++++++++++++++++++++++ src/brainyData.ts | 245 ++++++++++++++++++++++++++++++++++++++++++++ test-results.json | 2 +- 5 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 REALTIME_UPDATES.md diff --git a/.gitignore b/.gitignore index d9fe1b97..1cb5ec99 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ Thumbs.db # Test files /test-worker.js /test-node24-worker.js +/test-results.json # Generated files /encoded-image.html diff --git a/.npmignore b/.npmignore index fc9e8b71..41ed9e65 100644 --- a/.npmignore +++ b/.npmignore @@ -38,3 +38,4 @@ scalingStrategy.md npm-debug.log* yarn-debug.log* yarn-error.log* +test-results.json diff --git a/REALTIME_UPDATES.md b/REALTIME_UPDATES.md new file mode 100644 index 00000000..e3355475 --- /dev/null +++ b/REALTIME_UPDATES.md @@ -0,0 +1,182 @@ +# Real-time Updates in Brainy + +This document explains the real-time update features in Brainy, which ensure that the in-memory index and statistics are always up-to-date with the latest data in storage. + +## Overview + +When running Brainy inside a web service with data being constantly added in a stream (using S3 or any other storage option), the new data needs to be searchable in real-time. The real-time update feature periodically checks for new data in storage and updates the in-memory index and statistics accordingly. + +## Configuration + +Real-time updates can be configured when creating a BrainyData instance: + +```typescript +import { BrainyData } from '@soulcraft/brainy' + +const db = new BrainyData({ + // ... other configuration options ... + + // Real-time update configuration + realtimeUpdates: { + // Whether to enable automatic updates (default: false) + enabled: true, + + // The interval in milliseconds at which to check for updates (default: 30000 - 30 seconds) + interval: 10000, // 10 seconds + + // Whether to update statistics when checking for updates (default: true) + updateStatistics: true, + + // Whether to update the index when checking for updates (default: true) + updateIndex: true + } +}) +``` + +## Runtime Control + +Real-time updates can also be controlled at runtime: + +### Enable Real-time Updates + +```typescript +// Enable with default configuration +db.enableRealtimeUpdates() + +// Enable with custom configuration +db.enableRealtimeUpdates({ + interval: 5000, // 5 seconds + updateStatistics: true, + updateIndex: true +}) +``` + +### Disable Real-time Updates + +```typescript +db.disableRealtimeUpdates() +``` + +### Get Current Configuration + +```typescript +const config = db.getRealtimeUpdateConfig() +console.log(`Real-time updates enabled: ${config.enabled}`) +console.log(`Update interval: ${config.interval}ms`) +``` + +### Manual Update Check + +You can also manually check for updates at any time, regardless of whether automatic updates are enabled: + +```typescript +await db.checkForUpdatesNow() +``` + +## How It Works + +When real-time updates are enabled, Brainy will: + +1. Periodically check for new data in storage at the specified interval. +2. If new data is found, update the in-memory index with the new data. +3. Update the statistics to reflect the latest data. + +This ensures that search operations and statistics always reflect the latest data, even when data is being added by external processes. + +### Incremental Updates + +The real-time update mechanism is designed to be efficient and only processes new data: + +- **Incremental Indexing**: Brainy only adds new items to the index that aren't already there, rather than reloading the entire index. It compares the IDs of items in storage with those already in the index to identify only the new items that need to be added. + +- **Efficient Statistics Updates**: Statistics are updated incrementally as well, with changes being batched for performance. + +### Handling Large Indices + +Brainy is designed to handle indices that are too large to fit entirely in memory: + +- **Optimized HNSW Implementation**: Brainy uses the `HNSWIndexOptimized` class which supports large datasets through: + - **Product Quantization**: Compresses vectors to reduce memory usage while maintaining search quality + - **Disk-Based Storage**: Can offload parts of the index to disk when memory is constrained + +- **Memory Management**: When the index grows too large for available memory: + 1. The most frequently accessed items are kept in memory for fast access + 2. Less frequently accessed items may be stored on disk and loaded when needed + 3. The system automatically balances memory usage based on access patterns + +- **Configurable Trade-offs**: You can configure the balance between memory usage and performance through the HNSW configuration options when creating the database. + +## Best Practices + +- For high-volume data streams, set a reasonable update interval to balance real-time updates with performance. +- If you only need occasional updates, disable automatic updates and use `checkForUpdatesNow()` when needed. +- For web services with multiple instances, each instance will maintain its own in-memory index and statistics. + +## Compatibility + +Real-time updates work with all storage options supported by Brainy, including: + +- File system storage +- Memory storage +- S3 storage +- Custom storage adapters + +## Example: Web Service with S3 Storage + +```typescript +import { BrainyData } from '@soulcraft/brainy' +import express from 'express' + +const app = express() + +// Create a BrainyData instance with S3 storage and real-time updates +const db = new BrainyData({ + storage: { + s3Storage: { + bucketName: 'my-brainy-bucket', + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + region: 'us-west-2' + } + }, + realtimeUpdates: { + enabled: true, + interval: 30000 // 30 seconds + } +}) + +// Initialize the database +await db.init() + +// API endpoint to search +app.get('/search', async (req, res) => { + const { query, limit } = req.query + const results = await db.searchText(query, parseInt(limit) || 10) + res.json(results) +}) + +// API endpoint to get statistics +app.get('/stats', async (req, res) => { + const stats = await db.getStatistics() + res.json(stats) +}) + +// API endpoint to manually check for updates +app.post('/update', async (req, res) => { + await db.checkForUpdatesNow() + res.json({ success: true }) +}) + +// Start the server +app.listen(3000, () => { + console.log('Server running on port 3000') +}) + +// Graceful shutdown +process.on('SIGINT', async () => { + await db.shutDown() + process.exit(0) +}) +``` + +In this example, the BrainyData instance will automatically check for new data in the S3 bucket every 30 seconds, ensuring that search results and statistics are always up-to-date. diff --git a/src/brainyData.ts b/src/brainyData.ts index 93628a2b..1ab5c11b 100644 --- a/src/brainyData.ts +++ b/src/brainyData.ts @@ -134,6 +134,37 @@ export interface BrainyDataConfig { */ verbose?: boolean } + + /** + * Real-time update configuration + * Controls how the database handles updates when data is added by external processes + */ + realtimeUpdates?: { + /** + * Whether to enable automatic updates of the index and statistics + * When true, the database will periodically check for new data in storage + * Default: false + */ + enabled?: boolean + + /** + * The interval (in milliseconds) at which to check for updates + * Default: 30000 (30 seconds) + */ + interval?: number + + /** + * Whether to update statistics when checking for updates + * Default: true + */ + updateStatistics?: boolean + + /** + * Whether to update the index when checking for updates + * Default: true + */ + updateIndex?: boolean + } } export class BrainyData implements BrainyDataInterface { @@ -149,6 +180,17 @@ export class BrainyData implements BrainyDataInterface { private useOptimizedIndex: boolean = false private _dimensions: number private loggingConfig: BrainyDataConfig['logging'] = {verbose: true} + + // Real-time update properties + private realtimeUpdateConfig: Required> = { + enabled: false, + interval: 30000, // 30 seconds + updateStatistics: true, + updateIndex: true + } + private updateTimerId: NodeJS.Timeout | null = null + private lastUpdateTime = 0 + private lastKnownNounCount = 0 // Remote server properties private remoteServerConfig: BrainyDataConfig['remoteServer'] | null = null @@ -230,6 +272,14 @@ export class BrainyData implements BrainyDataInterface { if (config.remoteServer) { this.remoteServerConfig = config.remoteServer } + + // Initialize real-time update configuration if provided + if (config.realtimeUpdates) { + this.realtimeUpdateConfig = { + ...this.realtimeUpdateConfig, + ...config.realtimeUpdates + } + } } /** @@ -243,6 +293,189 @@ export class BrainyData implements BrainyDataInterface { ) } } + + /** + * Start real-time updates if enabled in the configuration + * This will periodically check for new data in storage and update the in-memory index and statistics + */ + private startRealtimeUpdates(): void { + // If real-time updates are not enabled, do nothing + if (!this.realtimeUpdateConfig.enabled) { + return + } + + // If the update timer is already running, do nothing + if (this.updateTimerId !== null) { + return + } + + // Set the initial last known noun count + this.getNounCount().then(count => { + this.lastKnownNounCount = count + }).catch(error => { + console.warn('Failed to get initial noun count for real-time updates:', error) + }) + + // Start the update timer + this.updateTimerId = setInterval(() => { + this.checkForUpdates().catch(error => { + console.warn('Error during real-time update check:', error) + }) + }, this.realtimeUpdateConfig.interval) + + if (this.loggingConfig?.verbose) { + console.log(`Real-time updates started with interval: ${this.realtimeUpdateConfig.interval}ms`) + } + } + + /** + * Stop real-time updates + */ + private stopRealtimeUpdates(): void { + // If the update timer is not running, do nothing + if (this.updateTimerId === null) { + return + } + + // Stop the update timer + clearInterval(this.updateTimerId) + this.updateTimerId = null + + if (this.loggingConfig?.verbose) { + console.log('Real-time updates stopped') + } + } + + /** + * Manually check for updates in storage and update the in-memory index and statistics + * This can be called by the user to force an update check even if automatic updates are not enabled + */ + public async checkForUpdatesNow(): Promise { + await this.ensureInitialized() + return this.checkForUpdates() + } + + /** + * Enable real-time updates with the specified configuration + * @param config Configuration for real-time updates + */ + public enableRealtimeUpdates(config?: Partial): void { + // Update configuration if provided + if (config) { + this.realtimeUpdateConfig = { + ...this.realtimeUpdateConfig, + ...config + } + } + + // Enable updates + this.realtimeUpdateConfig.enabled = true + + // Start updates if initialized + if (this.isInitialized) { + this.startRealtimeUpdates() + } + } + + /** + * Disable real-time updates + */ + public disableRealtimeUpdates(): void { + // Disable updates + this.realtimeUpdateConfig.enabled = false + + // Stop updates if running + this.stopRealtimeUpdates() + } + + /** + * Get the current real-time update configuration + * @returns The current real-time update configuration + */ + public getRealtimeUpdateConfig(): Required> { + return { ...this.realtimeUpdateConfig } + } + + /** + * Check for updates in storage and update the in-memory index and statistics if needed + * This is called periodically by the update timer when real-time updates are enabled + */ + private async checkForUpdates(): Promise { + // If the database is not initialized, do nothing + if (!this.isInitialized || !this.storage) { + return + } + + try { + // Record the current time + const startTime = Date.now() + + // Update statistics if enabled + if (this.realtimeUpdateConfig.updateStatistics) { + await this.storage.flushStatisticsToStorage() + // Clear the statistics cache to force a reload from storage + await this.getStatistics({ forceRefresh: true }) + } + + // Update index if enabled + if (this.realtimeUpdateConfig.updateIndex) { + // Get the current noun count + const currentCount = await this.getNounCount() + + // If the noun count has changed, update the index + if (currentCount !== this.lastKnownNounCount) { + // Get all nouns from storage + const nouns = await this.storage.getAllNouns() + + // Get all nouns currently in the index + const indexNouns = this.index.getNouns() + const indexNounIds = new Set(indexNouns.keys()) + + // Find nouns that are in storage but not in the index + const newNouns = nouns.filter(noun => !indexNounIds.has(noun.id)) + + // Add new nouns to the index + for (const noun of newNouns) { + // Check if the vector dimensions match the expected dimensions + if (noun.vector.length !== this._dimensions) { + console.warn( + `Skipping noun ${noun.id} due to dimension mismatch: expected ${this._dimensions}, got ${noun.vector.length}` + ) + continue + } + + // Add to index + await this.index.addItem({ + id: noun.id, + vector: noun.vector + }) + + if (this.loggingConfig?.verbose) { + console.log(`Added new noun ${noun.id} to index during real-time update`) + } + } + + // Update the last known noun count + this.lastKnownNounCount = currentCount + + if (this.loggingConfig?.verbose && newNouns.length > 0) { + console.log(`Real-time update: Added ${newNouns.length} new nouns to index`) + } + } + } + + // Update the last update time + this.lastUpdateTime = Date.now() + + if (this.loggingConfig?.verbose) { + const duration = this.lastUpdateTime - startTime + console.log(`Real-time update completed in ${duration}ms`) + } + } catch (error) { + console.error('Failed to check for updates:', error) + // Don't rethrow the error to avoid disrupting the update timer + } + } /** * Get the current augmentation name if available @@ -408,6 +641,9 @@ export class BrainyData implements BrainyDataInterface { this.isInitialized = true this.isInitializing = false + + // Start real-time updates if enabled + this.startRealtimeUpdates() } catch (error) { console.error('Failed to initialize BrainyData:', error) this.isInitializing = false @@ -1998,6 +2234,7 @@ export class BrainyData implements BrainyDataInterface { */ public async getStatistics(options: { service?: string | string[] // Filter statistics by service(s) + forceRefresh?: boolean // Force a refresh of statistics from storage } = {}): Promise<{ nounCount: number verbCount: number @@ -2025,6 +2262,11 @@ export class BrainyData implements BrainyDataInterface { await this.ensureInitialized() try { + // If forceRefresh is true, flush statistics to storage first + if (options.forceRefresh && this.storage) { + await this.storage.flushStatisticsToStorage() + } + // Get statistics from storage const stats = await this.storage!.getStatistics() @@ -2808,6 +3050,9 @@ export class BrainyData implements BrainyDataInterface { */ public async shutDown(): Promise { try { + // Stop real-time updates if they're running + this.stopRealtimeUpdates() + // Flush statistics to ensure they're saved before shutting down if (this.storage && this.isInitialized) { try { diff --git a/test-results.json b/test-results.json index 0dd0ff15..f19f5cf1 100644 --- a/test-results.json +++ b/test-results.json @@ -1 +1 @@ -{"numTotalTestSuites":93,"numPassedTestSuites":93,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":196,"numPassedTests":178,"numFailedTests":0,"numPendingTests":18,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1753742330427,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["API Integration Tests"],"fullName":"API Integration Tests should insert text and then find it via search","status":"passed","title":"should insert text and then find it via search","duration":520.9845370000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Integration Tests"],"fullName":"API Integration Tests should handle vector mismatches and HNSW index correctly","status":"passed","title":"should handle vector mismatches and HNSW index correctly","duration":2021.6997279999996,"failureMessages":[],"meta":{}}],"startTime":1753742343490,"endTime":1753742346032.6997,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/api-integration.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export BrainyData class","status":"passed","title":"should export BrainyData class","duration":0.9310390000000552,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export environment detection functions","status":"passed","title":"should export environment detection functions","duration":0.32469300000002477,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export embedding function creator","status":"passed","title":"should export embedding function creator","duration":0.12832799999978306,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export environment object","status":"passed","title":"should export environment object","duration":0.3856359999999768,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should create instance with minimal configuration","status":"passed","title":"should create instance with minimal configuration","duration":0.20535199999994802,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should create instance with full configuration","status":"passed","title":"should create instance with full configuration","duration":0.1988189999997303,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should not throw with valid configuration parameters","status":"passed","title":"should not throw with valid configuration parameters","duration":0.8249919999998383,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should use default values for optional parameters","status":"passed","title":"should use default values for optional parameters","duration":0.25565499999993335,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle vector addition and search","status":"passed","title":"should handle vector addition and search","duration":12197.57739,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle batch vector operations","status":"passed","title":"should handle batch vector operations","duration":2.4622140000010404,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle different distance metrics","status":"passed","title":"should handle different distance metrics","duration":2.434422000000268,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Text Processing"],"fullName":"Brainy Core Functionality Text Processing should handle text items with embedding function","status":"passed","title":"should handle text items with embedding function","duration":0.8579329999993206,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Text Processing"],"fullName":"Brainy Core Functionality Text Processing should handle mixed vector and text operations","status":"passed","title":"should handle mixed vector and text operations","duration":1.543376999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle invalid vector dimensions","status":"passed","title":"should handle invalid vector dimensions","duration":1.3833400000003166,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle search before initialization","status":"passed","title":"should handle search before initialization","duration":0.14752399999997579,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle empty search results gracefully","status":"passed","title":"should handle empty search results gracefully","duration":1.10258900000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Performance and Scalability"],"fullName":"Brainy Core Functionality Performance and Scalability should handle moderate number of vectors efficiently","status":"passed","title":"should handle moderate number of vectors efficiently","duration":204.96901100000105,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Performance and Scalability"],"fullName":"Brainy Core Functionality Performance and Scalability should maintain search quality with more data","status":"passed","title":"should maintain search quality with more data","duration":412.3312989999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Database Statistics"],"fullName":"Brainy Core Functionality Database Statistics should provide accurate statistics about the database","status":"passed","title":"should provide accurate statistics about the database","duration":211.68933600000128,"failureMessages":[],"meta":{}}],"startTime":1753742332615,"endTime":1753742345655.6895,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/core.test.ts"},{"assertionResults":[{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should initialize and return database status","status":"passed","title":"should initialize and return database status","duration":10506.395895999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should return statistics","status":"passed","title":"should return statistics","duration":3.990493000001152,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should retrieve all nouns","status":"passed","title":"should retrieve all nouns","duration":2.9080620000004274,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should retrieve all verbs","status":"passed","title":"should retrieve all verbs","duration":4.8012089999992895,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should perform a search operation","status":"passed","title":"should perform a search operation","duration":1.8005549999998038,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should add and retrieve an item","status":"passed","title":"should add and retrieve an item","duration":4.633498000001055,"failureMessages":[],"meta":{}}],"startTime":1753742333253,"endTime":1753742343777.6335,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/database-operations.test.ts"},{"assertionResults":[{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should initialize BrainyData with 512 dimensions","status":"passed","title":"should initialize BrainyData with 512 dimensions","duration":10395.857874000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should reject vectors with incorrect dimensions","status":"passed","title":"should reject vectors with incorrect dimensions","duration":1.6182560000015656,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should successfully embed text to 512 dimensions","status":"passed","title":"should successfully embed text to 512 dimensions","duration":3.3216099999990547,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should directly embed text to 512 dimensions","status":"passed","title":"should directly embed text to 512 dimensions","duration":1.0925999999999476,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should use the default dimensions regardless of configuration","status":"passed","title":"should use the default dimensions regardless of configuration","duration":1.4047690000006696,"failureMessages":[],"meta":{}}],"startTime":1753742333252,"endTime":1753742343655.4048,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/dimension-standardization.test.ts"},{"assertionResults":[{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty string in add()","status":"passed","title":"should handle empty string in add()","duration":10196.936527999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty string in search()","status":"passed","title":"should handle empty string in search()","duration":1.5463030000009894,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty metadata in add()","status":"passed","title":"should handle empty metadata in add()","duration":0.6975949999996374,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty array in addBatch()","status":"passed","title":"should handle empty array in addBatch()","duration":0.3205660000003263,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with special characters","status":"passed","title":"should handle text with special characters","duration":0.5902560000013182,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with emoji","status":"passed","title":"should handle text with emoji","duration":0.5313769999993383,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with HTML tags","status":"passed","title":"should handle text with HTML tags","duration":0.5090260000015405,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very large k in search()","status":"passed","title":"should handle very large k in search()","duration":3.2848419999991165,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very long text","status":"passed","title":"should handle very long text","duration":3.0158429999992222,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very large metadata","status":"passed","title":"should handle very large metadata","duration":0.9370709999984683,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with very small values","status":"passed","title":"should handle vectors with very small values","duration":0.36614000000008673,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with very large values","status":"passed","title":"should handle vectors with very large values","duration":0.32636700000148267,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with mixed positive and negative values","status":"passed","title":"should handle vectors with mixed positive and negative values","duration":0.5186430000012479,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","ID edge cases"],"fullName":"Edge Case Tests ID edge cases should handle custom IDs with special characters","status":"passed","title":"should handle custom IDs with special characters","duration":0.30739100000027975,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","ID edge cases"],"fullName":"Edge Case Tests ID edge cases should handle very long custom IDs","status":"passed","title":"should handle very long custom IDs","duration":0.2579089999999269,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Batch operations edge cases"],"fullName":"Edge Case Tests Batch operations edge cases should handle mixed content types in addBatch()","status":"passed","title":"should handle mixed content types in addBatch()","duration":12196.026784999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Batch operations edge cases"],"fullName":"Edge Case Tests Batch operations edge cases should handle large batch sizes","status":"passed","title":"should handle large batch sizes","duration":2856.814961,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Relationship edge cases"],"fullName":"Edge Case Tests Relationship edge cases should handle multiple relationships between the same nodes","status":"passed","title":"should handle multiple relationships between the same nodes","duration":1.1878560000004654,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Relationship edge cases"],"fullName":"Edge Case Tests Relationship edge cases should handle circular relationships","status":"passed","title":"should handle circular relationships","duration":0.49677300000257674,"failureMessages":[],"meta":{}}],"startTime":1753742333253,"endTime":1753742358518.4968,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/edge-cases.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy in Browser Environment","Library Loading"],"fullName":"Brainy in Browser Environment Library Loading should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":0.6641429999999673,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Library Loading"],"fullName":"Brainy in Browser Environment Library Loading should detect browser environment correctly","status":"passed","title":"should detect browser environment correctly","duration":0.16545700000006036,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should create database and add vector data","status":"passed","title":"should create database and add vector data","duration":10869.282048000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should handle text data with embeddings","status":"passed","title":"should handle text data with embeddings","duration":1.4668750000000728,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should handle multiple data types","status":"passed","title":"should handle multiple data types","duration":2.3533909999987372,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Error Handling"],"fullName":"Brainy in Browser Environment Error Handling should not throw with valid configuration","status":"passed","title":"should not throw with valid configuration","duration":0.5751479999998992,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Error Handling"],"fullName":"Brainy in Browser Environment Error Handling should handle search on empty database","status":"passed","title":"should handle search on empty database","duration":0.3098260000006121,"failureMessages":[],"meta":{}}],"startTime":1753742333588,"endTime":1753742344463.3098,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/environment.browser.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy in Node.js Environment","Library Loading"],"fullName":"Brainy in Node.js Environment Library Loading should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":0.7275719999997818,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Library Loading"],"fullName":"Brainy in Node.js Environment Library Loading should detect Node.js environment correctly","status":"passed","title":"should detect Node.js environment correctly","duration":0.1378859999999804,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should create database and add vector data","status":"passed","title":"should create database and add vector data","duration":11239.205898999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should handle text data with embeddings","status":"passed","title":"should handle text data with embeddings","duration":1.2467759999999544,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should handle multiple data types","status":"passed","title":"should handle multiple data types","duration":0.8253029999996215,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Error Handling"],"fullName":"Brainy in Node.js Environment Error Handling should not throw with valid configuration","status":"passed","title":"should not throw with valid configuration","duration":0.46587499999986903,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Error Handling"],"fullName":"Brainy in Node.js Environment Error Handling should handle search on empty database","status":"passed","title":"should handle search on empty database","duration":0.2083679999996093,"failureMessages":[],"meta":{}}],"startTime":1753742332635,"endTime":1753742343878.2083,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/environment.node.test.ts"},{"assertionResults":[{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject null input","status":"passed","title":"should reject null input","duration":10404.765792,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject undefined input","status":"passed","title":"should reject undefined input","duration":0.34994000000006054,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should handle empty string input","status":"passed","title":"should handle empty string input","duration":1.179761999999755,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject invalid vector dimensions","status":"passed","title":"should reject invalid vector dimensions","duration":0.5415759999996226,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject non-numeric vector values","status":"passed","title":"should reject non-numeric vector values","duration":0.4116439999997965,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.5258969999995315,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject null query","status":"passed","title":"should reject null query","duration":0.3485579999996844,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject undefined query","status":"passed","title":"should reject undefined query","duration":0.4480020000009972,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should handle empty string query","status":"passed","title":"should handle empty string query","duration":0.6895709999989776,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject invalid k parameter","status":"passed","title":"should reject invalid k parameter","duration":0.6379649999998946,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject invalid vector dimensions in query","status":"passed","title":"should reject invalid vector dimensions in query","duration":1.2938240000003134,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.1970659999988129,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.22785300000032294,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.23606899999867892,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.26566300000013143,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.24672800000007555,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.21350600000005215,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.4486029999989114,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.4307200000002922,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.21042099999976926,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.20882799999890267,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject null metadata","status":"passed","title":"should reject null metadata","duration":0.31732000000010885,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.3885919999993348,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle non-existent source ID","status":"skipped","title":"should handle non-existent source ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle non-existent target ID","status":"skipped","title":"should handle non-existent target ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null source ID","status":"skipped","title":"should reject null source ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null target ID","status":"skipped","title":"should reject null target ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null relation type","status":"skipped","title":"should reject null relation type","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle read-only mode","status":"skipped","title":"should handle read-only mode","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","Storage failure handling"],"fullName":"Error Handling Tests Storage failure handling should handle storage initialization failure","status":"skipped","title":"should handle storage initialization failure","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","Storage failure handling"],"fullName":"Error Handling Tests Storage failure handling should handle storage save failure","status":"skipped","title":"should handle storage save failure","failureMessages":[],"meta":{}}],"startTime":1753742333250,"endTime":1753742343665.3887,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/error-handling.test.ts"},{"assertionResults":[{"ancestorTitles":["Multi-Environment Tests","Environment Detection"],"fullName":"Multi-Environment Tests Environment Detection should correctly detect the current environment","status":"passed","title":"should correctly detect the current environment","duration":10320.581988,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Environment Detection"],"fullName":"Multi-Environment Tests Environment Detection should detect threading availability","status":"passed","title":"should detect threading availability","duration":5.044531000001371,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Node.js Environment"],"fullName":"Multi-Environment Tests Node.js Environment should use FileSystem storage by default in Node.js","status":"passed","title":"should use FileSystem storage by default in Node.js","duration":3.3872520000004442,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Node.js Environment"],"fullName":"Multi-Environment Tests Node.js Environment should handle Worker Threads if available","status":"passed","title":"should handle Worker Threads if available","duration":0.46782899999925576,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Browser Environment"],"fullName":"Multi-Environment Tests Browser Environment should detect browser environment correctly","status":"passed","title":"should detect browser environment correctly","duration":0.8578729999990173,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Browser Environment"],"fullName":"Multi-Environment Tests Browser Environment should prefer OPFS storage in browser if available","status":"passed","title":"should prefer OPFS storage in browser if available","duration":2.606993000001239,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Web Worker Environment"],"fullName":"Multi-Environment Tests Web Worker Environment should detect Web Worker environment correctly","status":"passed","title":"should detect Web Worker environment correctly","duration":0.34515099999953236,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Cross-Environment Data Compatibility"],"fullName":"Multi-Environment Tests Cross-Environment Data Compatibility should create compatible vector formats across environments","status":"passed","title":"should create compatible vector formats across environments","duration":2.2944119999992836,"failureMessages":[],"meta":{}}],"startTime":1753742333251,"endTime":1753742343586.2944,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/multi-environment.test.ts"},{"assertionResults":[{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should detect OPFS availability correctly","status":"passed","title":"should detect OPFS availability correctly","duration":225.54839000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should initialize and perform basic operations with OPFS storage","status":"passed","title":"should initialize and perform basic operations with OPFS storage","duration":1.618910000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle noun operations correctly","status":"passed","title":"should handle noun operations correctly","duration":2.000628000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle verb operations correctly","status":"passed","title":"should handle verb operations correctly","duration":2.1533430000000635,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle storage status correctly","status":"passed","title":"should handle storage status correctly","duration":2.8214839999999413,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle persistence correctly","status":"passed","title":"should handle persistence correctly","duration":0.6016290000000026,"failureMessages":[],"meta":{}}],"startTime":1753742330871,"endTime":1753742331105.6016,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/opfs-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Package Size Breakdown"],"fullName":"Package Size Breakdown should report the estimated package size and largest files","status":"passed","title":"should report the estimated package size and largest files","duration":1011.628441,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Breakdown"],"fullName":"Package Size Breakdown should identify files that contribute significantly to package size","status":"passed","title":"should identify files that contribute significantly to package size","duration":1185.2961409999998,"failureMessages":[],"meta":{}}],"startTime":1753742330846,"endTime":1753742333043.2961,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/package-size-breakdown.test.ts"},{"assertionResults":[{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should not exceed unpacked size threshold for npm package","status":"passed","title":"should not exceed unpacked size threshold for npm package","duration":13017.282762,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should not exceed packed size threshold for npm package","status":"passed","title":"should not exceed packed size threshold for npm package","duration":0.5507330000000366,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should report package composition details","status":"passed","title":"should report package composition details","duration":0.581159999999727,"failureMessages":[],"meta":{}}],"startTime":1753742330795,"endTime":1753742343813.581,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/package-size-limit.test.ts"},{"assertionResults":[{"ancestorTitles":["Performance Tests","Small Dataset (10-100 items)"],"fullName":"Performance Tests Small Dataset (10-100 items) should add items efficiently","status":"passed","title":"should add items efficiently","duration":22498.991048,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Small Dataset (10-100 items)"],"fullName":"Performance Tests Small Dataset (10-100 items) should search efficiently","status":"passed","title":"should search efficiently","duration":1370.917906999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should add items efficiently","status":"passed","title":"should add items efficiently","duration":5565.118351000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should search efficiently","status":"passed","title":"should search efficiently","duration":5551.972111000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should handle multiple concurrent searches efficiently","status":"passed","title":"should handle multiple concurrent searches efficiently","duration":5493.367861999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should add items efficiently","status":"skipped","title":"should add items efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should search efficiently","status":"skipped","title":"should search efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should handle multiple concurrent searches efficiently","status":"skipped","title":"should handle multiple concurrent searches efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Performance Scaling"],"fullName":"Performance Tests Performance Scaling should demonstrate search performance scaling with dataset size","status":"passed","title":"should demonstrate search performance scaling with dataset size","duration":4189.398925999994,"failureMessages":[],"meta":{}}],"startTime":1753742333251,"endTime":1753742377921.399,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/performance.test.ts"},{"assertionResults":[{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should initialize S3CompatibleStorage correctly","status":"passed","title":"should initialize S3CompatibleStorage correctly","duration":226.75138599999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should initialize R2Storage correctly","status":"passed","title":"should initialize R2Storage correctly","duration":2.7376290000000836,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should perform basic metadata operations with S3 storage","status":"passed","title":"should perform basic metadata operations with S3 storage","duration":821.697133,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle noun operations correctly with S3 storage","status":"passed","title":"should handle noun operations correctly with S3 storage","duration":127.9076869999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle verb operations correctly with S3 storage","status":"passed","title":"should handle verb operations correctly with S3 storage","duration":38.040526,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle storage status correctly with S3 storage","status":"passed","title":"should handle storage status correctly with S3 storage","duration":20.303866999999855,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle multiple objects and pagination with S3 storage","status":"passed","title":"should handle multiple objects and pagination with S3 storage","duration":50.70002199999999,"failureMessages":[],"meta":{}}],"startTime":1753742330874,"endTime":1753742332162.7,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/s3-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Specialized Scenarios Tests","Read-Only Mode"],"fullName":"Specialized Scenarios Tests Read-Only Mode should enforce read-only mode for all write operations","status":"passed","title":"should enforce read-only mode for all write operations","duration":10374.487506000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Read-Only Mode"],"fullName":"Specialized Scenarios Tests Read-Only Mode should allow setting read-only mode during initialization","status":"passed","title":"should allow setting read-only mode during initialization","duration":0.48489100000006147,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should create and query relationships between items","status":"passed","title":"should create and query relationships between items","duration":1.1857529999997496,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should handle multiple relationship types","status":"passed","title":"should handle multiple relationship types","duration":2.2920580000009068,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should handle bidirectional relationships","status":"passed","title":"should handle bidirectional relationships","duration":1.6303189999998722,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should store and retrieve metadata in add operations","status":"passed","title":"should store and retrieve metadata in add operations","duration":0.7169210000010935,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should store and retrieve metadata in relate operations","status":"passed","title":"should store and retrieve metadata in relate operations","duration":0.8680719999993016,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should update metadata correctly","status":"passed","title":"should update metadata correctly","duration":0.4075570000004518,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should handle metadata in search results","status":"passed","title":"should handle metadata in search results","duration":1.0802669999993668,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should track and report statistics","status":"passed","title":"should track and report statistics","duration":1.22700900000018,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should flush statistics","status":"passed","title":"should flush statistics","duration":0.4706239999995887,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should track database size","status":"passed","title":"should track database size","duration":0.9096800000006624,"failureMessages":[],"meta":{}}],"startTime":1753742333252,"endTime":1753742343638.9097,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/specialized-scenarios.test.ts"},{"assertionResults":[{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should save statistics data","status":"skipped","title":"should save statistics data","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should retrieve statistics data after batch update completes","status":"skipped","title":"should retrieve statistics data after batch update completes","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should store statistics in time-partitioned files","status":"skipped","title":"should store statistics in time-partitioned files","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should maintain backward compatibility with legacy statistics file","status":"skipped","title":"should maintain backward compatibility with legacy statistics file","failureMessages":[],"meta":{}}],"startTime":1753742330427,"endTime":1753742330427,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/statistics-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy Statistics Functionality","Library Exports"],"fullName":"Brainy Statistics Functionality Library Exports should export getStatistics function at the root level","status":"passed","title":"should export getStatistics function at the root level","duration":1.2935019999999895,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should retrieve statistics from a BrainyData instance","status":"passed","title":"should retrieve statistics from a BrainyData instance","duration":11257.07322,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should throw an error when no instance is provided","status":"passed","title":"should throw an error when no instance is provided","duration":0.7631970000002184,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should match the instance method results","status":"passed","title":"should match the instance method results","duration":2.303068000001076,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should track statistics by service","status":"passed","title":"should track statistics by service","duration":5.764127999998891,"failureMessages":[],"meta":{}}],"startTime":1753742332615,"endTime":1753742343882.7642,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/statistics.test.ts"},{"assertionResults":[{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should add and retrieve items","status":"passed","title":"should add and retrieve items","duration":10306.537377999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should search for items","status":"passed","title":"should search for items","duration":2.8058430000000953,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should delete items","status":"passed","title":"should delete items","duration":0.6262139999998908,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should update metadata","status":"passed","title":"should update metadata","duration":0.4841789999991306,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should handle batch operations","status":"passed","title":"should handle batch operations","duration":11943.828597,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should handle relationships","status":"passed","title":"should handle relationships","duration":1.4844080000002577,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should enforce read-only mode","status":"passed","title":"should enforce read-only mode","duration":1.0239719999990484,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should get statistics","status":"passed","title":"should get statistics","duration":0.5801080000019283,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should backup and restore data","status":"passed","title":"should backup and restore data","duration":0.9972730000008596,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should add and retrieve items","status":"passed","title":"should add and retrieve items","duration":3.7348779999992985,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should search for items","status":"passed","title":"should search for items","duration":3.4968259999986913,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should delete items","status":"passed","title":"should delete items","duration":2.286016000001837,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should update metadata","status":"passed","title":"should update metadata","duration":12.861332000000402,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should handle batch operations","status":"passed","title":"should handle batch operations","duration":145.97086599999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should handle relationships","status":"passed","title":"should handle relationships","duration":2.1571970000004512,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should enforce read-only mode","status":"passed","title":"should enforce read-only mode","duration":1.1532329999972717,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should get statistics","status":"passed","title":"should get statistics","duration":1.493944999998348,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should backup and restore data","status":"passed","title":"should backup and restore data","duration":2.39085200000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","S3-Compatible Storage Tests"],"fullName":"Storage Adapter Coverage Tests S3-Compatible Storage Tests would test S3 storage operations if properly configured","status":"skipped","title":"would test S3 storage operations if properly configured","failureMessages":[],"meta":{}}],"startTime":1753742333253,"endTime":1753742355687.3909,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/storage-adapter-coverage.test.ts"},{"assertionResults":[{"ancestorTitles":["Storage Adapters","MemoryStorage"],"fullName":"Storage Adapters MemoryStorage should create and initialize MemoryStorage","status":"passed","title":"should create and initialize MemoryStorage","duration":2469.233325,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","FileSystemStorage in Node.js"],"fullName":"Storage Adapters FileSystemStorage in Node.js should create and initialize FileSystemStorage in Node.js environment","status":"passed","title":"should create and initialize FileSystemStorage in Node.js environment","duration":3.521060000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","FileSystemStorage in Node.js"],"fullName":"Storage Adapters FileSystemStorage in Node.js should handle file system operations correctly","status":"passed","title":"should handle file system operations correctly","duration":3.523385999999846,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","OPFSStorage in Browser"],"fullName":"Storage Adapters OPFSStorage in Browser should detect OPFS availability correctly","status":"passed","title":"should detect OPFS availability correctly","duration":1.3457300000000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","OPFSStorage in Browser"],"fullName":"Storage Adapters OPFSStorage in Browser should initialize and perform basic operations with OPFS storage","status":"passed","title":"should initialize and perform basic operations with OPFS storage","duration":0.5800779999999577,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select MemoryStorage when forceMemoryStorage is true","status":"passed","title":"should select MemoryStorage when forceMemoryStorage is true","duration":0.5723930000003747,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select FileSystemStorage when forceFileSystemStorage is true","status":"passed","title":"should select FileSystemStorage when forceFileSystemStorage is true","duration":0.35309500000039407,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select MemoryStorage when type is memory","status":"passed","title":"should select MemoryStorage when type is memory","duration":0.25228900000001886,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select FileSystemStorage when type is filesystem","status":"passed","title":"should select FileSystemStorage when type is filesystem","duration":0.24186999999983527,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should select FileSystemStorage in Node.js environment","status":"passed","title":"should select FileSystemStorage in Node.js environment","duration":0.2539120000001276,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should select OPFS in browser environment if available","status":"passed","title":"should select OPFS in browser environment if available","duration":0.30846299999984694,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should fall back to MemoryStorage when OPFS is not available in browser","status":"passed","title":"should fall back to MemoryStorage when OPFS is not available in browser","duration":0.24523499999986598,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","S3CompatibleStorage"],"fullName":"Storage Adapters S3CompatibleStorage should create and initialize S3CompatibleStorage","status":"skipped","title":"should create and initialize S3CompatibleStorage","failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","S3CompatibleStorage"],"fullName":"Storage Adapters S3CompatibleStorage should create and initialize R2Storage","status":"skipped","title":"should create and initialize R2Storage","failureMessages":[],"meta":{}}],"startTime":1753742330799,"endTime":1753742333280.245,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/storage-adapters.test.ts"},{"assertionResults":[{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should have TextEncoder and TextDecoder available in Node.js environment","status":"passed","title":"should have TextEncoder and TextDecoder available in Node.js environment","duration":1.1863449999999602,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should apply TensorFlow patch and make globals available","status":"passed","title":"should apply TensorFlow patch and make globals available","duration":81.47588400000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should load brainy library successfully with patch applied","status":"passed","title":"should load brainy library successfully with patch applied","duration":1755.877981,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should load TensorFlow.js directly after patch is applied","status":"passed","title":"should load TensorFlow.js directly after patch is applied","duration":673.0061879999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should handle patch application multiple times safely","status":"passed","title":"should handle patch application multiple times safely","duration":5.8409200000000965,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should verify patch works with brainy library initialization","status":"passed","title":"should verify patch works with brainy library initialization","duration":1.4274619999996503,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should maintain compatibility with different module systems","status":"passed","title":"should maintain compatibility with different module systems","duration":46.825053000000025,"failureMessages":[],"meta":{}}],"startTime":1753742330789,"endTime":1753742333354.825,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/tensorflow-patch.test.ts"},{"assertionResults":[{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":1755.9790229999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should create and initialize BrainyData instance","status":"passed","title":"should create and initialize BrainyData instance","duration":13128.419923,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should handle simple vector operations","status":"passed","title":"should handle simple vector operations","duration":10.920607000000018,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should handle multiple vector searches correctly","status":"passed","title":"should handle multiple vector searches correctly","duration":4.275110999999015,"failureMessages":[],"meta":{}}],"startTime":1753742330869,"endTime":1753742345768.2751,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/vector-operations.test.ts"}]} \ No newline at end of file +{"numTotalTestSuites":93,"numPassedTestSuites":93,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":196,"numPassedTests":178,"numFailedTests":0,"numPendingTests":18,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1753744794248,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["API Integration Tests"],"fullName":"API Integration Tests should insert text and then find it via search","status":"passed","title":"should insert text and then find it via search","duration":525.2382969999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Integration Tests"],"fullName":"API Integration Tests should handle vector mismatches and HNSW index correctly","status":"passed","title":"should handle vector mismatches and HNSW index correctly","duration":2029.021075999999,"failureMessages":[],"meta":{}}],"startTime":1753744806114,"endTime":1753744808668.021,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/api-integration.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export BrainyData class","status":"passed","title":"should export BrainyData class","duration":1.121906000000081,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export environment detection functions","status":"passed","title":"should export environment detection functions","duration":0.324053000000049,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export embedding function creator","status":"passed","title":"should export embedding function creator","duration":0.10843199999999342,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Library Exports"],"fullName":"Brainy Core Functionality Library Exports should export environment object","status":"passed","title":"should export environment object","duration":0.3589070000000447,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should create instance with minimal configuration","status":"passed","title":"should create instance with minimal configuration","duration":0.16441600000007384,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should create instance with full configuration","status":"passed","title":"should create instance with full configuration","duration":0.14514899999994668,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should not throw with valid configuration parameters","status":"passed","title":"should not throw with valid configuration parameters","duration":0.6727210000001378,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","BrainyData Configuration"],"fullName":"Brainy Core Functionality BrainyData Configuration should use default values for optional parameters","status":"passed","title":"should use default values for optional parameters","duration":0.15748299999995652,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle vector addition and search","status":"passed","title":"should handle vector addition and search","duration":9964.140188000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle batch vector operations","status":"passed","title":"should handle batch vector operations","duration":4.284646000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Vector Operations"],"fullName":"Brainy Core Functionality Vector Operations should handle different distance metrics","status":"passed","title":"should handle different distance metrics","duration":5.214826000001267,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Text Processing"],"fullName":"Brainy Core Functionality Text Processing should handle text items with embedding function","status":"passed","title":"should handle text items with embedding function","duration":1.480743000000075,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Text Processing"],"fullName":"Brainy Core Functionality Text Processing should handle mixed vector and text operations","status":"passed","title":"should handle mixed vector and text operations","duration":2.747889000000214,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle invalid vector dimensions","status":"passed","title":"should handle invalid vector dimensions","duration":1.854789000000892,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle search before initialization","status":"passed","title":"should handle search before initialization","duration":0.212374999999156,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Error Handling"],"fullName":"Brainy Core Functionality Error Handling should handle empty search results gracefully","status":"passed","title":"should handle empty search results gracefully","duration":1.8902649999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Performance and Scalability"],"fullName":"Brainy Core Functionality Performance and Scalability should handle moderate number of vectors efficiently","status":"passed","title":"should handle moderate number of vectors efficiently","duration":283.7571449999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Performance and Scalability"],"fullName":"Brainy Core Functionality Performance and Scalability should maintain search quality with more data","status":"passed","title":"should maintain search quality with more data","duration":469.30079099999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Core Functionality","Database Statistics"],"fullName":"Brainy Core Functionality Database Statistics should provide accurate statistics about the database","status":"passed","title":"should provide accurate statistics about the database","duration":214.27610800000002,"failureMessages":[],"meta":{}}],"startTime":1753744796140,"endTime":1753744807093.2761,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/core.test.ts"},{"assertionResults":[{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should initialize and return database status","status":"passed","title":"should initialize and return database status","duration":9765.691932,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should return statistics","status":"passed","title":"should return statistics","duration":106.76592099999834,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should retrieve all nouns","status":"passed","title":"should retrieve all nouns","duration":54.486658000001626,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should retrieve all verbs","status":"passed","title":"should retrieve all verbs","duration":79.87730700000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should perform a search operation","status":"passed","title":"should perform a search operation","duration":113.44831700000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["Database Operations"],"fullName":"Database Operations should add and retrieve an item","status":"passed","title":"should add and retrieve an item","duration":173.88883499999974,"failureMessages":[],"meta":{}}],"startTime":1753744796777,"endTime":1753744807071.889,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/database-operations.test.ts"},{"assertionResults":[{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should initialize BrainyData with 512 dimensions","status":"passed","title":"should initialize BrainyData with 512 dimensions","duration":9830.984221,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should reject vectors with incorrect dimensions","status":"passed","title":"should reject vectors with incorrect dimensions","duration":5.840829999999187,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should successfully embed text to 512 dimensions","status":"passed","title":"should successfully embed text to 512 dimensions","duration":33.979307999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should directly embed text to 512 dimensions","status":"passed","title":"should directly embed text to 512 dimensions","duration":52.789693000000625,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Dimension Standardization"],"fullName":"Vector Dimension Standardization should use the default dimensions regardless of configuration","status":"passed","title":"should use the default dimensions regardless of configuration","duration":89.56872699999985,"failureMessages":[],"meta":{}}],"startTime":1753744796776,"endTime":1753744806789.5688,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/dimension-standardization.test.ts"},{"assertionResults":[{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty string in add()","status":"passed","title":"should handle empty string in add()","duration":9495.006741,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty string in search()","status":"passed","title":"should handle empty string in search()","duration":1.727853000000323,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty metadata in add()","status":"passed","title":"should handle empty metadata in add()","duration":0.7387239999989106,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Empty inputs"],"fullName":"Edge Case Tests Empty inputs should handle empty array in addBatch()","status":"passed","title":"should handle empty array in addBatch()","duration":0.37435700000060024,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with special characters","status":"passed","title":"should handle text with special characters","duration":0.6647159999993164,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with emoji","status":"passed","title":"should handle text with emoji","duration":0.7306189999999333,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Special characters"],"fullName":"Edge Case Tests Special characters should handle text with HTML tags","status":"passed","title":"should handle text with HTML tags","duration":0.5602419999995618,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very large k in search()","status":"passed","title":"should handle very large k in search()","duration":3.4366600000012113,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very long text","status":"passed","title":"should handle very long text","duration":3.438233000000764,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Boundary values"],"fullName":"Edge Case Tests Boundary values should handle very large metadata","status":"passed","title":"should handle very large metadata","duration":1.142162999998618,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with very small values","status":"passed","title":"should handle vectors with very small values","duration":0.38958399999864923,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with very large values","status":"passed","title":"should handle vectors with very large values","duration":0.3961569999992207,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Vector edge cases"],"fullName":"Edge Case Tests Vector edge cases should handle vectors with mixed positive and negative values","status":"passed","title":"should handle vectors with mixed positive and negative values","duration":0.6467229999998381,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","ID edge cases"],"fullName":"Edge Case Tests ID edge cases should handle custom IDs with special characters","status":"passed","title":"should handle custom IDs with special characters","duration":0.37328399999933026,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","ID edge cases"],"fullName":"Edge Case Tests ID edge cases should handle very long custom IDs","status":"passed","title":"should handle very long custom IDs","duration":0.29693200000110664,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Batch operations edge cases"],"fullName":"Edge Case Tests Batch operations edge cases should handle mixed content types in addBatch()","status":"passed","title":"should handle mixed content types in addBatch()","duration":10759.01153,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Batch operations edge cases"],"fullName":"Edge Case Tests Batch operations edge cases should handle large batch sizes","status":"passed","title":"should handle large batch sizes","duration":2631.9310750000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Relationship edge cases"],"fullName":"Edge Case Tests Relationship edge cases should handle multiple relationships between the same nodes","status":"passed","title":"should handle multiple relationships between the same nodes","duration":1.3572130000029574,"failureMessages":[],"meta":{}},{"ancestorTitles":["Edge Case Tests","Relationship edge cases"],"fullName":"Edge Case Tests Relationship edge cases should handle circular relationships","status":"passed","title":"should handle circular relationships","duration":0.527379999999539,"failureMessages":[],"meta":{}}],"startTime":1753744796776,"endTime":1753744819679.5273,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/edge-cases.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy in Browser Environment","Library Loading"],"fullName":"Brainy in Browser Environment Library Loading should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":0.6660089999995762,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Library Loading"],"fullName":"Brainy in Browser Environment Library Loading should detect browser environment correctly","status":"passed","title":"should detect browser environment correctly","duration":0.1318850000002385,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should create database and add vector data","status":"passed","title":"should create database and add vector data","duration":8908.909956,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should handle text data with embeddings","status":"passed","title":"should handle text data with embeddings","duration":1.5563540000002831,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Browser Environment Core Functionality - Add Data and Search should handle multiple data types","status":"passed","title":"should handle multiple data types","duration":1.488918000000922,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Error Handling"],"fullName":"Brainy in Browser Environment Error Handling should not throw with valid configuration","status":"passed","title":"should not throw with valid configuration","duration":0.659124999998312,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Browser Environment","Error Handling"],"fullName":"Brainy in Browser Environment Error Handling should handle search on empty database","status":"passed","title":"should handle search on empty database","duration":0.3047069999993255,"failureMessages":[],"meta":{}}],"startTime":1753744797062,"endTime":1753744805976.3047,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/environment.browser.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy in Node.js Environment","Library Loading"],"fullName":"Brainy in Node.js Environment Library Loading should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":0.8155269999999746,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Library Loading"],"fullName":"Brainy in Node.js Environment Library Loading should detect Node.js environment correctly","status":"passed","title":"should detect Node.js environment correctly","duration":0.1374959999998282,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should create database and add vector data","status":"passed","title":"should create database and add vector data","duration":10521.75402,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should handle text data with embeddings","status":"passed","title":"should handle text data with embeddings","duration":194.098261000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Core Functionality - Add Data and Search"],"fullName":"Brainy in Node.js Environment Core Functionality - Add Data and Search should handle multiple data types","status":"passed","title":"should handle multiple data types","duration":1.23196100000132,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Error Handling"],"fullName":"Brainy in Node.js Environment Error Handling should not throw with valid configuration","status":"passed","title":"should not throw with valid configuration","duration":0.49474999999983993,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy in Node.js Environment","Error Handling"],"fullName":"Brainy in Node.js Environment Error Handling should handle search on empty database","status":"passed","title":"should handle search on empty database","duration":0.2240670000010141,"failureMessages":[],"meta":{}}],"startTime":1753744796185,"endTime":1753744806904.4946,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/environment.node.test.ts"},{"assertionResults":[{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject null input","status":"passed","title":"should reject null input","duration":9287.047648,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject undefined input","status":"passed","title":"should reject undefined input","duration":0.48136499999964144,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should handle empty string input","status":"passed","title":"should handle empty string input","duration":1.7805609999995795,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject invalid vector dimensions","status":"passed","title":"should reject invalid vector dimensions","duration":0.5805999999993219,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should reject non-numeric vector values","status":"passed","title":"should reject non-numeric vector values","duration":0.6795940000010887,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","add() method error handling"],"fullName":"Error Handling Tests add() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.7817430000013701,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject null query","status":"passed","title":"should reject null query","duration":0.3867500000014843,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject undefined query","status":"passed","title":"should reject undefined query","duration":0.35901799999919604,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should handle empty string query","status":"passed","title":"should handle empty string query","duration":0.7863820000002306,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject invalid k parameter","status":"passed","title":"should reject invalid k parameter","duration":0.7684690000005503,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","search() method error handling"],"fullName":"Error Handling Tests search() method error handling should reject invalid vector dimensions in query","status":"passed","title":"should reject invalid vector dimensions in query","duration":1.6255519999995158,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.2167730000001029,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.2553750000006403,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","get() method error handling"],"fullName":"Error Handling Tests get() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.2386530000003404,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.3265670000000682,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.2676769999998214,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.2209710000006453,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","delete() method error handling"],"fullName":"Error Handling Tests delete() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.4826969999994617,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should handle non-existent ID","status":"passed","title":"should handle non-existent ID","duration":0.49871800000073563,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject null ID","status":"passed","title":"should reject null ID","duration":0.2525100000002567,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject undefined ID","status":"passed","title":"should reject undefined ID","duration":0.2257000000008702,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should reject null metadata","status":"passed","title":"should reject null metadata","duration":0.34735600000021805,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","updateMetadata() method error handling"],"fullName":"Error Handling Tests updateMetadata() method error handling should handle read-only mode","status":"passed","title":"should handle read-only mode","duration":0.44514800000069954,"failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle non-existent source ID","status":"skipped","title":"should handle non-existent source ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle non-existent target ID","status":"skipped","title":"should handle non-existent target ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null source ID","status":"skipped","title":"should reject null source ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null target ID","status":"skipped","title":"should reject null target ID","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should reject null relation type","status":"skipped","title":"should reject null relation type","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","relate() method error handling"],"fullName":"Error Handling Tests relate() method error handling should handle read-only mode","status":"skipped","title":"should handle read-only mode","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","Storage failure handling"],"fullName":"Error Handling Tests Storage failure handling should handle storage initialization failure","status":"skipped","title":"should handle storage initialization failure","failureMessages":[],"meta":{}},{"ancestorTitles":["Error Handling Tests","Storage failure handling"],"fullName":"Error Handling Tests Storage failure handling should handle storage save failure","status":"skipped","title":"should handle storage save failure","failureMessages":[],"meta":{}}],"startTime":1753744796777,"endTime":1753744806077.445,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/error-handling.test.ts"},{"assertionResults":[{"ancestorTitles":["Multi-Environment Tests","Environment Detection"],"fullName":"Multi-Environment Tests Environment Detection should correctly detect the current environment","status":"passed","title":"should correctly detect the current environment","duration":9184.142575,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Environment Detection"],"fullName":"Multi-Environment Tests Environment Detection should detect threading availability","status":"passed","title":"should detect threading availability","duration":1.527448999999251,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Node.js Environment"],"fullName":"Multi-Environment Tests Node.js Environment should use FileSystem storage by default in Node.js","status":"passed","title":"should use FileSystem storage by default in Node.js","duration":5.139396000000488,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Node.js Environment"],"fullName":"Multi-Environment Tests Node.js Environment should handle Worker Threads if available","status":"passed","title":"should handle Worker Threads if available","duration":0.780151000000842,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Browser Environment"],"fullName":"Multi-Environment Tests Browser Environment should detect browser environment correctly","status":"passed","title":"should detect browser environment correctly","duration":1.300757999999405,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Browser Environment"],"fullName":"Multi-Environment Tests Browser Environment should prefer OPFS storage in browser if available","status":"passed","title":"should prefer OPFS storage in browser if available","duration":4.053196000000753,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Web Worker Environment"],"fullName":"Multi-Environment Tests Web Worker Environment should detect Web Worker environment correctly","status":"passed","title":"should detect Web Worker environment correctly","duration":0.44086999999854015,"failureMessages":[],"meta":{}},{"ancestorTitles":["Multi-Environment Tests","Cross-Environment Data Compatibility"],"fullName":"Multi-Environment Tests Cross-Environment Data Compatibility should create compatible vector formats across environments","status":"passed","title":"should create compatible vector formats across environments","duration":3.043619000000035,"failureMessages":[],"meta":{}}],"startTime":1753744796778,"endTime":1753744805979.0437,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/multi-environment.test.ts"},{"assertionResults":[{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should detect OPFS availability correctly","status":"passed","title":"should detect OPFS availability correctly","duration":1059.470619,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should initialize and perform basic operations with OPFS storage","status":"passed","title":"should initialize and perform basic operations with OPFS storage","duration":3.730346000000054,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle noun operations correctly","status":"passed","title":"should handle noun operations correctly","duration":4.616723000000093,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle verb operations correctly","status":"passed","title":"should handle verb operations correctly","duration":5.736787000000049,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle storage status correctly","status":"passed","title":"should handle storage status correctly","duration":3.9773150000000896,"failureMessages":[],"meta":{}},{"ancestorTitles":["OPFSStorage"],"fullName":"OPFSStorage should handle persistence correctly","status":"passed","title":"should handle persistence correctly","duration":1.2045499999999265,"failureMessages":[],"meta":{}}],"startTime":1753744794587,"endTime":1753744795666.2046,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/opfs-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Package Size Breakdown"],"fullName":"Package Size Breakdown should report the estimated package size and largest files","status":"passed","title":"should report the estimated package size and largest files","duration":866.9493480000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Breakdown"],"fullName":"Package Size Breakdown should identify files that contribute significantly to package size","status":"passed","title":"should identify files that contribute significantly to package size","duration":1167.065993,"failureMessages":[],"meta":{}}],"startTime":1753744794572,"endTime":1753744796606.066,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/package-size-breakdown.test.ts"},{"assertionResults":[{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should not exceed unpacked size threshold for npm package","status":"passed","title":"should not exceed unpacked size threshold for npm package","duration":12620.829044,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should not exceed packed size threshold for npm package","status":"passed","title":"should not exceed packed size threshold for npm package","duration":0.2713739999999234,"failureMessages":[],"meta":{}},{"ancestorTitles":["Package Size Limits"],"fullName":"Package Size Limits should report package composition details","status":"passed","title":"should report package composition details","duration":0.3755280000004859,"failureMessages":[],"meta":{}}],"startTime":1753744794542,"endTime":1753744807164.3755,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/package-size-limit.test.ts"},{"assertionResults":[{"ancestorTitles":["Performance Tests","Small Dataset (10-100 items)"],"fullName":"Performance Tests Small Dataset (10-100 items) should add items efficiently","status":"passed","title":"should add items efficiently","duration":21338.00263,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Small Dataset (10-100 items)"],"fullName":"Performance Tests Small Dataset (10-100 items) should search efficiently","status":"passed","title":"should search efficiently","duration":1321.9013989999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should add items efficiently","status":"passed","title":"should add items efficiently","duration":5322.884816999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should search efficiently","status":"passed","title":"should search efficiently","duration":5195.279078000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Medium Dataset (100-1000 items)"],"fullName":"Performance Tests Medium Dataset (100-1000 items) should handle multiple concurrent searches efficiently","status":"passed","title":"should handle multiple concurrent searches efficiently","duration":5164.387009999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should add items efficiently","status":"skipped","title":"should add items efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should search efficiently","status":"skipped","title":"should search efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Large Dataset (1000+ items)"],"fullName":"Performance Tests Large Dataset (1000+ items) should handle multiple concurrent searches efficiently","status":"skipped","title":"should handle multiple concurrent searches efficiently","failureMessages":[],"meta":{}},{"ancestorTitles":["Performance Tests","Performance Scaling"],"fullName":"Performance Tests Performance Scaling should demonstrate search performance scaling with dataset size","status":"passed","title":"should demonstrate search performance scaling with dataset size","duration":3959.414537000004,"failureMessages":[],"meta":{}}],"startTime":1753744796778,"endTime":1753744839080.4146,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/performance.test.ts"},{"assertionResults":[{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should initialize S3CompatibleStorage correctly","status":"passed","title":"should initialize S3CompatibleStorage correctly","duration":1081.3815789999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should initialize R2Storage correctly","status":"passed","title":"should initialize R2Storage correctly","duration":6.37142700000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should perform basic metadata operations with S3 storage","status":"passed","title":"should perform basic metadata operations with S3 storage","duration":48.4998079999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle noun operations correctly with S3 storage","status":"passed","title":"should handle noun operations correctly with S3 storage","duration":52.02122499999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle verb operations correctly with S3 storage","status":"passed","title":"should handle verb operations correctly with S3 storage","duration":24.707949999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle storage status correctly with S3 storage","status":"passed","title":"should handle storage status correctly with S3 storage","duration":19.256243999999924,"failureMessages":[],"meta":{}},{"ancestorTitles":["S3CompatibleStorage"],"fullName":"S3CompatibleStorage should handle multiple objects and pagination with S3 storage","status":"passed","title":"should handle multiple objects and pagination with S3 storage","duration":998.4369259999999,"failureMessages":[],"meta":{}}],"startTime":1753744794581,"endTime":1753744796811.437,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/s3-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Specialized Scenarios Tests","Read-Only Mode"],"fullName":"Specialized Scenarios Tests Read-Only Mode should enforce read-only mode for all write operations","status":"passed","title":"should enforce read-only mode for all write operations","duration":9229.191846,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Read-Only Mode"],"fullName":"Specialized Scenarios Tests Read-Only Mode should allow setting read-only mode during initialization","status":"passed","title":"should allow setting read-only mode during initialization","duration":0.6978580000013608,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should create and query relationships between items","status":"passed","title":"should create and query relationships between items","duration":1.9232959999990271,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should handle multiple relationship types","status":"passed","title":"should handle multiple relationship types","duration":2.1450979999990523,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Relationship Operations"],"fullName":"Specialized Scenarios Tests Relationship Operations should handle bidirectional relationships","status":"passed","title":"should handle bidirectional relationships","duration":1.4566689999992377,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should store and retrieve metadata in add operations","status":"passed","title":"should store and retrieve metadata in add operations","duration":1.0815210000000661,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should store and retrieve metadata in relate operations","status":"passed","title":"should store and retrieve metadata in relate operations","duration":0.9110630000013771,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should update metadata correctly","status":"passed","title":"should update metadata correctly","duration":0.6505789999991975,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Metadata Handling"],"fullName":"Specialized Scenarios Tests Metadata Handling should handle metadata in search results","status":"passed","title":"should handle metadata in search results","duration":1.578444999999192,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should track and report statistics","status":"passed","title":"should track and report statistics","duration":1.0906579999991663,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should flush statistics","status":"passed","title":"should flush statistics","duration":0.49387799999931303,"failureMessages":[],"meta":{}},{"ancestorTitles":["Specialized Scenarios Tests","Statistics and Monitoring"],"fullName":"Specialized Scenarios Tests Statistics and Monitoring should track database size","status":"passed","title":"should track database size","duration":0.9003240000001824,"failureMessages":[],"meta":{}}],"startTime":1753744796777,"endTime":1753744806019.9004,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/specialized-scenarios.test.ts"},{"assertionResults":[{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should save statistics data","status":"skipped","title":"should save statistics data","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should retrieve statistics data after batch update completes","status":"skipped","title":"should retrieve statistics data after batch update completes","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should store statistics in time-partitioned files","status":"skipped","title":"should store statistics in time-partitioned files","failureMessages":[],"meta":{}},{"ancestorTitles":["Statistics Storage"],"fullName":"Statistics Storage should maintain backward compatibility with legacy statistics file","status":"skipped","title":"should maintain backward compatibility with legacy statistics file","failureMessages":[],"meta":{}}],"startTime":1753744794248,"endTime":1753744794248,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/statistics-storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Brainy Statistics Functionality","Library Exports"],"fullName":"Brainy Statistics Functionality Library Exports should export getStatistics function at the root level","status":"passed","title":"should export getStatistics function at the root level","duration":0.9695830000000569,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should retrieve statistics from a BrainyData instance","status":"passed","title":"should retrieve statistics from a BrainyData instance","duration":10007.079817,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should throw an error when no instance is provided","status":"passed","title":"should throw an error when no instance is provided","duration":1.0133740000001126,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should match the instance method results","status":"passed","title":"should match the instance method results","duration":2.6666779999995924,"failureMessages":[],"meta":{}},{"ancestorTitles":["Brainy Statistics Functionality","getStatistics Functionality"],"fullName":"Brainy Statistics Functionality getStatistics Functionality should track statistics by service","status":"passed","title":"should track statistics by service","duration":6.129487000000154,"failureMessages":[],"meta":{}}],"startTime":1753744796141,"endTime":1753744806159.1294,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/statistics.test.ts"},{"assertionResults":[{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should add and retrieve items","status":"passed","title":"should add and retrieve items","duration":9289.276372,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should search for items","status":"passed","title":"should search for items","duration":2.6574710000004416,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should delete items","status":"passed","title":"should delete items","duration":0.8373970000011468,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should update metadata","status":"passed","title":"should update metadata","duration":0.7627580000007583,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should handle batch operations","status":"passed","title":"should handle batch operations","duration":11853.107011999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should handle relationships","status":"passed","title":"should handle relationships","duration":1.2648520000002463,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should enforce read-only mode","status":"passed","title":"should enforce read-only mode","duration":1.0072030000010272,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should get statistics","status":"passed","title":"should get statistics","duration":0.8228000000017346,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","Memory Adapter Tests"],"fullName":"Storage Adapter Coverage Tests Memory Adapter Tests should backup and restore data","status":"passed","title":"should backup and restore data","duration":1.042739000000438,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should add and retrieve items","status":"passed","title":"should add and retrieve items","duration":2.8427650000012363,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should search for items","status":"passed","title":"should search for items","duration":2.084244999998191,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should delete items","status":"passed","title":"should delete items","duration":1.202635999998165,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should update metadata","status":"passed","title":"should update metadata","duration":2.3937710000027437,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should handle batch operations","status":"passed","title":"should handle batch operations","duration":104.26873699999851,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should handle relationships","status":"passed","title":"should handle relationships","duration":2.0752680000005057,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should enforce read-only mode","status":"passed","title":"should enforce read-only mode","duration":1.213887000001705,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should get statistics","status":"passed","title":"should get statistics","duration":1.3174800000015239,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","FileSystem Adapter Tests"],"fullName":"Storage Adapter Coverage Tests FileSystem Adapter Tests should backup and restore data","status":"passed","title":"should backup and restore data","duration":2.5133129999994708,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapter Coverage Tests","S3-Compatible Storage Tests"],"fullName":"Storage Adapter Coverage Tests S3-Compatible Storage Tests would test S3 storage operations if properly configured","status":"skipped","title":"would test S3 storage operations if properly configured","failureMessages":[],"meta":{}}],"startTime":1753744796778,"endTime":1753744818048.5134,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/storage-adapter-coverage.test.ts"},{"assertionResults":[{"ancestorTitles":["Storage Adapters","MemoryStorage"],"fullName":"Storage Adapters MemoryStorage should create and initialize MemoryStorage","status":"passed","title":"should create and initialize MemoryStorage","duration":2256.095633,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","FileSystemStorage in Node.js"],"fullName":"Storage Adapters FileSystemStorage in Node.js should create and initialize FileSystemStorage in Node.js environment","status":"passed","title":"should create and initialize FileSystemStorage in Node.js environment","duration":2.2645309999998062,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","FileSystemStorage in Node.js"],"fullName":"Storage Adapters FileSystemStorage in Node.js should handle file system operations correctly","status":"passed","title":"should handle file system operations correctly","duration":2.4705229999999574,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","OPFSStorage in Browser"],"fullName":"Storage Adapters OPFSStorage in Browser should detect OPFS availability correctly","status":"passed","title":"should detect OPFS availability correctly","duration":1.0651699999998527,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","OPFSStorage in Browser"],"fullName":"Storage Adapters OPFSStorage in Browser should initialize and perform basic operations with OPFS storage","status":"passed","title":"should initialize and perform basic operations with OPFS storage","duration":0.4054340000002412,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select MemoryStorage when forceMemoryStorage is true","status":"passed","title":"should select MemoryStorage when forceMemoryStorage is true","duration":0.4329749999997148,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select FileSystemStorage when forceFileSystemStorage is true","status":"passed","title":"should select FileSystemStorage when forceFileSystemStorage is true","duration":0.22162200000002485,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select MemoryStorage when type is memory","status":"passed","title":"should select MemoryStorage when type is memory","duration":0.20735500000000684,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection"],"fullName":"Storage Adapters Environment Detection should select FileSystemStorage when type is filesystem","status":"passed","title":"should select FileSystemStorage when type is filesystem","duration":0.22793400000000474,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should select FileSystemStorage in Node.js environment","status":"passed","title":"should select FileSystemStorage in Node.js environment","duration":0.24220999999988635,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should select OPFS in browser environment if available","status":"passed","title":"should select OPFS in browser environment if available","duration":0.29432699999961187,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","Environment Detection","Auto-detection"],"fullName":"Storage Adapters Environment Detection Auto-detection should fall back to MemoryStorage when OPFS is not available in browser","status":"passed","title":"should fall back to MemoryStorage when OPFS is not available in browser","duration":0.23846400000002177,"failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","S3CompatibleStorage"],"fullName":"Storage Adapters S3CompatibleStorage should create and initialize S3CompatibleStorage","status":"skipped","title":"should create and initialize S3CompatibleStorage","failureMessages":[],"meta":{}},{"ancestorTitles":["Storage Adapters","S3CompatibleStorage"],"fullName":"Storage Adapters S3CompatibleStorage should create and initialize R2Storage","status":"skipped","title":"should create and initialize R2Storage","failureMessages":[],"meta":{}}],"startTime":1753744794545,"endTime":1753744796810.2944,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/storage-adapters.test.ts"},{"assertionResults":[{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should have TextEncoder and TextDecoder available in Node.js environment","status":"passed","title":"should have TextEncoder and TextDecoder available in Node.js environment","duration":0.8326179999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should apply TensorFlow patch and make globals available","status":"passed","title":"should apply TensorFlow patch and make globals available","duration":38.85632700000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should load brainy library successfully with patch applied","status":"passed","title":"should load brainy library successfully with patch applied","duration":1588.017955,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should load TensorFlow.js directly after patch is applied","status":"passed","title":"should load TensorFlow.js directly after patch is applied","duration":650.321684,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should handle patch application multiple times safely","status":"passed","title":"should handle patch application multiple times safely","duration":12.351204999999936,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should verify patch works with brainy library initialization","status":"passed","title":"should verify patch works with brainy library initialization","duration":1.2352370000003248,"failureMessages":[],"meta":{}},{"ancestorTitles":["TensorFlow.js Patch"],"fullName":"TensorFlow.js Patch should maintain compatibility with different module systems","status":"passed","title":"should maintain compatibility with different module systems","duration":44.683802000000014,"failureMessages":[],"meta":{}}],"startTime":1753744794544,"endTime":1753744796880.6838,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/tensorflow-patch.test.ts"},{"assertionResults":[{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should load brainy library successfully","status":"passed","title":"should load brainy library successfully","duration":1592.4117939999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should create and initialize BrainyData instance","status":"passed","title":"should create and initialize BrainyData instance","duration":9493.044931,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should handle simple vector operations","status":"passed","title":"should handle simple vector operations","duration":4.794604000000618,"failureMessages":[],"meta":{}},{"ancestorTitles":["Vector Operations"],"fullName":"Vector Operations should handle multiple vector searches correctly","status":"passed","title":"should handle multiple vector searches correctly","duration":2.4089899999999034,"failureMessages":[],"meta":{}}],"startTime":1753744794578,"endTime":1753744805671.409,"status":"passed","message":"","name":"/home/dpsifr/Projects/brainy/tests/vector-operations.test.ts"}]} \ No newline at end of file