clsplusplus 7.3.1__tar.gz → 7.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/PKG-INFO +1 -1
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/pyproject.toml +1 -1
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_phase.py +4 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_service.py +28 -1
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/PKG-INFO +1 -1
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/SOURCES.txt +1 -0
- clsplusplus-7.3.2/tests/test_mem0_failure_modes.py +706 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/LICENSE +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/README.md +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/setup.cfg +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/__init__.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/abuse_guard.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/api.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/api_usage_analytics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/auth.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cli.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/client.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/config.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cost_forecast.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cost_model.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/debug_console.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_llm.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_llm_calls.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_local.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/email_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/embeddings.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/funnel_routes.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/geo.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/health_metrics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/homepage_autopromote.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/idempotency.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integration_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/__init__.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/autogen.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/crewai.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/langgraph.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/llamaindex.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/jwt_utils.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/local_routes.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/main.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/mcp_http.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/mcp_server.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_cycle.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/__init__.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/__main__.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/billing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/healthcheck.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/notifier.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/pricing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/reconciler.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/schema.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/writer.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metrics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/middleware.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/models.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/namespace_resolver.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/oauth_server.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/permissions.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/plasticity.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing_models.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/prompt_log.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/rate_limit.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/razorpay_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/rbac_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/reconsolidation.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/resilience.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/sleep_cycle.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/__init__.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/base.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/chat_session_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/integration_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l0_working_buffer.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l1_indexing_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l2_schema_graph.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l3_deep_recess.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l3_postgres.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/oauth_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/rbac_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/user_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/waitlist_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/web_events_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stripe_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/subscription_watchdog.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/temporal.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/test_suite.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tier_resolver.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tiers.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/topical_resonance.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tracer.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/usage.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_embeddings.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_pulse.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/waitlist_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/webhook_dispatcher.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/weblab.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/weblab_watcher.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/window_limits.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/write_metrics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/dependency_links.txt +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/entry_points.txt +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/requires.txt +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/top_level.txt +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_abuse_guard.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_admin.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_admin_seed.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_comprehensive.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_endpoints.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_usage_analytics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_auth.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_auth_me_api_key.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_autogen_memory.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_billing_e2e.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_burst_hardening.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_client_sdk.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_config.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_cost_forecast.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_crewai_provider.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_cross_llm_memory.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_debug_console.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_demo_llm.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_embeddings.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_cross_model_runtime.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_integration.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_ui.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_feedback_github.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_free_tier_lifecycle.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_full_api_coverage.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_funnel_metrics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_geo_gating.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_health_metrics.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_idempotency.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_integration_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_integration_sync_cli_contract.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_langgraph_store.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_llamaindex_block.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_mcp_connect.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_mcp_oauth.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_cycle.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_phase.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_service.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_write_no_schema_garbage.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_healthcheck.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_notifier.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_pricing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_reconciler.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_schema.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_writer.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_middleware.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_models.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_overage_billing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_performance.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_plasticity.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_pricing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_prototype_e2e.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_rate_limit.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_razorpay_billing.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_razorpay_subscription_webhooks.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_reconsolidation.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_regression.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_resilience.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_security.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_sleep_cycle.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_stores.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_subscription_watchdog.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_tier_resolver.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_tiers.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_usage.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_auth.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_embeddings.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_pulse.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_stories.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_waitlist.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_webhook_dispatcher.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_weblab.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_window_limits.py +0 -0
- {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_write_metrics.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clsplusplus
|
|
3
|
-
Version: 7.3.
|
|
3
|
+
Version: 7.3.2
|
|
4
4
|
Summary: Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama.
|
|
5
5
|
Author-email: AlphaForge AI Labs <contact@alphaforge.ai>
|
|
6
6
|
Maintainer-email: Rajamohan Jabbala <contact@alphaforge.ai>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "clsplusplus"
|
|
7
|
-
version = "7.3.
|
|
7
|
+
version = "7.3.2"
|
|
8
8
|
description = "Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -496,6 +496,10 @@ class PhaseMemoryItem:
|
|
|
496
496
|
# True = a newer fact on the same (subject, relation) dimension exists.
|
|
497
497
|
# Superseded items are hidden from default reads but never deleted.
|
|
498
498
|
superseded: bool = False
|
|
499
|
+
# Belief-revision provenance: lineage holds the ids of prior facts this item
|
|
500
|
+
# supersedes (oldest first); version increments on each adjudicated overwrite.
|
|
501
|
+
lineage: list = field(default_factory=list)
|
|
502
|
+
version: int = 1
|
|
499
503
|
|
|
500
504
|
# --- Crystallization (Liquid → Solid phase transition) ---
|
|
501
505
|
schema_meta: Optional[SchemaMeta] = None # Non-None = solid/glass phase
|
|
@@ -112,6 +112,8 @@ class MemoryService:
|
|
|
112
112
|
object=(phase_item.fact.value[:256] if phase_item.fact.value else None) or (req.object if req else None),
|
|
113
113
|
event_at=getattr(phase_item, "event_at", None),
|
|
114
114
|
superseded=getattr(phase_item, "superseded", False),
|
|
115
|
+
lineage=list(getattr(phase_item, "lineage", []) or []),
|
|
116
|
+
version=getattr(phase_item, "version", 1),
|
|
115
117
|
)
|
|
116
118
|
|
|
117
119
|
# =========================================================================
|
|
@@ -1245,6 +1247,7 @@ class MemoryService:
|
|
|
1245
1247
|
new_item = MemoryItem(text=new_text, namespace=namespace)
|
|
1246
1248
|
new_item = self.embedding_service.embed_item(new_item)
|
|
1247
1249
|
|
|
1250
|
+
revised = None # the gate-updated item carrying lineage/version, if any
|
|
1248
1251
|
if existing and existing.embedding:
|
|
1249
1252
|
updated, archived, should_engrave = self.reconsolidation.prepare_for_reconsolidation(
|
|
1250
1253
|
new_item, existing, evidence,
|
|
@@ -1252,6 +1255,7 @@ class MemoryService:
|
|
|
1252
1255
|
if not should_engrave:
|
|
1253
1256
|
# Quorum not met — return existing unchanged
|
|
1254
1257
|
return existing
|
|
1258
|
+
revised = updated # lineage = old.lineage + [old.id], version = old.version + 1
|
|
1255
1259
|
|
|
1256
1260
|
# Quorum met (or no existing) — store via PhaseMemoryEngine
|
|
1257
1261
|
req = WriteRequest(
|
|
@@ -1260,7 +1264,30 @@ class MemoryService:
|
|
|
1260
1264
|
source="adjudicate",
|
|
1261
1265
|
authority=1.0, # High authority for adjudicated facts
|
|
1262
1266
|
)
|
|
1263
|
-
|
|
1267
|
+
result = await self.write(req)
|
|
1268
|
+
|
|
1269
|
+
# Persist belief-revision provenance: carry the gate's lineage/version onto
|
|
1270
|
+
# the engraved fact and archive (never delete) the superseded one. Without
|
|
1271
|
+
# this the overwrite would land as a fresh v1 with no history — the gap a
|
|
1272
|
+
# naive "latest wins" store (e.g. Mem0 #4536) leaves behind.
|
|
1273
|
+
if revised is not None:
|
|
1274
|
+
new_phase = self.engine._item_by_id.get(result.id)
|
|
1275
|
+
if new_phase is not None:
|
|
1276
|
+
new_phase.lineage = list(revised.lineage)
|
|
1277
|
+
new_phase.version = revised.version
|
|
1278
|
+
result.lineage = list(revised.lineage)
|
|
1279
|
+
result.version = revised.version
|
|
1280
|
+
if existing is not None:
|
|
1281
|
+
old_phase = self.engine._item_by_id.get(existing.id)
|
|
1282
|
+
if old_phase is not None:
|
|
1283
|
+
old_phase.superseded = True
|
|
1284
|
+
# Best-effort durable archive of the superseded fact in L1.
|
|
1285
|
+
try:
|
|
1286
|
+
await self.l1.update_superseded(existing.id, namespace)
|
|
1287
|
+
except Exception as _arch_err: # pragma: no cover - archive is best-effort
|
|
1288
|
+
logger.debug("Adjudicate archive (L1) non-fatal: %s", _arch_err)
|
|
1289
|
+
|
|
1290
|
+
return result
|
|
1264
1291
|
|
|
1265
1292
|
# =========================================================================
|
|
1266
1293
|
# Multi-hop read (Issue #36)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clsplusplus
|
|
3
|
-
Version: 7.3.
|
|
3
|
+
Version: 7.3.2
|
|
4
4
|
Summary: Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama.
|
|
5
5
|
Author-email: AlphaForge AI Labs <contact@alphaforge.ai>
|
|
6
6
|
Maintainer-email: Rajamohan Jabbala <contact@alphaforge.ai>
|
|
@@ -136,6 +136,7 @@ tests/test_langgraph_store.py
|
|
|
136
136
|
tests/test_llamaindex_block.py
|
|
137
137
|
tests/test_mcp_connect.py
|
|
138
138
|
tests/test_mcp_oauth.py
|
|
139
|
+
tests/test_mem0_failure_modes.py
|
|
139
140
|
tests/test_memory_cycle.py
|
|
140
141
|
tests/test_memory_phase.py
|
|
141
142
|
tests/test_memory_service.py
|