feat(v4.0.0): Complete metadata/vector separation architecture with Azure support

This commit completes the core v4.0.0 architecture changes for billion-scale
performance with metadata/vector separation. NO RELEASE YET - remaining optimizations
and testing required before production release.

## Core v4.0.0 Architecture Changes

### Type System Updates
- Fixed all TypeScript compilation errors (zero errors achieved)
- Updated HNSWNoun/HNSWVerb to separate core fields from metadata
- Implemented HNSWNounWithMetadata/HNSWVerbWithMetadata for API boundaries
- Added required 'noun' field to NounMetadata for semantic structure
- Renamed verb.type to verb.verb for consistency

### Storage Adapter Updates
**All adapters updated for v4.0.0 two-file storage pattern:**
- memoryStorage: Proper metadata/vector separation
- fileSystemStorage: Two-file pattern with sharding
- opfsStorage: Browser persistent storage updated
- s3CompatibleStorage: AWS/MinIO/DigitalOcean support
- r2Storage: Cloudflare R2 optimization
- gcsStorage: Google Cloud with ADC support
- **azureBlobStorage: NEW - Full Azure Blob Storage support**

### Storage Features
- BaseStorage: Internal vs public method separation (_getNoun vs getNoun)
- Two-file storage: Vectors in one file, metadata in another
- Change tracking: getChangesSince return type updated
- Pagination: getNounsWithPagination returns WithMetadata types

### Azure Blob Storage Integration (NEW)
- Native @azure/storage-blob SDK integration
- Four authentication methods:
  * DefaultAzureCredential (Managed Identity) - recommended
  * Connection String - simplest setup
  * Account Name + Key - traditional auth
  * SAS Token - delegated access
- High-volume mode with write buffering
- Adaptive backpressure for throttling
- UUID-based sharding for billion-scale
- Full HNSW support with graph persistence

### Utility Updates
- EmbeddingManager: Updated to accept Record<string, unknown>
- LSMTree: Wrapped data in NounMetadata structure with 'noun' field
- EntityIdMapper: Fixed nested metadata.data structure access
- MetadataIndex: Fixed field type inference integration
- PeriodicCleanup: Updated for new metadata structure

### Core API Updates
- Brainy: Updated verb property access from v.type to v.verb
- ConfigAPI: Fixed NounMetadata access patterns
- DataAPI: Updated metadata handling

### Documentation Updates
- CREATING-AUGMENTATIONS.md: v4.0.0 breaking changes guide
- DEVELOPER-GUIDE.md: Migration checklist and examples
- COMPLETE-REFERENCE.md: v4.0.0 architecture improvements
- **finite-type-system.md: NEW - Revolutionary type system benefits**

### Build & Dependencies
- Zero TypeScript compilation errors
- Added @azure/storage-blob and @azure/identity
- 591 tests passing (23 timeout in long-running neural tests)

## What's NOT in This Release
This is a work-in-progress commit. Before v4.0.0 release we need:
- Storage adapter optimizations (batch operations, compression)
- Azure blob tier management (Hot/Cool/Archive)
- Cost optimization implementations
- Additional performance testing at billion-scale
- Migration guides for v3.x users

## Testing
- Clean build: 
- Type checking:  (zero errors)
- Test suite:  (591/614 passing, timeouts in neural tests only)

🔐 Generated with Claude Code
https://claude.com/claude-code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
David Snelling 2025-10-17 12:29:27 -07:00
parent 8d6dd07e1d
commit 92c96246fb
35 changed files with 4524 additions and 1026 deletions

View file

@ -9,6 +9,7 @@ import { OPFSStorage } from './adapters/opfsStorage.js'
import { S3CompatibleStorage } from './adapters/s3CompatibleStorage.js'
import { R2Storage } from './adapters/r2Storage.js'
import { GcsStorage } from './adapters/gcsStorage.js'
import { AzureBlobStorage } from './adapters/azureBlobStorage.js'
import { TypeAwareStorageAdapter } from './adapters/typeAwareStorageAdapter.js'
// FileSystemStorage is dynamically imported to avoid issues in browser environments
import { isBrowser } from '../utils/environment.js'
@ -28,9 +29,10 @@ export interface StorageOptions {
* - 'r2': Use Cloudflare R2 storage
* - 'gcs': Use Google Cloud Storage (S3-compatible with HMAC keys)
* - 'gcs-native': Use Google Cloud Storage (native SDK with ADC)
* - 'azure': Use Azure Blob Storage (native SDK with Managed Identity)
* - 'type-aware': Use type-first storage adapter (wraps another adapter)
*/
type?: 'auto' | 'memory' | 'opfs' | 'filesystem' | 's3' | 'r2' | 'gcs' | 'gcs-native' | 'type-aware'
type?: 'auto' | 'memory' | 'opfs' | 'filesystem' | 's3' | 'r2' | 'gcs' | 'gcs-native' | 'azure' | 'type-aware'
/**
* Force the use of memory storage even if other storage types are available
@ -177,6 +179,36 @@ export interface StorageOptions {
secretAccessKey?: string
}
/**
* Configuration for Azure Blob Storage (native SDK with Managed Identity)
*/
azureStorage?: {
/**
* Azure container name
*/
containerName: string
/**
* Azure Storage account name (for Managed Identity or SAS)
*/
accountName?: string
/**
* Azure Storage account key (optional, uses Managed Identity if not provided)
*/
accountKey?: string
/**
* Azure connection string (highest priority if provided)
*/
connectionString?: string
/**
* SAS token (optional, alternative to account key)
*/
sasToken?: string
}
/**
* Configuration for Type-Aware Storage (type-first architecture)
* Wraps another storage adapter and adds type-first routing
@ -473,6 +505,24 @@ export async function createStorage(
return new MemoryStorage()
}
case 'azure':
if (options.azureStorage) {
console.log('Using Azure Blob Storage (native SDK)')
return new AzureBlobStorage({
containerName: options.azureStorage.containerName,
accountName: options.azureStorage.accountName,
accountKey: options.azureStorage.accountKey,
connectionString: options.azureStorage.connectionString,
sasToken: options.azureStorage.sasToken,
cacheConfig: options.cacheConfig
})
} else {
console.warn(
'Azure storage configuration is missing, falling back to memory storage'
)
return new MemoryStorage()
}
case 'type-aware': {
console.log('Using Type-Aware Storage (type-first architecture)')
@ -571,6 +621,19 @@ export async function createStorage(
})
}
// If Azure storage is specified, use it
if (options.azureStorage) {
console.log('Using Azure Blob Storage (native SDK)')
return new AzureBlobStorage({
containerName: options.azureStorage.containerName,
accountName: options.azureStorage.accountName,
accountKey: options.azureStorage.accountKey,
connectionString: options.azureStorage.connectionString,
sasToken: options.azureStorage.sasToken,
cacheConfig: options.cacheConfig
})
}
// Auto-detect the best storage adapter based on the environment
// First, check if we're in Node.js (prioritize for test environments)
if (!isBrowser()) {
@ -632,6 +695,7 @@ export {
S3CompatibleStorage,
R2Storage,
GcsStorage,
AzureBlobStorage,
TypeAwareStorageAdapter
}