Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 07:30
· 54 commits to main since this release

[0.2.0] - 2026-08-23

🚀 Features

  • (indexer) Route single-file indexing through ReaderRegistry and add a per-extension read_file API
  • (storage) Create vector table with dynamic dimension from embedder instead of hardcoded 512
  • (logging) Introduce flexi_logger for file-based logging with configurable path, size rotation, and optional stderr duplication via config.toml and CLI flags
  • (verbose) Route Verbose progress messages to the log file under the 'docq' target and ensure they remain visible on the terminal when log duplication is disabled
  • Enable Metal GPU acceleration and suppress ggml_metal_device_init log noise via early ggml_log_set no-op callback

🐛 Bug Fixes

  • Preserve chunk-to-doc mapping via chunk_documents junction table to prevent cross-file dedup attribution errors
  • Make tokenizer filename configurable in ModelEntry instead of hardcoding BGE_SMALL_ZH_V1_5_TOKENIZER_FILE
  • Use atomic single-statement write for model version to avoid SQLite nested-transaction error during parallel model loading
  • Enable SQLite foreign keys and WAL mode, and use little-endian for vector bytes to ensure cross-arch portability
  • Skip vec_chunks creation on init(0) and pass 0 from init/add/status commands to avoid dimension mismatch when embedding model differs from default
  • Increase default LLM n_ctx from 4096 to 8192 to prevent prompt truncation and preserve full retrieval context

🚜 Refactor

  • (indexer) Flatten Indexer to own its component fields, and document known correctness defects
  • Separate stable doc_id from file_path via document_paths and resolve file paths in SearchHit
  • (engine) Extract base model-loading helper including ModelHub creation for open_for_index, open_for_search, and open_for_ask
  • (engine) Extract base model-loading helper including ModelHub creation for open_for_index, open_for_search, and open_for_ask
  • (retriever) Flatten Retriever to own its component fields directly from RetrieverConfig
  • (docq-retrieve) Split hybrid search pipeline into focused helpers; feat(fusion): generalize RRF to multiple recall channels; doc(docq-retrieve): document each retrieval stage and score semantics
  • (docq-synth) Move Synthesizer and SynthesizerConfig into synthesizer.rs and flatten config fields directly onto the struct
  • Replace all Other(String) error variants with structured variants across 6 error enums
  • Extract Indexer struct, IndexStats, and tests into indexer.rs, and split run_command into per-subcommand handler functions
  • Replace ModelSpec.role String with ModelRole enum across all crates

📚 Documentation

  • Update docs
  • Add CHANGELOG for v0.2.0
  • Update crate config in Linux and windows

⚡ Performance

  • Parallelize BM25 and vector recall in Retriever::search via spawn_blocking and tokio::join!
  • Parallelize reranker and LLM loading in Engine::open_for_ask via spawn_blocking and tokio::join!
  • Cache token_count in chunker, batch-petch document hashes, and pass is_update to eliminate redundant DB queries in indexer
  • Switch default reranker from BGE-reranker-base to jina-reranker-v1-turbo-en for 4x faster reranking
  • Switch default reranker from BGE-reranker-base to jina-reranker-v1-turbo-en for 4x faster reranking