feat: add entity versioning system with critical bug fixes (v5.3.0)

Entity Versioning (NEW):
- Add complete entity versioning API (brain.versions.*) with 18 methods
- Content-addressable storage with SHA-256 deduplication
- Git-style version control: save, restore, compare, undo, prune
- Auto-versioning augmentation with pattern-based filtering
- Branch-isolated version histories
- Complete integration tests and API documentation

Critical Bug Fixes:
- Fix commit() not updating branch refs (brainy.ts:2385)
  - Root cause: Passed "heads/main" which normalized to "refs/heads/heads/main"
  - Impact: All Git-style versioning features were broken
  - Fix: Pass branch name directly for correct normalization
- Fix VFS entities missing isVFSEntity flag
  - Add isVFSEntity: true to all VFS files/folders for filtering
  - Resolves pollution of semantic search with filesystem entities
  - Updated in writeFile(), mkdir(), and root directory init

Implementation:
- src/versioning/VersionManager.ts - Core versioning engine
- src/versioning/VersionStorage.ts - Content-addressable storage
- src/versioning/VersionIndex.ts - Metadata indexing
- src/versioning/VersionDiff.ts - Version comparison
- src/versioning/VersioningAPI.ts - Public API interface
- src/augmentations/versioningAugmentation.ts - Auto-versioning
- tests/integration/versioning.test.ts - Full integration tests
- tests/unit/versioning/ - Unit test suite

Documentation:
- Complete Entity Versioning API section in docs/api/README.md
- VFS entity filtering guide with examples
- Updated "What's New" section for v5.3.0
- Strategy docs for both critical bugs

Test Results:
- 1168 tests passing
- Build: PASSING (no TypeScript errors)
- Integration tests: ALL PASSING

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
David Snelling 2025-11-04 11:19:02 -08:00
parent b31997b1ea
commit c488fa82cc
16 changed files with 5394 additions and 9 deletions

View file

@ -24,6 +24,7 @@ import { NaturalLanguageProcessor } from './neural/naturalLanguageProcessor.js'
import { NeuralEntityExtractor, ExtractedEntity } from './neural/entityExtractor.js'
import { TripleIntelligenceSystem } from './triple/TripleIntelligenceSystem.js'
import { VirtualFileSystem } from './vfs/VirtualFileSystem.js'
import { VersioningAPI } from './versioning/VersioningAPI.js'
import { MetadataIndexManager } from './utils/metadataIndex.js'
import { GraphAdjacencyIndex } from './graph/graphAdjacencyIndex.js'
import { CommitBuilder } from './storage/cow/CommitObject.js'
@ -95,6 +96,7 @@ export class Brainy<T = any> implements BrainyInterface<T> {
private _nlp?: NaturalLanguageProcessor
private _extractor?: NeuralEntityExtractor
private _tripleIntelligence?: TripleIntelligenceSystem
private _versions?: VersioningAPI
private _vfs?: VirtualFileSystem
// State
@ -2380,7 +2382,7 @@ export class Brainy<T = any> implements BrainyInterface<T> {
const commitHash = await builder.build()
// Update branch ref to point to new commit
await refManager.setRef(`heads/${currentBranch}`, commitHash, {
await refManager.setRef(currentBranch, commitHash, {
author: options?.author || 'unknown',
message: options?.message || 'Snapshot commit'
})
@ -2937,6 +2939,38 @@ export class Brainy<T = any> implements BrainyInterface<T> {
return this._neural
}
/**
* Versioning API - Entity version control (v5.3.0)
*
* Provides entity-level versioning with:
* - save() - Create version of entity
* - restore() - Restore entity to specific version
* - list() - List all versions of entity
* - compare() - Deep diff between versions
* - prune() - Remove old versions (retention policies)
*
* @example
* ```typescript
* // Save current state
* const version = await brain.versions.save('user-123', { tag: 'v1.0' })
*
* // List versions
* const versions = await brain.versions.list('user-123')
*
* // Restore to previous version
* await brain.versions.restore('user-123', 5)
*
* // Compare versions
* const diff = await brain.versions.compare('user-123', 2, 5)
* ```
*/
get versions(): VersioningAPI {
if (!this._versions) {
this._versions = new VersioningAPI(this as any)
}
return this._versions
}
/**
* Natural Language Processing API
*/