feat(8.0): API simplification — remove neural()/Db.search, one storage path key, integration→0

8.0 RC cleanup toward "one place per thing, zero-config, no deprecation":

- Remove the `brain.neural()` clustering namespace (ImprovedNeuralAPI + the dead
  legacy NeuralAPI + the neural CLI + neural-only types). Similarity is `find({vector})`
  / `similar({to})`; attribute grouping is the aggregation `GROUP BY` engine. The separate
  entity-extraction / smart-import feature (NeuralImport, NeuralEntityExtractor, SmartExtractor,
  NaturalLanguageProcessor, `brain.extract()`/`brain.nlp()`) is kept.
- Remove `Db.search()`; `find()` is the one query verb (accepts a bare string or FindParams).
  Fix the bundled MCP client, which called a non-existent `brain.search(query, limit)` →
  now `find({ query, limit })`.
- Storage config: collapse to one canonical top-level `path` key. The pre-8.0 aliases
  (`rootDirectory`, `options.*`, `fileSystemStorage.*`) are removed and now THROW with the
  exact rename instead of silently defaulting to `./brainy-data` on upgrade. A single resolver
  feeds createStorage, the 7.x→8.0 migration probe, and the plugin-factory handoff, so a native
  storage provider resolves the identical root (no split-brain).
- Fix `similar({ threshold })`: the min-similarity filter was silently dropped; it is now
  applied as a post-filter on `result.score` (the documented way to bound semantic results).
- Fix `vfs.rename()` on a directory: child path updates spread the entity vector into `update()`
  and failed dimension validation; they are metadata-only updates now.
- Fix `vfs.move()`: copy+delete orphaned the content-addressed content blob (the destination
  shared the source hash, then unlink removed it). `move()` now delegates to `rename()` — an
  in-place path change that preserves the blob and the entity id, for files and directories.
- Fix streaming import: the bulk fast path never flushed mid-import nor signalled queryability.
  Entity writes are now chunked by a progressive flush interval (100 → 1000 → 5000); each chunk
  flushes and emits `progress.queryable`, so imported data is queryable during the import.
- Sweep all docs, comments, and JSDoc for the removed/changed APIs.

Integration suite: 49 files / 588 passed / 0 failed. Unit: 80 files / 1456 passed, no type errors.
This commit is contained in:
David Snelling 2026-06-20 13:31:11 -07:00
parent 0c4a51c24e
commit 606445cd61
74 changed files with 712 additions and 7470 deletions

View file

@ -162,7 +162,7 @@ const brain = new Brainy({
3. **Test with exact match**
```typescript
const results = await brain.search("test content") // Exact text
const results = await brain.find("test content") // Exact text
console.log('Exact match results:', results)
```
@ -175,12 +175,13 @@ const brain = new Brainy({
1. **Add more context to queries**
```typescript
// Instead of: "cat"
const results = await brain.search("domestic cat animal pet")
const results = await brain.find("domestic cat animal pet")
```
2. **Use metadata filtering**
```typescript
const results = await brain.search("animals", {
const results = await brain.find({
query: "animals",
where: { category: "pets" },
limit: 10
})
@ -219,13 +220,14 @@ const brain = new Brainy({
2. **Use appropriate limits**
```typescript
// Don't fetch more than needed
const results = await brain.search("query", { limit: 10 })
const results = await brain.find({ query: "query", limit: 10 })
```
3. **Consider metadata filtering first**
```typescript
// Filter by metadata first, then semantic search
const results = await brain.search("query", {
const results = await brain.find({
query: "query",
where: { category: "specific" }, // Reduces search space
limit: 10
})
@ -364,7 +366,7 @@ try {
await brain.init()
const id = await brain.add("health check", { nounType: 'content' })
const results = await brain.search("health")
const results = await brain.find("health")
console.log('✅ Brainy is working correctly')
console.log(`Added item: ${id}`)