0.8.0
What's Changed
Added
- CrewAI adapter (#193) — �dapters/crewai.py. Thin stateless converter: CrewAI BaseTool instances or plain-dict shape → SelectableItem. Ships crewai_tool_to_selectable, crewai_tools_to_catalog, infer_crewai_namespace, load_crewai_catalog. Dict-conversion path works without [crewai] extra. New integration guide docs/integration_crewai.md and examples/crewai_adapter_demo.py.
- Mem0 external-memory backend (#195) — extras/memory/mem0.py. Mem0EpisodicStore + Mem0FactStore implement EpisodicStore / FactStore Protocols verbatim (no widening). Writes via mem0.Memory.add(infer=False) stamped with cw_episode_id / cw_fact_id metadata. New [mem0] optional-dependency group. New docs/integration_memory.md decision matrix.
Changed
- Provider-SDK leak invariant tests now run in a subprocess — the est_module_does_not_import_provider_sdk_at_load_time assertions in est_adapters_openai_messages.py, est_adapters_anthropic_messages.py, and est_adapters_gemini_contents.py now spawn a fresh interpreter so the check is independent of test ordering and other installed extras (e.g. crewai transitively importing openai).
Fixed
- crewai adapter: deep-copy �rgs_schema to prevent catalog mutation
- EpisodicStore.add(): upsert semantics (idempotent on re-add)
- Mem0EpisodicStore.add(): graceful fallback to append-only when scan_limit exceeded
- Mem0FactStore.put(): guarded write path to avoid silent data loss
- Docs: corrected API kwargs, added original_description metadata
Full changelog: https://github.com/dgenio/contextweaver/blob/main/CHANGELOG.md