fix: excludeVFS now only excludes VFS infrastructure entities (v5.7.12)

CRITICAL BUG: Workshop team reported excludeVFS: true was excluding
extracted entities (concepts/people) even though they should be included.

## Problem

excludeVFS was too aggressive - it excluded entities with ANY VFS-related
metadata (vfsPath, importedFrom, importIds). This incorrectly excluded
extracted entities just because they had metadata showing where they came from.

Example:
- Excel file "Characters.xlsx" → isVFSEntity: true, vfsType: 'file'  EXCLUDE
- Extracted concept "Gandalf" → has vfsPath metadata  Was excluded (BUG!)
  Should be included because isVFSEntity and vfsType are NOT set

## Root Cause (src/brainy.ts:1357-1359)

Old code:
```typescript
if (params.excludeVFS === true) {
  filter.vfsType = { exists: false }  // Too simple!
}
```

This only checked vfsType field existence, but the real issue was that
it didn't properly distinguish between:
- VFS infrastructure entities (files/folders) → SHOULD exclude
- Extracted entities with import metadata → SHOULD include

## Fix (src/brainy.ts:1360-1389)

New code checks TWO conditions (both must be true to INCLUDE entity):
1. isVFSEntity is NOT true (missing or false)
2. vfsType is NOT 'file' or 'directory' (missing or different value)

This properly excludes ONLY:
- Entities with isVFSEntity: true (explicitly marked as VFS)
- Entities with vfsType: 'file' or 'directory' (actual VFS files/folders)

And INCLUDES:
- Extracted entities (concepts, people, etc) even if they have vfsPath/importedFrom/importIds

## Impact

BEFORE v5.7.12:
-  Extracted concepts excluded from results
-  Workshop UI showing empty concept lists
-  excludeVFS unusable for filtering VFS files

AFTER v5.7.12:
-  Extracted concepts INCLUDED in results
-  Only VFS files/folders excluded
-  Workshop UI can show concepts with excludeVFS: true

Resolves critical Workshop production bug for brain.import() workflows.

Related: brain.find(), brain.import(), VirtualFileSystem
This commit is contained in:
David Snelling 2025-11-13 14:54:11 -08:00
parent bb9306d3f8
commit 99ac901894

View file

@ -1352,10 +1352,40 @@ export class Brainy<T = any> implements BrainyInterface<T> {
if (params.where) Object.assign(filter, params.where)
if (params.service) filter.service = params.service
// v4.7.0: excludeVFS helper for cleaner UX
// Use vfsType field (more semantic than isVFS)
// v5.7.12: excludeVFS helper - ONLY exclude VFS infrastructure entities
// Bug fix: Previously excluded entities with ANY vfsType field
// Now ONLY excludes entities with isVFSEntity: true OR vfsType: 'file'/'directory'
// This allows extracted entities (concepts/people/etc) to be included even if they
// have vfsPath metadata showing where they were imported from
if (params.excludeVFS === true) {
filter.vfsType = { exists: false }
// Build filter: EXCLUDE WHERE (isVFSEntity == true) OR (vfsType IN ['file', 'directory'])
// Implementation: INCLUDE WHERE (isVFSEntity missing/false) AND (vfsType missing/not file or directory)
const existingFilter = { ...filter }
filter = {
allOf: [
existingFilter,
{
// Only include entities WITHOUT isVFSEntity: true
anyOf: [
{ isVFSEntity: { exists: false } },
{ isVFSEntity: { ne: true } }
]
},
{
// Only include entities WITHOUT vfsType: 'file' or 'directory'
// Since VFS files ALWAYS have vfsType set, we check it's missing OR not file/dir
anyOf: [
{ vfsType: { exists: false } },
{
allOf: [
{ vfsType: { ne: 'file' } },
{ vfsType: { ne: 'directory' } }
]
}
]
}
]
}
}
if (params.type) {