clsplusplus 7.4.0__tar.gz → 7.19.0__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.4.0/src/clsplusplus.egg-info → clsplusplus-7.19.0}/PKG-INFO +168 -58
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/README.md +160 -49
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/pyproject.toml +8 -9
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/__init__.py +9 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/abuse_guard.py +82 -5
- clsplusplus-7.19.0/src/clsplusplus/actor_critic.py +150 -0
- clsplusplus-7.19.0/src/clsplusplus/admin_kpis.py +161 -0
- clsplusplus-7.19.0/src/clsplusplus/agent_orchestrator.py +697 -0
- clsplusplus-7.19.0/src/clsplusplus/agent_routes.py +535 -0
- clsplusplus-7.19.0/src/clsplusplus/agent_scheduler.py +166 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/__init__.py +0 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/bundle_optimizer_agent.py +74 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/bundle_pricing_agent.py +32 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/competitive_bundle_agent.py +39 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/dynamic_pricing_agent.py +68 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/eng_status.py +98 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/marketing_agent.py +758 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/orchestrator.py +238 -0
- clsplusplus-7.19.0/src/clsplusplus/agents/psychological_pricing.py +324 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/api.py +980 -66
- clsplusplus-7.19.0/src/clsplusplus/autopilot_routes.py +59 -0
- clsplusplus-7.19.0/src/clsplusplus/autopilot_service.py +279 -0
- clsplusplus-7.19.0/src/clsplusplus/bundle_optimizer.py +165 -0
- clsplusplus-7.19.0/src/clsplusplus/bundle_rl.py +178 -0
- clsplusplus-7.19.0/src/clsplusplus/bundle_store.py +76 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/cli.py +187 -15
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/client.py +12 -1
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/__init__.py +11 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/a2c_crawler.py +207 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/a3c_validator.py +81 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/competitive_ac.py +371 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/judge.py +67 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/memory_sync.py +69 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/news_fetcher.py +269 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/news_table.py +90 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/pipeline.py +150 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/position_table.py +51 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_intel/reliability_matrix.py +58 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_pricing.py +18 -0
- clsplusplus-7.19.0/src/clsplusplus/competitive_routes.py +199 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/config.py +98 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/cost_forecast.py +256 -32
- clsplusplus-7.19.0/src/clsplusplus/currency.py +163 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/demo_llm.py +11 -9
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/demo_llm_calls.py +63 -0
- clsplusplus-7.19.0/src/clsplusplus/distribution.py +491 -0
- clsplusplus-7.19.0/src/clsplusplus/docs_routes.py +168 -0
- clsplusplus-7.19.0/src/clsplusplus/email_sequencer.py +213 -0
- clsplusplus-7.19.0/src/clsplusplus/feature_catalog.py +165 -0
- clsplusplus-7.19.0/src/clsplusplus/founder_alert.py +173 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/geo.py +11 -1
- clsplusplus-7.19.0/src/clsplusplus/growth_bandit.py +409 -0
- clsplusplus-7.19.0/src/clsplusplus/growth_funnel.py +175 -0
- clsplusplus-7.19.0/src/clsplusplus/help_routes.py +93 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/homepage_autopromote.py +5 -1
- clsplusplus-7.19.0/src/clsplusplus/infra_stack.py +137 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integration_service.py +6 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/local_routes.py +14 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/mcp_http.py +4 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/mcp_server.py +5 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/memory_phase.py +102 -18
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/memory_service.py +114 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/billing.py +8 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/reconciler.py +26 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/middleware.py +108 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/models.py +6 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/oauth_server.py +1 -1
- clsplusplus-7.19.0/src/clsplusplus/outreach.py +98 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/pricing.py +218 -34
- clsplusplus-7.19.0/src/clsplusplus/pricing_ladder.py +288 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/pricing_models.py +11 -4
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/pricing_store.py +101 -5
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/razorpay_service.py +197 -12
- clsplusplus-7.19.0/src/clsplusplus/social_oauth.py +133 -0
- clsplusplus-7.19.0/src/clsplusplus/stores/agent_store.py +868 -0
- clsplusplus-7.19.0/src/clsplusplus/stores/competitive_store.py +400 -0
- clsplusplus-7.19.0/src/clsplusplus/stores/help_store.py +163 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/integration_store.py +13 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/user_store.py +632 -10
- clsplusplus-7.19.0/src/clsplusplus/suchi_oncall.py +402 -0
- clsplusplus-7.19.0/src/clsplusplus/support_autoheal.py +163 -0
- clsplusplus-7.19.0/src/clsplusplus/support_triage.py +174 -0
- clsplusplus-7.19.0/src/clsplusplus/telegram_notify.py +92 -0
- clsplusplus-7.19.0/src/clsplusplus/textmebot_notify.py +108 -0
- clsplusplus-7.19.0/src/clsplusplus/tier_bundles.py +239 -0
- clsplusplus-7.19.0/src/clsplusplus/tier_gates.py +119 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/tiers.py +3 -3
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/user_service.py +32 -7
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/waitlist_service.py +2 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/weblab_watcher.py +73 -5
- clsplusplus-7.19.0/src/clsplusplus/whatsapp_cli.py +107 -0
- clsplusplus-7.19.0/src/clsplusplus/whatsapp_notify.py +173 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0/src/clsplusplus.egg-info}/PKG-INFO +168 -58
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus.egg-info/SOURCES.txt +97 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_abuse_guard.py +131 -0
- clsplusplus-7.19.0/tests/test_admin_kpis.py +126 -0
- clsplusplus-7.19.0/tests/test_admission_control.py +75 -0
- clsplusplus-7.19.0/tests/test_agent_endpoints.py +275 -0
- clsplusplus-7.19.0/tests/test_agent_scheduler.py +116 -0
- clsplusplus-7.19.0/tests/test_agents.py +182 -0
- clsplusplus-7.19.0/tests/test_agents_e2e.py +111 -0
- clsplusplus-7.19.0/tests/test_autopilot.py +50 -0
- clsplusplus-7.19.0/tests/test_bench.py +127 -0
- clsplusplus-7.19.0/tests/test_benchmark_query_expansion.py +160 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_billing_e2e.py +4 -0
- clsplusplus-7.19.0/tests/test_billing_subscription.py +182 -0
- clsplusplus-7.19.0/tests/test_bundle_optimizer.py +39 -0
- clsplusplus-7.19.0/tests/test_bundle_rl.py +35 -0
- clsplusplus-7.19.0/tests/test_cli_commands.py +177 -0
- clsplusplus-7.19.0/tests/test_competitive_ac.py +76 -0
- clsplusplus-7.19.0/tests/test_competitive_intel.py +276 -0
- clsplusplus-7.19.0/tests/test_contact_log_idempotency.py +156 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_cost_forecast.py +68 -1
- clsplusplus-7.19.0/tests/test_currency.py +138 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_demo_llm.py +3 -1
- clsplusplus-7.19.0/tests/test_docs_routes.py +45 -0
- clsplusplus-7.19.0/tests/test_email_sequencer.py +121 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_extension_ui.py +4 -3
- clsplusplus-7.19.0/tests/test_feature_catalog.py +37 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_feedback_github.py +6 -1
- clsplusplus-7.19.0/tests/test_geo_vercel.py +33 -0
- clsplusplus-7.19.0/tests/test_growth_distribution.py +514 -0
- clsplusplus-7.19.0/tests/test_help_endpoints.py +114 -0
- clsplusplus-7.19.0/tests/test_infra_stack.py +72 -0
- clsplusplus-7.19.0/tests/test_input_validation.py +37 -0
- clsplusplus-7.19.0/tests/test_issue585_cli_extension_sync.py +145 -0
- clsplusplus-7.19.0/tests/test_longmemeval_multisession.py +110 -0
- clsplusplus-7.19.0/tests/test_longmemeval_routing.py +74 -0
- clsplusplus-7.19.0/tests/test_marketing_agent.py +423 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_memory_phase.py +489 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_memory_service.py +197 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_reconciler.py +39 -6
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_middleware.py +49 -0
- clsplusplus-7.19.0/tests/test_namespace_isolation.py +37 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_overage_billing.py +37 -1
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_pricing.py +6 -4
- clsplusplus-7.19.0/tests/test_pricing_pipeline.py +149 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_prototype_e2e.py +36 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_razorpay_billing.py +8 -8
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_reconsolidation.py +14 -24
- clsplusplus-7.19.0/tests/test_schema_artifact_not_indexed.py +125 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_security.py +58 -0
- clsplusplus-7.19.0/tests/test_security_hardening.py +50 -0
- clsplusplus-7.19.0/tests/test_standup_gate.py +69 -0
- clsplusplus-7.19.0/tests/test_support_autoheal.py +157 -0
- clsplusplus-7.19.0/tests/test_support_endpoints.py +162 -0
- clsplusplus-7.19.0/tests/test_support_triage.py +244 -0
- clsplusplus-7.19.0/tests/test_tier_bundles.py +42 -0
- clsplusplus-7.19.0/tests/test_tier_gates.py +39 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_user_auth.py +45 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_weblab.py +63 -0
- clsplusplus-7.19.0/tests/test_whatsapp_notify.py +19 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/LICENSE +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/setup.cfg +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/api_usage_analytics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/auth.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/cost_model.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/debug_console.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/demo_local.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/durable_log/__init__.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/durable_log/file_wal.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/durable_log/manager.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/durable_log/record.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/durable_log/replicas.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/email_service.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/embeddings.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/funnel_routes.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/health_metrics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/idempotency.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integrations/__init__.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integrations/autogen.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integrations/crewai.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integrations/langgraph.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/integrations/llamaindex.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/jwt_utils.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/login_activity.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/main.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/memory_cycle.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/__init__.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/__main__.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/healthcheck.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/notifier.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/pricing.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/schema.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metering_v2/writer.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/metrics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/namespace_resolver.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/permissions.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/plasticity.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/prompt_log.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/rate_limit.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/rbac_service.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/reconsolidation.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/resilience.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/sleep_cycle.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/__init__.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/base.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/chat_session_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/l0_working_buffer.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/l1_indexing_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/l2_schema_graph.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/l3_deep_recess.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/l3_postgres.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/oauth_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/rbac_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/waitlist_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stores/web_events_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/stripe_service.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/subscription_watchdog.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/temporal.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/test_suite.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/tier_resolver.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/topical_resonance.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/tracer.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/usage.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/user_embeddings.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/user_pulse.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/webhook_dispatcher.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/weblab.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/window_limits.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus/write_metrics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus.egg-info/dependency_links.txt +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus.egg-info/entry_points.txt +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus.egg-info/requires.txt +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/src/clsplusplus.egg-info/top_level.txt +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_admin.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_admin_integrations_activity.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_admin_seed.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_api.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_api_comprehensive.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_api_endpoints.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_api_usage_analytics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_auth.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_auth_me_api_key.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_autogen_memory.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_burst_hardening.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_client_sdk.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_config.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_crewai_provider.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_cross_llm_memory.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_debug_console.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_durable_log.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_embeddings.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_extension_cross_model_runtime.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_extension_integration.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_free_tier_lifecycle.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_full_api_coverage.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_funnel_metrics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_geo_gating.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_health_metrics.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_idempotency.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_integration_service.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_integration_sync_cli_contract.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_langgraph_store.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_llamaindex_block.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_mcp_connect.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_mcp_oauth.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_mem0_failure_modes.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_memory_cycle.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_memory_write_no_schema_garbage.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_healthcheck.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_notifier.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_pricing.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_schema.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_metering_v2_writer.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_models.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_performance.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_plasticity.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_rate_limit.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_razorpay_subscription_webhooks.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_regression.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_resilience.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_sleep_cycle.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_stores.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_subscription_watchdog.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_tier_resolver.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_tiers.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_usage.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_user_embeddings.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_user_pulse.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_user_stories.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_waitlist.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_webhook_dispatcher.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_window_limits.py +0 -0
- {clsplusplus-7.4.0 → clsplusplus-7.19.0}/tests/test_write_metrics.py +0 -0
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clsplusplus
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.19.0
|
|
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>
|
|
7
7
|
License: Apache-2.0
|
|
8
|
-
Project-URL: Homepage, https://
|
|
9
|
-
Project-URL: Documentation, https://
|
|
10
|
-
Project-URL: Repository, https://
|
|
11
|
-
Project-URL: Bug Tracker, https://
|
|
12
|
-
Project-URL: Changelog, https://
|
|
13
|
-
Project-URL: API Reference, https://
|
|
14
|
-
Project-URL:
|
|
15
|
-
Project-URL: Download, https://github.com/rajamohan1950/CLSplusplus/releases
|
|
8
|
+
Project-URL: Homepage, https://www.clsplusplus.com
|
|
9
|
+
Project-URL: Documentation, https://www.clsplusplus.com/api-docs
|
|
10
|
+
Project-URL: Repository, https://www.clsplusplus.com
|
|
11
|
+
Project-URL: Bug Tracker, https://www.clsplusplus.com/tickets
|
|
12
|
+
Project-URL: Changelog, https://www.clsplusplus.com
|
|
13
|
+
Project-URL: API Reference, https://www.clsplusplus.com/api-docs
|
|
14
|
+
Project-URL: Download, https://pypi.org/project/clsplusplus/
|
|
16
15
|
Keywords: llm,memory,ai,persistent-memory,model-agnostic,brain,openai,anthropic,claude,gemini,langchain,continuous-learning,semantic-search,vector-database,conversational-ai,rag,context-window
|
|
17
16
|
Classifier: Development Status :: 5 - Production/Stable
|
|
18
17
|
Classifier: Intended Audience :: Developers
|
|
@@ -72,7 +71,7 @@ Dynamic: license-file
|
|
|
72
71
|
|
|
73
72
|
<!-- mcp-name: io.github.rajamohan1950/cls-memory -->
|
|
74
73
|
<p align="center">
|
|
75
|
-
<img src="https://img.shields.io/badge/CLS%2B%2B-Memory%20for%20LLMs-6366f1?style=for-the-badge
|
|
74
|
+
<img src="https://img.shields.io/badge/CLS%2B%2B-Memory%20for%20LLMs-6366f1?style=for-the-badge" alt="CLS++" />
|
|
76
75
|
</p>
|
|
77
76
|
|
|
78
77
|
<h1 align="center">CLS++ — Continuous Learning System++</h1>
|
|
@@ -81,11 +80,12 @@ Dynamic: license-file
|
|
|
81
80
|
</p>
|
|
82
81
|
|
|
83
82
|
<p align="center">
|
|
84
|
-
<a href="
|
|
85
|
-
<a href="
|
|
86
|
-
<a href="
|
|
87
|
-
<a href="
|
|
88
|
-
<a href="
|
|
83
|
+
<a href="#quick-start">Quick Start</a> •
|
|
84
|
+
<a href="#connect-via-mcp-claude-cursor-windsurf-chatgpt">MCP</a> •
|
|
85
|
+
<a href="#agent-framework-integrations">Integrations</a> •
|
|
86
|
+
<a href="#architecture">Architecture</a> •
|
|
87
|
+
<a href="#documentation">Documentation</a> •
|
|
88
|
+
<a href="#deployment">Deployment</a>
|
|
89
89
|
</p>
|
|
90
90
|
|
|
91
91
|
<p align="center">
|
|
@@ -93,8 +93,8 @@ Dynamic: license-file
|
|
|
93
93
|
<a href="https://www.npmjs.com/package/clsplusplus"><img src="https://img.shields.io/npm/v/clsplusplus?style=flat-square&label=npm&color=cb3837" alt="npm" /></a>
|
|
94
94
|
<a href="https://pypi.org/project/clsplusplus/"><img src="https://img.shields.io/pypi/pyversions/clsplusplus?style=flat-square" alt="Python" /></a>
|
|
95
95
|
<a href="https://www.clsplusplus.com/docs"><img src="https://img.shields.io/badge/API-Live%20at%20www.clsplusplus.com-22c55e?style=flat-square" alt="API" /></a>
|
|
96
|
-
<a href="https://
|
|
97
|
-
<a href="https://
|
|
96
|
+
<a href="https://www.clsplusplus.com"><img src="https://img.shields.io/badge/License-Apache%202.0-blue?style=flat-square" alt="License" /></a>
|
|
97
|
+
<a href="https://www.clsplusplus.com"><img src="https://img.shields.io/badge/Patent-Oct%202025-blue?style=flat-square" alt="Patent" /></a>
|
|
98
98
|
</p>
|
|
99
99
|
|
|
100
100
|
---
|
|
@@ -122,10 +122,24 @@ Memory is **external** to the model. **Switch models anytime.** No reset.
|
|
|
122
122
|
### Install
|
|
123
123
|
|
|
124
124
|
```bash
|
|
125
|
-
pip install clsplusplus # Python (lightweight: only httpx + pydantic)
|
|
126
|
-
npm install clsplusplus # JavaScript / TypeScript (zero
|
|
125
|
+
pip install clsplusplus # Python SDK (lightweight: only httpx + pydantic)
|
|
126
|
+
npm install clsplusplus # JavaScript / TypeScript SDK (zero runtime deps)
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
+
Optional Python extras pull in framework adapters or the full server:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
pip install clsplusplus[server] # run the FastAPI server yourself
|
|
133
|
+
pip install clsplusplus[crewai] # CrewAI memory adapter
|
|
134
|
+
pip install clsplusplus[langgraph] # LangGraph memory store
|
|
135
|
+
pip install clsplusplus[llamaindex] # LlamaIndex memory block
|
|
136
|
+
pip install clsplusplus[autogen] # Microsoft AutoGen memory provider
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Both the PyPI and npm packages are named **`clsplusplus`** and ship the same
|
|
140
|
+
`Brain` API. The npm package is a real TypeScript SDK (not just a CLI) — it
|
|
141
|
+
mirrors the Python SDK method-for-method.
|
|
142
|
+
|
|
129
143
|
### Python SDK
|
|
130
144
|
|
|
131
145
|
```python
|
|
@@ -178,43 +192,128 @@ response = chat("You are a helpful assistant", "Help me with Python")
|
|
|
178
192
|
# calls your LLM, learns from the exchange, returns response.
|
|
179
193
|
```
|
|
180
194
|
|
|
181
|
-
### Full API
|
|
195
|
+
### Full SDK API
|
|
196
|
+
|
|
197
|
+
The `Brain` class is identical in the Python and JS/TS SDKs (the JS methods
|
|
198
|
+
are `async`). Constructor: `Brain(user, api_key=None, url=None)` in Python,
|
|
199
|
+
`new Brain(user, { apiKey, url })` in TypeScript. Both read `CLS_API_KEY` and
|
|
200
|
+
`CLS_BASE_URL` from the environment when not passed; `url` defaults to
|
|
201
|
+
`https://www.clsplusplus.com`.
|
|
182
202
|
|
|
183
203
|
| Method | Description |
|
|
184
204
|
|--------|-------------|
|
|
185
|
-
| `brain.learn(fact)` | Teach a fact. Returns memory ID. |
|
|
186
|
-
| `brain.ask(question)` | Query for relevant facts. Returns list. |
|
|
187
|
-
| `brain.context(topic)` | Get LLM-ready context string. |
|
|
188
|
-
| `brain.forget(
|
|
189
|
-
| `brain.absorb(
|
|
190
|
-
| `brain.who()` | Auto-generated user profile. |
|
|
191
|
-
| `brain.correct(
|
|
192
|
-
| `brain.chat(message,
|
|
193
|
-
| `brain.teach(dict)` | Learn from structured data. |
|
|
194
|
-
| `brain.watch(messages)` | Learn from chat
|
|
205
|
+
| `brain.learn(fact, **meta)` | Teach a fact. Returns memory ID. |
|
|
206
|
+
| `brain.ask(question, limit=5)` | Query for relevant facts. Returns list of strings. |
|
|
207
|
+
| `brain.context(topic="", limit=8)` | Get LLM-ready context string. |
|
|
208
|
+
| `brain.forget(fact_or_id)` | Forget by text or ID. Returns bool. |
|
|
209
|
+
| `brain.absorb(content, source="document")` | Bulk-learn from document, conversation, or list. |
|
|
210
|
+
| `brain.who()` | Auto-generated user profile dict. |
|
|
211
|
+
| `brain.correct(wrong, right)` | Update a belief (forget + learn). |
|
|
212
|
+
| `brain.chat(message, llm_fn=None)` | Full conversation handler with memory. |
|
|
213
|
+
| `brain.teach(dict)` | Learn from structured key/value data. |
|
|
214
|
+
| `brain.watch(messages)` | Learn from a list of chat messages. |
|
|
195
215
|
| `brain.wrap(fn)` | Wrap any LLM function with auto-memory. |
|
|
216
|
+
| `brain.all(limit=50)` / `brain.count()` | List / count what's stored. |
|
|
217
|
+
|
|
218
|
+
Module-level one-liners (Python: `import clsplusplus as mem`; TS:
|
|
219
|
+
`import { learn, ask } from "clsplusplus"`) wrap a per-user `Brain`:
|
|
220
|
+
`learn(user, fact)`, `ask(user, question)`, `context(user, topic)`,
|
|
221
|
+
`forget(user, fact_or_id)`.
|
|
196
222
|
|
|
197
|
-
|
|
223
|
+
A lower-level `CLSClient` (alias `CLS`) is also exported for direct
|
|
224
|
+
`write` / `read` / `get_item` / `forget` / `sleep` / `health` calls against
|
|
225
|
+
the REST API — see the [API Reference](docs/API_DOCUMENTATION.md).
|
|
226
|
+
|
|
227
|
+
### Connect via MCP (Claude, Cursor, Windsurf, ChatGPT)
|
|
228
|
+
|
|
229
|
+
CLS++ ships a [Model Context Protocol](https://modelcontextprotocol.io) server
|
|
230
|
+
exposing three tools — `recall_memories`, `store_memory`, `who_am_i` — so any
|
|
231
|
+
MCP client can read and write the same memory. Registry name:
|
|
232
|
+
`io.github.rajamohan1950/cls-memory`.
|
|
233
|
+
|
|
234
|
+
**Remote (hosted, OAuth)** — add `https://www.clsplusplus.com/mcp` as a custom
|
|
235
|
+
connector. The OAuth 2.1 + PKCE + Dynamic Client Registration flow handles
|
|
236
|
+
auth; no API key to paste.
|
|
237
|
+
|
|
238
|
+
**Local (stdio)** — run the bundled server with an API key:
|
|
198
239
|
|
|
199
240
|
```bash
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
241
|
+
pip install clsplusplus
|
|
242
|
+
# one-line install for Claude Code:
|
|
243
|
+
claude mcp add cls-memory \
|
|
244
|
+
--env CLS_API_URL=https://www.clsplusplus.com \
|
|
245
|
+
--env CLS_API_KEY=cls_live_xxx \
|
|
246
|
+
-- python3 -m clsplusplus.mcp_server
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Or paste this into `.claude/settings.json` (Cursor/Windsurf use the same shape
|
|
250
|
+
in their MCP config):
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"mcpServers": {
|
|
255
|
+
"cls-memory": {
|
|
256
|
+
"command": "python3",
|
|
257
|
+
"args": ["-m", "clsplusplus.mcp_server"],
|
|
258
|
+
"env": {
|
|
259
|
+
"CLS_API_URL": "https://www.clsplusplus.com",
|
|
260
|
+
"CLS_API_KEY": "cls_live_xxx"
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
The dashboard's **Connect** button (`GET /v1/mcp/connect`) mints a fresh key and
|
|
268
|
+
returns this exact block pre-filled. Create keys manually at
|
|
269
|
+
<https://www.clsplusplus.com/profile#api-keys>.
|
|
270
|
+
|
|
271
|
+
### Agent-framework integrations
|
|
272
|
+
|
|
273
|
+
CLS++ ships native memory adapters for four agent frameworks. Each is an
|
|
274
|
+
optional extra and lazily imported — the base package never requires the
|
|
275
|
+
framework. Full setup in [docs/integrations](docs/integrations/).
|
|
203
276
|
|
|
204
|
-
|
|
205
|
-
|
|
277
|
+
| Framework | Install | Class | Plugs in as |
|
|
278
|
+
|-----------|---------|-------|-------------|
|
|
279
|
+
| **CrewAI** | `pip install clsplusplus[crewai]` | `clsplusplus.integrations.crewai.CLSMemoryStorage` | `ExternalMemory(storage=...)` — [docs](docs/integrations/crewai.md) |
|
|
280
|
+
| **LangGraph** | `pip install clsplusplus[langgraph]` | `clsplusplus.integrations.langgraph.CLSMemoryStore` | `graph.compile(store=...)` — [docs](docs/integrations/langgraph.md) |
|
|
281
|
+
| **LlamaIndex** | `pip install clsplusplus[llamaindex]` | `clsplusplus.integrations.llamaindex.CLSMemoryBlock` | `Memory.from_defaults(memory_blocks=[...])` — [docs](docs/integrations/llamaindex.md) |
|
|
282
|
+
| **AutoGen** | `pip install clsplusplus[autogen]` | `clsplusplus.integrations.autogen.CLSMemory` | `AssistantAgent(memory=[...])` — [docs](docs/integrations/autogen.md) |
|
|
206
283
|
|
|
207
|
-
|
|
208
|
-
|
|
284
|
+
```python
|
|
285
|
+
# Example: CrewAI
|
|
286
|
+
from crewai import Crew
|
|
287
|
+
from crewai.memory.external.external_memory import ExternalMemory
|
|
288
|
+
from clsplusplus.integrations.crewai import CLSMemoryStorage
|
|
289
|
+
|
|
290
|
+
crew = Crew(
|
|
291
|
+
agents=[...], tasks=[...], memory=True,
|
|
292
|
+
external_memory=ExternalMemory(storage=CLSMemoryStorage(user="my-crew")),
|
|
293
|
+
)
|
|
209
294
|
```
|
|
210
295
|
|
|
296
|
+
Editor integrations (Cursor, Codex, n8n) also have guides under
|
|
297
|
+
[docs/integrations](docs/integrations/).
|
|
298
|
+
|
|
299
|
+
### Managed service
|
|
300
|
+
|
|
301
|
+
CLS++ runs as a fully managed service — no infrastructure to host. Install the
|
|
302
|
+
SDK and point it at the hosted API:
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
pip install clsplusplus # or: npm install clsplusplus
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Get an API key and start storing memory at **[clsplusplus.com](https://www.clsplusplus.com)**.
|
|
309
|
+
|
|
211
310
|
---
|
|
212
311
|
|
|
213
312
|
## Try It Live
|
|
214
313
|
|
|
215
314
|
**[Try the demo](https://www.clsplusplus.com)** — Tell Claude something, ask OpenAI. Same memory. No sign-up.
|
|
216
315
|
|
|
217
|
-
The Chrome extension (Web Store,
|
|
316
|
+
The Chrome extension (Web Store, v7.4.1) captures user messages from
|
|
218
317
|
ChatGPT, Claude, and Gemini chat pages automatically and feeds them through
|
|
219
318
|
the same memory pipeline. Host permissions: `chatgpt.com`,
|
|
220
319
|
`chat.openai.com`, `claude.ai`, `gemini.google.com`. The Link Account popup
|
|
@@ -276,29 +375,32 @@ export CLS_ABUSE_WHITELIST_IPS= # comma-separated operator IPs
|
|
|
276
375
|
Requests carrying a valid API key are exempt from auth-fail flood counting
|
|
277
376
|
(see `src/clsplusplus/abuse_guard.py`).
|
|
278
377
|
|
|
279
|
-
Product endpoints: `POST /v1/memories/encode`, `POST /v1/memories/retrieve`, `DELETE /v1/memories/forget`, `GET /v1/health/score
|
|
378
|
+
Product endpoints: `POST /v1/memories/encode`, `POST /v1/memories/retrieve`, `DELETE /v1/memories/forget`, `GET /v1/health/score`, `GET /v1/pricing`, `GET /v1/version`, plus the in-app support desk (`POST /v1/feedback`, `GET /v1/support/mine`, `POST /v1/support/{id}/rate`). See [SaaS docs](docs/SAAS_MEMORY_AS_SERVICE.md).
|
|
379
|
+
|
|
380
|
+
> Memory reads/writes are bound to the caller's own namespace server-side
|
|
381
|
+
> (`_owned_namespace_for` in `api.py`): a signed-in user can never read another
|
|
382
|
+
> tenant's memories by passing a namespace.
|
|
280
383
|
|
|
281
384
|
### Pricing
|
|
282
385
|
|
|
283
|
-
CLS++ launched in India and bills
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
386
|
+
CLS++ launched in India and bills via **Razorpay (UPI / QR)**. Pricing is
|
|
387
|
+
**country-based** — Indian users are billed in **₹**, US in **$**, EU in **€**,
|
|
388
|
+
resolved from the request's country (`src/clsplusplus/currency.py`). Published
|
|
389
|
+
monthly tiers: **Pro ₹999 / $29**, **Business ₹3,999 / $99**, **Enterprise
|
|
390
|
+
₹14,999 / $499**, plus a free tier. Per-tier feature bundles are optimized by
|
|
391
|
+
the `bundle-pricing` agent and exposed on `GET /v1/pricing`. The pricing control
|
|
392
|
+
plane lives inside the CLS++ memory layer itself (reserved namespace
|
|
393
|
+
`__cls_pricing__`), operator-tunable at runtime via `POST /admin/pricing/config`;
|
|
394
|
+
defaults are seeded by `src/clsplusplus/pricing_store.py`. `GET /v1/pricing` is a
|
|
290
395
|
public, abuse-exempt endpoint.
|
|
291
396
|
|
|
292
397
|
---
|
|
293
398
|
|
|
294
399
|
## Deployment
|
|
295
400
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
| **AWS Free Tier** | [CloudFormation](infrastructure/aws/cloudformation-free-tier.yaml) • [Step-by-step](infrastructure/aws/FREE_TIER_GUIDE.md) |
|
|
300
|
-
| **AWS** | [CloudFormation](infrastructure/aws/cloudformation.yaml) |
|
|
301
|
-
| **Azure** | [ARM template](infrastructure/azure/arm-template.json) |
|
|
401
|
+
CLS++ is a managed, hosted service — there's nothing to deploy. The production
|
|
402
|
+
API runs at **[www.clsplusplus.com](https://www.clsplusplus.com)**; enterprise
|
|
403
|
+
and on-prem options are available on request.
|
|
302
404
|
|
|
303
405
|
---
|
|
304
406
|
|
|
@@ -306,7 +408,9 @@ public, abuse-exempt endpoint.
|
|
|
306
408
|
|
|
307
409
|
| Document | Description |
|
|
308
410
|
|----------|-------------|
|
|
411
|
+
| [Architecture Overview](docs/ARCHITECTURE.md) | Components, stores, data flow, MCP |
|
|
309
412
|
| [API Reference](docs/API_DOCUMENTATION.md) | Endpoints, auth, examples |
|
|
413
|
+
| [Integrations](docs/integrations/) | CrewAI, LangGraph, LlamaIndex, AutoGen, Cursor, Codex, n8n |
|
|
310
414
|
| [API Blueprint](docs/API_BLUEPRINT.md) | SaaS API playbook (DX, security, billing) |
|
|
311
415
|
| [SaaS Strategy](docs/SAAS_MEMORY_AS_SERVICE.md) | Memory-as-a-Service, pricing |
|
|
312
416
|
| [Marketplace Integration](docs/MARKETPLACE_INTEGRATION.md) | AWS, Azure, GCP, OCI |
|
|
@@ -326,10 +430,16 @@ public, abuse-exempt endpoint.
|
|
|
326
430
|
- [x] Reconsolidation gate
|
|
327
431
|
- [x] API key auth + rate limiting
|
|
328
432
|
- [x] SaaS product endpoints
|
|
329
|
-
- [x] Chrome extension (
|
|
433
|
+
- [x] Chrome extension (v7.4.1) capturing ChatGPT / Claude / Gemini
|
|
434
|
+
- [x] Remote MCP server (OAuth 2.1 + PKCE + DCR) + stdio MCP server
|
|
435
|
+
- [x] Native CrewAI / LangGraph / LlamaIndex / AutoGen memory adapters
|
|
330
436
|
- [x] Abuse-guard with env-tunable thresholds and operator IP whitelist
|
|
331
437
|
- [x] PostHog Weblab — staged rollouts with auto-rollback (5xx > 2% or p95 > 3s)
|
|
332
|
-
- [x]
|
|
438
|
+
- [x] Country-based pricing (₹ / $ / €) + agent-optimized feature bundles (Razorpay / UPI), memory-resident control plane
|
|
439
|
+
- [x] In-app support desk ("Doctor") — agent-triaged feedback / bugs / questions with auto-resolution + per-user timeline
|
|
440
|
+
- [x] Company agent platform — `doctor-*`, `dynamic-pricing`, `bundle-pricing`, `competitive-intel`, `marketing-growth`
|
|
441
|
+
- [x] `cls bench` — runnable reliability reproductions (silent-loss, delete-on-conflict, dimension-switch, empty-extraction)
|
|
442
|
+
- [x] Per-user memory isolation (server-side namespace binding)
|
|
333
443
|
|
|
334
444
|
## Recent Architectural Decisions
|
|
335
445
|
|
|
@@ -360,9 +470,9 @@ container ships operator scripts at `/app/scripts/` (see
|
|
|
360
470
|
|
|
361
471
|
---
|
|
362
472
|
|
|
363
|
-
##
|
|
473
|
+
## Support
|
|
364
474
|
|
|
365
|
-
|
|
475
|
+
Questions or enterprise enquiries: **[clsplusplus.com](https://www.clsplusplus.com)** or open a ticket at [clsplusplus.com/tickets](https://www.clsplusplus.com/tickets).
|
|
366
476
|
|
|
367
477
|
---
|
|
368
478
|
|
|
@@ -373,5 +483,5 @@ Provisional patent filed October 2025. Apache 2.0 (see [LICENSE](LICENSE)).
|
|
|
373
483
|
---
|
|
374
484
|
|
|
375
485
|
<p align="center">
|
|
376
|
-
<strong>AlphaForge AI Labs</strong> • <a href="https://
|
|
486
|
+
<strong>AlphaForge AI Labs</strong> • <a href="https://www.clsplusplus.com">clsplusplus.com</a> • 2026
|
|
377
487
|
</p>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!-- mcp-name: io.github.rajamohan1950/cls-memory -->
|
|
2
2
|
<p align="center">
|
|
3
|
-
<img src="https://img.shields.io/badge/CLS%2B%2B-Memory%20for%20LLMs-6366f1?style=for-the-badge
|
|
3
|
+
<img src="https://img.shields.io/badge/CLS%2B%2B-Memory%20for%20LLMs-6366f1?style=for-the-badge" alt="CLS++" />
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
6
|
<h1 align="center">CLS++ — Continuous Learning System++</h1>
|
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<a href="
|
|
13
|
-
<a href="
|
|
14
|
-
<a href="
|
|
15
|
-
<a href="
|
|
16
|
-
<a href="
|
|
12
|
+
<a href="#quick-start">Quick Start</a> •
|
|
13
|
+
<a href="#connect-via-mcp-claude-cursor-windsurf-chatgpt">MCP</a> •
|
|
14
|
+
<a href="#agent-framework-integrations">Integrations</a> •
|
|
15
|
+
<a href="#architecture">Architecture</a> •
|
|
16
|
+
<a href="#documentation">Documentation</a> •
|
|
17
|
+
<a href="#deployment">Deployment</a>
|
|
17
18
|
</p>
|
|
18
19
|
|
|
19
20
|
<p align="center">
|
|
@@ -21,8 +22,8 @@
|
|
|
21
22
|
<a href="https://www.npmjs.com/package/clsplusplus"><img src="https://img.shields.io/npm/v/clsplusplus?style=flat-square&label=npm&color=cb3837" alt="npm" /></a>
|
|
22
23
|
<a href="https://pypi.org/project/clsplusplus/"><img src="https://img.shields.io/pypi/pyversions/clsplusplus?style=flat-square" alt="Python" /></a>
|
|
23
24
|
<a href="https://www.clsplusplus.com/docs"><img src="https://img.shields.io/badge/API-Live%20at%20www.clsplusplus.com-22c55e?style=flat-square" alt="API" /></a>
|
|
24
|
-
<a href="https://
|
|
25
|
-
<a href="https://
|
|
25
|
+
<a href="https://www.clsplusplus.com"><img src="https://img.shields.io/badge/License-Apache%202.0-blue?style=flat-square" alt="License" /></a>
|
|
26
|
+
<a href="https://www.clsplusplus.com"><img src="https://img.shields.io/badge/Patent-Oct%202025-blue?style=flat-square" alt="Patent" /></a>
|
|
26
27
|
</p>
|
|
27
28
|
|
|
28
29
|
---
|
|
@@ -50,10 +51,24 @@ Memory is **external** to the model. **Switch models anytime.** No reset.
|
|
|
50
51
|
### Install
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
|
-
pip install clsplusplus # Python (lightweight: only httpx + pydantic)
|
|
54
|
-
npm install clsplusplus # JavaScript / TypeScript (zero
|
|
54
|
+
pip install clsplusplus # Python SDK (lightweight: only httpx + pydantic)
|
|
55
|
+
npm install clsplusplus # JavaScript / TypeScript SDK (zero runtime deps)
|
|
55
56
|
```
|
|
56
57
|
|
|
58
|
+
Optional Python extras pull in framework adapters or the full server:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install clsplusplus[server] # run the FastAPI server yourself
|
|
62
|
+
pip install clsplusplus[crewai] # CrewAI memory adapter
|
|
63
|
+
pip install clsplusplus[langgraph] # LangGraph memory store
|
|
64
|
+
pip install clsplusplus[llamaindex] # LlamaIndex memory block
|
|
65
|
+
pip install clsplusplus[autogen] # Microsoft AutoGen memory provider
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Both the PyPI and npm packages are named **`clsplusplus`** and ship the same
|
|
69
|
+
`Brain` API. The npm package is a real TypeScript SDK (not just a CLI) — it
|
|
70
|
+
mirrors the Python SDK method-for-method.
|
|
71
|
+
|
|
57
72
|
### Python SDK
|
|
58
73
|
|
|
59
74
|
```python
|
|
@@ -106,43 +121,128 @@ response = chat("You are a helpful assistant", "Help me with Python")
|
|
|
106
121
|
# calls your LLM, learns from the exchange, returns response.
|
|
107
122
|
```
|
|
108
123
|
|
|
109
|
-
### Full API
|
|
124
|
+
### Full SDK API
|
|
125
|
+
|
|
126
|
+
The `Brain` class is identical in the Python and JS/TS SDKs (the JS methods
|
|
127
|
+
are `async`). Constructor: `Brain(user, api_key=None, url=None)` in Python,
|
|
128
|
+
`new Brain(user, { apiKey, url })` in TypeScript. Both read `CLS_API_KEY` and
|
|
129
|
+
`CLS_BASE_URL` from the environment when not passed; `url` defaults to
|
|
130
|
+
`https://www.clsplusplus.com`.
|
|
110
131
|
|
|
111
132
|
| Method | Description |
|
|
112
133
|
|--------|-------------|
|
|
113
|
-
| `brain.learn(fact)` | Teach a fact. Returns memory ID. |
|
|
114
|
-
| `brain.ask(question)` | Query for relevant facts. Returns list. |
|
|
115
|
-
| `brain.context(topic)` | Get LLM-ready context string. |
|
|
116
|
-
| `brain.forget(
|
|
117
|
-
| `brain.absorb(
|
|
118
|
-
| `brain.who()` | Auto-generated user profile. |
|
|
119
|
-
| `brain.correct(
|
|
120
|
-
| `brain.chat(message,
|
|
121
|
-
| `brain.teach(dict)` | Learn from structured data. |
|
|
122
|
-
| `brain.watch(messages)` | Learn from chat
|
|
134
|
+
| `brain.learn(fact, **meta)` | Teach a fact. Returns memory ID. |
|
|
135
|
+
| `brain.ask(question, limit=5)` | Query for relevant facts. Returns list of strings. |
|
|
136
|
+
| `brain.context(topic="", limit=8)` | Get LLM-ready context string. |
|
|
137
|
+
| `brain.forget(fact_or_id)` | Forget by text or ID. Returns bool. |
|
|
138
|
+
| `brain.absorb(content, source="document")` | Bulk-learn from document, conversation, or list. |
|
|
139
|
+
| `brain.who()` | Auto-generated user profile dict. |
|
|
140
|
+
| `brain.correct(wrong, right)` | Update a belief (forget + learn). |
|
|
141
|
+
| `brain.chat(message, llm_fn=None)` | Full conversation handler with memory. |
|
|
142
|
+
| `brain.teach(dict)` | Learn from structured key/value data. |
|
|
143
|
+
| `brain.watch(messages)` | Learn from a list of chat messages. |
|
|
123
144
|
| `brain.wrap(fn)` | Wrap any LLM function with auto-memory. |
|
|
145
|
+
| `brain.all(limit=50)` / `brain.count()` | List / count what's stored. |
|
|
146
|
+
|
|
147
|
+
Module-level one-liners (Python: `import clsplusplus as mem`; TS:
|
|
148
|
+
`import { learn, ask } from "clsplusplus"`) wrap a per-user `Brain`:
|
|
149
|
+
`learn(user, fact)`, `ask(user, question)`, `context(user, topic)`,
|
|
150
|
+
`forget(user, fact_or_id)`.
|
|
124
151
|
|
|
125
|
-
|
|
152
|
+
A lower-level `CLSClient` (alias `CLS`) is also exported for direct
|
|
153
|
+
`write` / `read` / `get_item` / `forget` / `sleep` / `health` calls against
|
|
154
|
+
the REST API — see the [API Reference](docs/API_DOCUMENTATION.md).
|
|
155
|
+
|
|
156
|
+
### Connect via MCP (Claude, Cursor, Windsurf, ChatGPT)
|
|
157
|
+
|
|
158
|
+
CLS++ ships a [Model Context Protocol](https://modelcontextprotocol.io) server
|
|
159
|
+
exposing three tools — `recall_memories`, `store_memory`, `who_am_i` — so any
|
|
160
|
+
MCP client can read and write the same memory. Registry name:
|
|
161
|
+
`io.github.rajamohan1950/cls-memory`.
|
|
162
|
+
|
|
163
|
+
**Remote (hosted, OAuth)** — add `https://www.clsplusplus.com/mcp` as a custom
|
|
164
|
+
connector. The OAuth 2.1 + PKCE + Dynamic Client Registration flow handles
|
|
165
|
+
auth; no API key to paste.
|
|
166
|
+
|
|
167
|
+
**Local (stdio)** — run the bundled server with an API key:
|
|
126
168
|
|
|
127
169
|
```bash
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
170
|
+
pip install clsplusplus
|
|
171
|
+
# one-line install for Claude Code:
|
|
172
|
+
claude mcp add cls-memory \
|
|
173
|
+
--env CLS_API_URL=https://www.clsplusplus.com \
|
|
174
|
+
--env CLS_API_KEY=cls_live_xxx \
|
|
175
|
+
-- python3 -m clsplusplus.mcp_server
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Or paste this into `.claude/settings.json` (Cursor/Windsurf use the same shape
|
|
179
|
+
in their MCP config):
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{
|
|
183
|
+
"mcpServers": {
|
|
184
|
+
"cls-memory": {
|
|
185
|
+
"command": "python3",
|
|
186
|
+
"args": ["-m", "clsplusplus.mcp_server"],
|
|
187
|
+
"env": {
|
|
188
|
+
"CLS_API_URL": "https://www.clsplusplus.com",
|
|
189
|
+
"CLS_API_KEY": "cls_live_xxx"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The dashboard's **Connect** button (`GET /v1/mcp/connect`) mints a fresh key and
|
|
197
|
+
returns this exact block pre-filled. Create keys manually at
|
|
198
|
+
<https://www.clsplusplus.com/profile#api-keys>.
|
|
199
|
+
|
|
200
|
+
### Agent-framework integrations
|
|
201
|
+
|
|
202
|
+
CLS++ ships native memory adapters for four agent frameworks. Each is an
|
|
203
|
+
optional extra and lazily imported — the base package never requires the
|
|
204
|
+
framework. Full setup in [docs/integrations](docs/integrations/).
|
|
131
205
|
|
|
132
|
-
|
|
133
|
-
|
|
206
|
+
| Framework | Install | Class | Plugs in as |
|
|
207
|
+
|-----------|---------|-------|-------------|
|
|
208
|
+
| **CrewAI** | `pip install clsplusplus[crewai]` | `clsplusplus.integrations.crewai.CLSMemoryStorage` | `ExternalMemory(storage=...)` — [docs](docs/integrations/crewai.md) |
|
|
209
|
+
| **LangGraph** | `pip install clsplusplus[langgraph]` | `clsplusplus.integrations.langgraph.CLSMemoryStore` | `graph.compile(store=...)` — [docs](docs/integrations/langgraph.md) |
|
|
210
|
+
| **LlamaIndex** | `pip install clsplusplus[llamaindex]` | `clsplusplus.integrations.llamaindex.CLSMemoryBlock` | `Memory.from_defaults(memory_blocks=[...])` — [docs](docs/integrations/llamaindex.md) |
|
|
211
|
+
| **AutoGen** | `pip install clsplusplus[autogen]` | `clsplusplus.integrations.autogen.CLSMemory` | `AssistantAgent(memory=[...])` — [docs](docs/integrations/autogen.md) |
|
|
134
212
|
|
|
135
|
-
|
|
136
|
-
|
|
213
|
+
```python
|
|
214
|
+
# Example: CrewAI
|
|
215
|
+
from crewai import Crew
|
|
216
|
+
from crewai.memory.external.external_memory import ExternalMemory
|
|
217
|
+
from clsplusplus.integrations.crewai import CLSMemoryStorage
|
|
218
|
+
|
|
219
|
+
crew = Crew(
|
|
220
|
+
agents=[...], tasks=[...], memory=True,
|
|
221
|
+
external_memory=ExternalMemory(storage=CLSMemoryStorage(user="my-crew")),
|
|
222
|
+
)
|
|
137
223
|
```
|
|
138
224
|
|
|
225
|
+
Editor integrations (Cursor, Codex, n8n) also have guides under
|
|
226
|
+
[docs/integrations](docs/integrations/).
|
|
227
|
+
|
|
228
|
+
### Managed service
|
|
229
|
+
|
|
230
|
+
CLS++ runs as a fully managed service — no infrastructure to host. Install the
|
|
231
|
+
SDK and point it at the hosted API:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
pip install clsplusplus # or: npm install clsplusplus
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Get an API key and start storing memory at **[clsplusplus.com](https://www.clsplusplus.com)**.
|
|
238
|
+
|
|
139
239
|
---
|
|
140
240
|
|
|
141
241
|
## Try It Live
|
|
142
242
|
|
|
143
243
|
**[Try the demo](https://www.clsplusplus.com)** — Tell Claude something, ask OpenAI. Same memory. No sign-up.
|
|
144
244
|
|
|
145
|
-
The Chrome extension (Web Store,
|
|
245
|
+
The Chrome extension (Web Store, v7.4.1) captures user messages from
|
|
146
246
|
ChatGPT, Claude, and Gemini chat pages automatically and feeds them through
|
|
147
247
|
the same memory pipeline. Host permissions: `chatgpt.com`,
|
|
148
248
|
`chat.openai.com`, `claude.ai`, `gemini.google.com`. The Link Account popup
|
|
@@ -204,29 +304,32 @@ export CLS_ABUSE_WHITELIST_IPS= # comma-separated operator IPs
|
|
|
204
304
|
Requests carrying a valid API key are exempt from auth-fail flood counting
|
|
205
305
|
(see `src/clsplusplus/abuse_guard.py`).
|
|
206
306
|
|
|
207
|
-
Product endpoints: `POST /v1/memories/encode`, `POST /v1/memories/retrieve`, `DELETE /v1/memories/forget`, `GET /v1/health/score
|
|
307
|
+
Product endpoints: `POST /v1/memories/encode`, `POST /v1/memories/retrieve`, `DELETE /v1/memories/forget`, `GET /v1/health/score`, `GET /v1/pricing`, `GET /v1/version`, plus the in-app support desk (`POST /v1/feedback`, `GET /v1/support/mine`, `POST /v1/support/{id}/rate`). See [SaaS docs](docs/SAAS_MEMORY_AS_SERVICE.md).
|
|
308
|
+
|
|
309
|
+
> Memory reads/writes are bound to the caller's own namespace server-side
|
|
310
|
+
> (`_owned_namespace_for` in `api.py`): a signed-in user can never read another
|
|
311
|
+
> tenant's memories by passing a namespace.
|
|
208
312
|
|
|
209
313
|
### Pricing
|
|
210
314
|
|
|
211
|
-
CLS++ launched in India and bills
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
315
|
+
CLS++ launched in India and bills via **Razorpay (UPI / QR)**. Pricing is
|
|
316
|
+
**country-based** — Indian users are billed in **₹**, US in **$**, EU in **€**,
|
|
317
|
+
resolved from the request's country (`src/clsplusplus/currency.py`). Published
|
|
318
|
+
monthly tiers: **Pro ₹999 / $29**, **Business ₹3,999 / $99**, **Enterprise
|
|
319
|
+
₹14,999 / $499**, plus a free tier. Per-tier feature bundles are optimized by
|
|
320
|
+
the `bundle-pricing` agent and exposed on `GET /v1/pricing`. The pricing control
|
|
321
|
+
plane lives inside the CLS++ memory layer itself (reserved namespace
|
|
322
|
+
`__cls_pricing__`), operator-tunable at runtime via `POST /admin/pricing/config`;
|
|
323
|
+
defaults are seeded by `src/clsplusplus/pricing_store.py`. `GET /v1/pricing` is a
|
|
218
324
|
public, abuse-exempt endpoint.
|
|
219
325
|
|
|
220
326
|
---
|
|
221
327
|
|
|
222
328
|
## Deployment
|
|
223
329
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
| **AWS Free Tier** | [CloudFormation](infrastructure/aws/cloudformation-free-tier.yaml) • [Step-by-step](infrastructure/aws/FREE_TIER_GUIDE.md) |
|
|
228
|
-
| **AWS** | [CloudFormation](infrastructure/aws/cloudformation.yaml) |
|
|
229
|
-
| **Azure** | [ARM template](infrastructure/azure/arm-template.json) |
|
|
330
|
+
CLS++ is a managed, hosted service — there's nothing to deploy. The production
|
|
331
|
+
API runs at **[www.clsplusplus.com](https://www.clsplusplus.com)**; enterprise
|
|
332
|
+
and on-prem options are available on request.
|
|
230
333
|
|
|
231
334
|
---
|
|
232
335
|
|
|
@@ -234,7 +337,9 @@ public, abuse-exempt endpoint.
|
|
|
234
337
|
|
|
235
338
|
| Document | Description |
|
|
236
339
|
|----------|-------------|
|
|
340
|
+
| [Architecture Overview](docs/ARCHITECTURE.md) | Components, stores, data flow, MCP |
|
|
237
341
|
| [API Reference](docs/API_DOCUMENTATION.md) | Endpoints, auth, examples |
|
|
342
|
+
| [Integrations](docs/integrations/) | CrewAI, LangGraph, LlamaIndex, AutoGen, Cursor, Codex, n8n |
|
|
238
343
|
| [API Blueprint](docs/API_BLUEPRINT.md) | SaaS API playbook (DX, security, billing) |
|
|
239
344
|
| [SaaS Strategy](docs/SAAS_MEMORY_AS_SERVICE.md) | Memory-as-a-Service, pricing |
|
|
240
345
|
| [Marketplace Integration](docs/MARKETPLACE_INTEGRATION.md) | AWS, Azure, GCP, OCI |
|
|
@@ -254,10 +359,16 @@ public, abuse-exempt endpoint.
|
|
|
254
359
|
- [x] Reconsolidation gate
|
|
255
360
|
- [x] API key auth + rate limiting
|
|
256
361
|
- [x] SaaS product endpoints
|
|
257
|
-
- [x] Chrome extension (
|
|
362
|
+
- [x] Chrome extension (v7.4.1) capturing ChatGPT / Claude / Gemini
|
|
363
|
+
- [x] Remote MCP server (OAuth 2.1 + PKCE + DCR) + stdio MCP server
|
|
364
|
+
- [x] Native CrewAI / LangGraph / LlamaIndex / AutoGen memory adapters
|
|
258
365
|
- [x] Abuse-guard with env-tunable thresholds and operator IP whitelist
|
|
259
366
|
- [x] PostHog Weblab — staged rollouts with auto-rollback (5xx > 2% or p95 > 3s)
|
|
260
|
-
- [x]
|
|
367
|
+
- [x] Country-based pricing (₹ / $ / €) + agent-optimized feature bundles (Razorpay / UPI), memory-resident control plane
|
|
368
|
+
- [x] In-app support desk ("Doctor") — agent-triaged feedback / bugs / questions with auto-resolution + per-user timeline
|
|
369
|
+
- [x] Company agent platform — `doctor-*`, `dynamic-pricing`, `bundle-pricing`, `competitive-intel`, `marketing-growth`
|
|
370
|
+
- [x] `cls bench` — runnable reliability reproductions (silent-loss, delete-on-conflict, dimension-switch, empty-extraction)
|
|
371
|
+
- [x] Per-user memory isolation (server-side namespace binding)
|
|
261
372
|
|
|
262
373
|
## Recent Architectural Decisions
|
|
263
374
|
|
|
@@ -288,9 +399,9 @@ container ships operator scripts at `/app/scripts/` (see
|
|
|
288
399
|
|
|
289
400
|
---
|
|
290
401
|
|
|
291
|
-
##
|
|
402
|
+
## Support
|
|
292
403
|
|
|
293
|
-
|
|
404
|
+
Questions or enterprise enquiries: **[clsplusplus.com](https://www.clsplusplus.com)** or open a ticket at [clsplusplus.com/tickets](https://www.clsplusplus.com/tickets).
|
|
294
405
|
|
|
295
406
|
---
|
|
296
407
|
|
|
@@ -301,5 +412,5 @@ Provisional patent filed October 2025. Apache 2.0 (see [LICENSE](LICENSE)).
|
|
|
301
412
|
---
|
|
302
413
|
|
|
303
414
|
<p align="center">
|
|
304
|
-
<strong>AlphaForge AI Labs</strong> • <a href="https://
|
|
415
|
+
<strong>AlphaForge AI Labs</strong> • <a href="https://www.clsplusplus.com">clsplusplus.com</a> • 2026
|
|
305
416
|
</p>
|