Repository navigation
Releases: gianlucamazza/ragfs
Releases · gianlucamazza/ragfs
Release list
v0.2.1
Security
- Path jail (
resolve_under_root) now lives inragfs-coreand is enforced bySafetyManager(soft_delete/restore/undo), so PythonRagfsSafetyManagerand MCPragfs_delete_to_trashcannot escape the source root. - Documented the advisory-response ladder,
ignore:ownership, and §1.2 review cadence (next review by 2026-12-31) inSECURITY.md.
Removed
- BREAKING: Optional
pdf_oxideextractor feature. PDF text and images continue to usePdfExtractor(pdf-extract+lopdf).--features pdf_oxideis no longer valid.
Changed
- Agent docs (
CLAUDE.md,AGENTS.md) list all 10 Cargo workspace crates plusragfs-mcp.docs/PERFORMANCE.mddocuments[embedding].model, CLI-only--force, and--hybridvs[query].hybrid. - Embedding dimension and model id for
LanceStorecome fromEmbedder::dimension()/model_name(). Opening an index whosevectorwidth differs from the embedder fails withStoreError::Schema. - Split
ragfs-fuseFUSE handlerfilesystem.rsintofilesystem/modules by virtual-directory family (query, ops, safety, semantic, passthrough). Issue #52. - CI:
Swatinem/rust-cacheuses a shared key across Check/Clippy/Test/Docs/Python; pull requests run Python 3.12 only (3.10–3.13 stays onmain); coverage and Python integration run onmainonly. Dependabot ignores 0.x minor bumps ofcriterion,notify-debouncer-full, andtokenizers; auto-merge skips Cargo 0.x minors. - CI cost: deps compile at
opt-level=0on runners; PRs drop--all-features(keepragfs/test-backends); Python jobs skip when Python paths are unchanged; Coverage is weekly;docs.ymlusescargo +nightlysorust-toolchain.tomlcannot pin it to stable. ACIaggregator treats skipped rust jobs as success on docs-only PRs. - Project hygiene: MSRV docs 1.91,
Makefile/rust-toolchain.toml,CODEOWNERS, GitHub private advisory as the security channel,contents: readon CI/coverage, pinnedruff==0.15.9. docs/AUDIT.md: RUSTSEC-2025-0119 (number_prefix) is resolved.hf-hub0.5 pullsindicatif0.18, which usesunit-prefix(issue #79). Three unmaintained rows remain (paste#80,core2#77,ttf-parser#82).pastealso stays viagemm,rav1e, andlance-bitpacking, so atokenizersbump alone does not clear it.- Drop
core2(RUSTSEC-2026-0105, issue #77):bitstream-io4.10 usesno_std_io2.imageno longer enablesavif(the unused ravif/rav1e encoder); PNG and JPEG writes are unchanged.paste(#80) andttf-parser(#82) stay.
Added
- CLI integration tests (
assert_cmd) for config/--force/--hybrid/max_file_sizeand unsupported models, usingRAGFS_TEST_EMBEDDER=noop. - Repo social card (
docs/assets/social.svgsource,docs/assets/social.png1280×640) as the README header. README is a front page (quick start, feature matrix, grouped docs); the CLI manpage stays indocs/USER_GUIDE.md.
Fixed
- Revert Dependabot
lancedb0.39.0 (#72):Error::Httpiscfg(feature = "remote")whilejob.rsuses it with default features. Pin stays 0.37.1; cargo Dependabot ignoreslancedb >=0.38and Arrow 59+. - MCP
ragfs_batch_operationsserializes a failed atomic batch:BatchResult.rollback_idaliases the batchid(the previous attribute miss turned a jail reject into{"error": "... no attribute 'rollback_id'"}). - Align
candle-coreandcandle-nnwithcandle-transformers0.11 soragfs-embedcompiles (oneTensortype, not 0.9 + 0.11). - Pin the MSRV job to rustc 1.91 via
dtolnay/rust-toolchain@stable+toolchain: "1.91"(Dependabot #67 had moved the action tag to 1.120).
v0.2.0
Security
- Bump
lopdfto0.42(RUSTSEC-2026-0187 nesting-depth DoS). Already on the 0.42 API inragfs-extract. - Bump
pyo3andpyo3-async-runtimesto0.29(RUSTSEC-2026-0176 / RUSTSEC-2026-0177). - Replace unmaintained
daemonizewithnix(fork+setsid, stdio redirect, pid file) forragfs mountwithout--foreground. rustix 1.x does not exposeforkoutside its unstableruntimefeature.
Changed
- Background
ragfs mountstill writes a PID file to$XDG_RUNTIME_DIR/ragfs/<hash>.pid(fallback~/.cache/ragfs/run/) and logs to~/.cache/ragfs/logs/<hash>.log. Unmount remainsfusermount -u <mountpoint>. - Documented actual code chunking (pattern matching) and removed unused
tree-sitterdependency - FUSE
.helpnow covers.ops/,.safety/,.semantic/and product limits - FUSE
.configincludesapi_versionand states it is mount wiring, not user TOML
Added
- Directory-scoped vector search: persist relative
dir_pathon chunks and filter withragfs query --scope <dir>(exact directory or subdirectory; IVF-PQ ANN is unchanged) - Lance chunks schema v2 migration: existing indexes gain
dir_path/dir_depth/path_componentson open (sidecarragfs-schema.json);--forceis not a schema upgrade - FUSE
mount2runs on a dedicated OS thread so callbacks canblock_onwithout panicking - Best-effort IVF-PQ ANN index on
vectorwhen a Lance table has at least 256 rows (cosine-trained; incrementally refreshed after large appends; L2/Dot and failed builds stay exact) - Office text extraction for
.docx,.xlsx,.pptx, and.odt(ZIP+XML; not binary.doc) - Python bindings: New
ragfs-pythoncrate with PyO3 bindingsRAGFSIndexclass for indexing and queryingRAGFSStorefor direct vector store access- Async support via
pyo3-async-runtimes - Framework adapters for LangChain, LlamaIndex, Haystack
- Build with
maturin build
- FUSE capabilities exposed to Python (Propose-Review-Apply pattern for AI agents):
RagfsSafetyManager: Soft delete, trash, history, undo operationsRagfsSemanticManager: AI-powered file organization, similar/duplicate detectionRagfsOpsManager: Structured file operations with JSON feedbackOrganizeStrategy,OrganizeRequest,SemanticPlan,PlanActiontypes
- LlamaIndex FUSE-aware integration:
RagfsSafeVectorStore: VectorStore with safety layer integrationRagfsOrganizer: Semantic organizer with Propose-Review-Apply workflow
- Haystack FUSE-aware integration:
RagfsSafeDocumentStore: DocumentStore with soft delete and undoRagfsOrganizer: Haystack component for AI-powered file organization
- MCP Server with complete FUSE capabilities (18 tools):
- Safety Layer:
ragfs_delete_to_trash,ragfs_list_trash,ragfs_restore_from_trash,ragfs_get_history,ragfs_undo - Semantic Operations:
ragfs_find_duplicates,ragfs_analyze_cleanup - Approval Workflow:
ragfs_propose_organization,ragfs_propose_cleanup,ragfs_list_pending_plans,ragfs_get_plan,ragfs_approve_plan,ragfs_reject_plan - Batch Operations:
ragfs_batch_operations
- Safety Layer:
- CI/CD Python support:
- Python tests for all integrations (3.10-3.13)
- Pre-release validation workflow
- Python release workflow for PyPI publishing
- Security hardening:
SECURITY.mdwith vulnerability reporting guidelinesdeny.tomlfor cargo-deny license and advisory checks
- VectorStore iteration: New methods for bulk operations
get_all_chunks(): Returns all chunks in the storeget_all_files(): Returns all file records in the store
- BlipCaptioner: BLIP-based image captioning using Candle ML
- Auto-download from HuggingFace Hub (
Salesforce/blip-image-captioning-base) - Image preprocessing with CLIP normalization
- Autoregressive caption generation
- Requires
visionfeature flag
- Auto-download from HuggingFace Hub (
- Semantic organization: AI-powered file management features
find_duplicates(): Detect similar files using embedding cosine similaritysuggest_organization(): AI-powered folder structure suggestions- Configurable similarity thresholds
- Daemonization:
ragfs mountnow properly forks to background when run without--foreground- PID file stored in
$XDG_RUNTIME_DIR/ragfs/or~/.cache/ragfs/run/ - Logs written to
~/.cache/ragfs/logs/ - Graceful unmount via
fusermount -u <mountpoint>
- PID file stored in
- TOML configuration: Load settings from
~/.config/ragfs/config.tomlragfs config show- Display current configurationragfs config init- Generate sample config fileragfs config path- Show config file location--configglobal flag to specify custom config path
- PDF image extraction: Extract embedded images from PDFs using lopdf
- Supports JPEG (DCTDecode), PNG (FlateDecode), JPEG2000 (JPXDecode)
- CMYK to RGB conversion
- Memory limits: 100 images max, 50MB total, 50px minimum dimension
- Virtual
.ragfs/.helpfile: Usage documentation accessible via FUSE mount - NoopEmbedder: Testing embedder available without Candle dependency
- MemoryStore: In-memory vector store available without LanceDB dependency
- Atomic batch rollback: Batch operations with
atomic: truenow automatically roll back on failure- All successful operations are undone if any operation fails
- Rollback details included in batch result (
rollback_performed,rollback_details)
- Mkdir and Symlink operations: New operation types in OpsManager
mkdir: Create directories via.ops/interfacesymlink: Create symbolic links (Unix-only)
- Semantic plan persistence: Plans are saved to disk and survive restarts
- Plans stored in
~/.local/share/ragfs/plans/{index_hash}/ - Automatic cleanup of expired plans (configurable retention)
- Plans stored in
- Semantic plan execution: Approved plans are now executed automatically
- Actions run sequentially via OpsManager
- Each action generates an undo_id for manual reversal if needed
- Plan status reflects execution result (Completed/Failed)
Changed
- BREAKING: Feature flags restructured for optional ML backends
candlefeature (default): EnablesCandleEmbedderin ragfs-embedlancedbfeature (default): EnablesLanceStorein ragfs-storevisionfeature: EnablesBlipCaptionerfor image captioningfullfeature: Enables all optional features- Build profiles:
cargo build(default),--features full,--no-default-features(minimal)