Curate org-wide Knowledge Bases. Drop a PDF into chat for a one-session answer. Either way, PII is masked before retrieval ever reaches the LLM — and every document obeys your role-based read / write rules.
One config block defines a KB. The CLI ingests PDFs, URLs, or whole directories. A SQLite sidecar dedups by content hash and locks the embed model.
config/config.yaml with their own read / write roles, descriptions, and retention.rebuild_index() is rejected — your vectors stay coherent.Every chat session gets its own ephemeral KB collection, scoped strictly to (org, user, session). Uploads are routed by extension + MIME + magic-byte sniff so spreadsheets land in SQL and policies land in retrieval — automatically.
_session_{org}_{user}_{sha256(session)[:16]}. A neighbour's session cannot be queried.session_ttl_hours; CLI chat_attach reap on demand.status='failed', reason='embed_model_mismatch' — never a silent corruption.kb_admin ingest --kb company_docs --source ./docs/policy.pdfkb_admin ingest --kb company_docs --url https://...kb_admin ingest --kb company_docs --bulk ./docskb_admin search --kb company_docs --query "data retention" --top-k 5kb_admin list --kb company_docskb_admin rebuild --kb company_docschat_attach list-sessionschat_attach reapchat_attach promote --upload <doc_id> --kb company_docspython _kb_smoke.py — builds a small PDF + markdown, ingests, searches, dedup-checks.One YAML block, one ingest command, one secure UI. Your policies become first-class data.