superlocalmemory 3.6.6__tar.gz → 3.6.8__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.
- {superlocalmemory-3.6.6/src/superlocalmemory.egg-info → superlocalmemory-3.6.8}/PKG-INFO +57 -2
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/README.md +56 -1
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/pyproject.toml +1 -1
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/__init__.py +1 -1
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/server.py +19 -6
- superlocalmemory-3.6.8/src/superlocalmemory/server/recall_health.py +237 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/unified_daemon.py +87 -3
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8/src/superlocalmemory.egg-info}/PKG-INFO +57 -2
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory.egg-info/SOURCES.txt +1 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/AUTHORS.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/LICENSE +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/NOTICE +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/setup.cfg +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/attribution/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/attribution/signer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/attribution/watermark.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/cache_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/commands.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/compress_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/context_commands.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/daemon.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/db_migrate.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/escape_hatch.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/help_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/json_output.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/main.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/optimize_constants.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/pending_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/post_install.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/service_installer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/setup_wizard.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/version_banner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/changes.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/communities.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/config.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/database.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/flows.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/graph_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/incremental.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/models.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/parser.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/resolver.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/search.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/service.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/code_graph/watcher.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/abac.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/audit.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/gdpr.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/lifecycle.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/retention.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/compliance/scheduler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/block_hygiene.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/clock_monitor.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/config.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/consolidation_engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/context_cache.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/db_pool.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/embedding_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/embeddings.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/engine_capabilities.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/engine_lock.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/engine_wiring.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/error_catalog.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/error_envelope.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/fact_consolidator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/file_lock.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/graph_analyzer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/graph_pruner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/health_monitor.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/ingest_gate.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/injection.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/loop_watchdog.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/maintenance.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/modes.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/ollama_embedder.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/platform_utils.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/priority_queue.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/profiles.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/pruning_engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/queue_consumer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/ram_lock.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/rate_limit.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/recall_gate.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/recall_pipeline.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/recall_queue.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/recall_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/registry.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/reranker_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/safe_fs.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/security_primitives.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/shadow_router.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/slm_disabled.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/slmignore.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/store_pipeline.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/summarizer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/tier_manager.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/topic_signature.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/core/worker_pool.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/dynamics/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/auto_linker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/consolidator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/context_generator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/emotional.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/foresight.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/graph_builder.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/observation_builder.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/scene_builder.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/signal_inference.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/encoding/type_router.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/budget.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/evolution_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/triggers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/evolution/types.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/graph/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/graph/cozo_backend.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/adapter_base.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/auto_capture.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/auto_recall.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/context_payload.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/ide_connector.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/rules_engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/session_registry.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/sync_loop.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/auth_middleware.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/backup.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/cache_manager.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/cloud_backup.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/event_bus.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/pid_manager.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/process_reaper.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/rate_limiter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/credentials.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/parsers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/adaptive.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/arm_catalog.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/assertion_miner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/bandit.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/bandit_cache.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/behavioral.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/bootstrap.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/cross_project.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/database.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/engagement.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/ensemble.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/entity_compiler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/features.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/feedback.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/labeler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/legacy_migration.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/memory_merge.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/model_cache.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/model_rollback.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/outcome_queue.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/outcomes.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/pattern_miner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/project_context.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/ranker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/ranker_common.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/reward.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/reward_archive.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/reward_boost.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/reward_proxy.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/shadow_test.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/signal_worker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/signals.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/source_quality.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/trigram_index.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/learning/workflows.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/llm/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/llm/backbone.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/ebbinghaus.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/fisher.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/fisher_quantized.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/hopfield.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/langevin.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/polar_quant.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/qjl.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/sheaf.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/math/turbo_quant.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/_stdin_guard.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/resources.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/shared.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_active.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_context.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_core.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_learning.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_v28.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_v3.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mcp/tools_v33.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mesh/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mesh/broker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/mesh/remote_sync.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/migrations/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/exact.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/manager.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/align.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/extractive_code.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/extractive_json.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/compress/router.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/config/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/config/defaults.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/config/schema.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/config/store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/proxy/server.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/storage/db.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/optimize/storage/schema.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/agentic.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/ann_index.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/engine.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/fusion.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/reranker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/strategy.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/retrieval/vector_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/api.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/bandit_loops.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/middleware/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/recall_serializer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/adapters.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/agents.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/backup.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/behavioral.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/brain.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/chat.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/compliance.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/data_io.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/entity.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/events.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/evolution.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/helpers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/ingest.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/insights.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/learning.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/memories.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/mesh.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/optimize.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/prewarm.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/profiles.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/stats.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/tiers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/timeline.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/token.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/v3_api.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/routes/ws.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/security_middleware.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/ui.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/access_control.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/access_log.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/database.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migration_runner.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migration_v33.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/migrations.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/models.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/quantized_store.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v32.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v3410.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v3411.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v343.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v345.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/schema_v347.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/storage/v2_migrator.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/trust/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/trust/gate.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/trust/provenance.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/trust/scorer.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/trust/signals.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/css/brain.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/index.html +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/agents.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/brain.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/clusters.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/compliance.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/core.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/dashboard.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/events.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/feedback.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ide-status.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/init.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/math-health.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/memories.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/modal.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-health.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/optimize.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/profiles.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/search.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/settings.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/timeline.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/vector/__init__.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory.egg-info/requires.txt +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory.egg-info/top_level.txt +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_auto_hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_before_web_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_behavioral_full.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_claude_hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_cli_core.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_cli_json.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_cli_v33.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_compliance_full.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_config_system.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_engine_hooks.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_event_bus.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_features.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_final_locomo_mini.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_graph_integrity.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_hook_handlers.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_ide_connector.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_infra.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_injection.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_learning_advanced.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_learning_collectors.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_llm_provider.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_mcp_server.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_migration.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_mode_switch_preservation.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_post_install.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_ranker.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_topic_shift_hook.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_trust_full.py +0 -0
- {superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/tests/test_v3_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superlocalmemory
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.8
|
|
4
4
|
Summary: Information-geometric agent memory with mathematical guarantees
|
|
5
5
|
Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
|
|
6
6
|
License: AGPL-3.0-or-later
|
|
@@ -401,6 +401,32 @@ slm status
|
|
|
401
401
|
|
|
402
402
|
### MCP Integration (Claude, Cursor, Windsurf, VS Code, etc.)
|
|
403
403
|
|
|
404
|
+
SLM supports **two MCP transports** — use whichever fits your tool. Both expose the same 33 tools and 7 resources.
|
|
405
|
+
|
|
406
|
+
#### Option A — HTTP transport (v3.6.7+, recommended)
|
|
407
|
+
|
|
408
|
+
One shared process handles every client. RAM is flat regardless of how many IDE windows, subagents, or concurrent sessions connect. Requires the SLM daemon to be running (`slm start`).
|
|
409
|
+
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"mcpServers": {
|
|
413
|
+
"superlocalmemory": {
|
|
414
|
+
"type": "http",
|
|
415
|
+
"url": "http://127.0.0.1:8765/mcp/"
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
> **Claude Code** also accepts:
|
|
422
|
+
> ```bash
|
|
423
|
+
> claude mcp add --transport http superlocalmemory http://127.0.0.1:8765/mcp/
|
|
424
|
+
> ```
|
|
425
|
+
|
|
426
|
+
#### Option B — stdio transport (universal, works everywhere)
|
|
427
|
+
|
|
428
|
+
Spawns one `slm mcp` subprocess per client connection (~90–110 MB each). Works with every MCP-compatible tool including those that do not yet support HTTP transport. No daemon required.
|
|
429
|
+
|
|
404
430
|
```json
|
|
405
431
|
{
|
|
406
432
|
"mcpServers": {
|
|
@@ -412,7 +438,36 @@ slm status
|
|
|
412
438
|
}
|
|
413
439
|
```
|
|
414
440
|
|
|
415
|
-
|
|
441
|
+
#### Option C — `mcp-remote` bridge (for stdio-only tools that want HTTP)
|
|
442
|
+
|
|
443
|
+
Some CLIs (e.g. Grok CLI) only speak stdio but you still want the RAM benefit of HTTP. The [`@modelcontextprotocol/client-cli`](https://www.npmjs.com/package/@modelcontextprotocol/client-cli) package bridges them:
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
npm install -g @modelcontextprotocol/client-cli
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
{
|
|
451
|
+
"mcpServers": {
|
|
452
|
+
"superlocalmemory": {
|
|
453
|
+
"command": "mcp-remote",
|
|
454
|
+
"args": ["http://127.0.0.1:8765/mcp/", "--allow-http", "--transport", "http-only"]
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
#### When to use which
|
|
461
|
+
|
|
462
|
+
| Situation | Use |
|
|
463
|
+
|-----------|-----|
|
|
464
|
+
| Claude Code / Claude Desktop (v3.6.7+) | **HTTP** — zero new processes per session |
|
|
465
|
+
| Cursor, Windsurf, Gemini CLI, Antigravity | **HTTP** — native support |
|
|
466
|
+
| Grok CLI, tools that only support stdio | **`mcp-remote` bridge** |
|
|
467
|
+
| Offline / daemon-free usage | **stdio** |
|
|
468
|
+
| Any tool, any version | **stdio** always works as fallback |
|
|
469
|
+
|
|
470
|
+
See [`docs/ide-setup.md`](docs/ide-setup.md) for per-IDE configs. 33 MCP tools by default (+42 optional behind `SLM_MCP_ALL_TOOLS=1`) + 7 resources. Works with any MCP-compatible client — we ship templated configs for Claude Code, Cursor, Windsurf, VS Code Copilot, Continue, Cody, ChatGPT Desktop, Gemini CLI, JetBrains, Zed, and Antigravity (15 IDE configs in `ide/configs/`).
|
|
416
471
|
|
|
417
472
|
### Dual Interface: MCP + CLI
|
|
418
473
|
|
|
@@ -309,6 +309,32 @@ slm status
|
|
|
309
309
|
|
|
310
310
|
### MCP Integration (Claude, Cursor, Windsurf, VS Code, etc.)
|
|
311
311
|
|
|
312
|
+
SLM supports **two MCP transports** — use whichever fits your tool. Both expose the same 33 tools and 7 resources.
|
|
313
|
+
|
|
314
|
+
#### Option A — HTTP transport (v3.6.7+, recommended)
|
|
315
|
+
|
|
316
|
+
One shared process handles every client. RAM is flat regardless of how many IDE windows, subagents, or concurrent sessions connect. Requires the SLM daemon to be running (`slm start`).
|
|
317
|
+
|
|
318
|
+
```json
|
|
319
|
+
{
|
|
320
|
+
"mcpServers": {
|
|
321
|
+
"superlocalmemory": {
|
|
322
|
+
"type": "http",
|
|
323
|
+
"url": "http://127.0.0.1:8765/mcp/"
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
> **Claude Code** also accepts:
|
|
330
|
+
> ```bash
|
|
331
|
+
> claude mcp add --transport http superlocalmemory http://127.0.0.1:8765/mcp/
|
|
332
|
+
> ```
|
|
333
|
+
|
|
334
|
+
#### Option B — stdio transport (universal, works everywhere)
|
|
335
|
+
|
|
336
|
+
Spawns one `slm mcp` subprocess per client connection (~90–110 MB each). Works with every MCP-compatible tool including those that do not yet support HTTP transport. No daemon required.
|
|
337
|
+
|
|
312
338
|
```json
|
|
313
339
|
{
|
|
314
340
|
"mcpServers": {
|
|
@@ -320,7 +346,36 @@ slm status
|
|
|
320
346
|
}
|
|
321
347
|
```
|
|
322
348
|
|
|
323
|
-
|
|
349
|
+
#### Option C — `mcp-remote` bridge (for stdio-only tools that want HTTP)
|
|
350
|
+
|
|
351
|
+
Some CLIs (e.g. Grok CLI) only speak stdio but you still want the RAM benefit of HTTP. The [`@modelcontextprotocol/client-cli`](https://www.npmjs.com/package/@modelcontextprotocol/client-cli) package bridges them:
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
npm install -g @modelcontextprotocol/client-cli
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
```json
|
|
358
|
+
{
|
|
359
|
+
"mcpServers": {
|
|
360
|
+
"superlocalmemory": {
|
|
361
|
+
"command": "mcp-remote",
|
|
362
|
+
"args": ["http://127.0.0.1:8765/mcp/", "--allow-http", "--transport", "http-only"]
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
#### When to use which
|
|
369
|
+
|
|
370
|
+
| Situation | Use |
|
|
371
|
+
|-----------|-----|
|
|
372
|
+
| Claude Code / Claude Desktop (v3.6.7+) | **HTTP** — zero new processes per session |
|
|
373
|
+
| Cursor, Windsurf, Gemini CLI, Antigravity | **HTTP** — native support |
|
|
374
|
+
| Grok CLI, tools that only support stdio | **`mcp-remote` bridge** |
|
|
375
|
+
| Offline / daemon-free usage | **stdio** |
|
|
376
|
+
| Any tool, any version | **stdio** always works as fallback |
|
|
377
|
+
|
|
378
|
+
See [`docs/ide-setup.md`](docs/ide-setup.md) for per-IDE configs. 33 MCP tools by default (+42 optional behind `SLM_MCP_ALL_TOOLS=1`) + 7 resources. Works with any MCP-compatible client — we ship templated configs for Claude Code, Cursor, Windsurf, VS Code Copilot, Continue, Cody, ChatGPT Desktop, Gemini CLI, JetBrains, Zed, and Antigravity (15 IDE configs in `ide/configs/`).
|
|
324
379
|
|
|
325
380
|
### Dual Interface: MCP + CLI
|
|
326
381
|
|
|
@@ -28,7 +28,7 @@ if "OMP_NUM_THREADS" not in os.environ:
|
|
|
28
28
|
os.environ["OMP_NUM_THREADS"] = "2"
|
|
29
29
|
# ---------------------------------------------------------------------------
|
|
30
30
|
|
|
31
|
-
__version__ = "3.6.
|
|
31
|
+
__version__ = "3.6.8"
|
|
32
32
|
|
|
33
33
|
_REQUIRED_VERSIONS = {
|
|
34
34
|
"sentence_transformers": "5.3.0",
|
|
@@ -237,8 +237,19 @@ def _eager_warmup() -> None:
|
|
|
237
237
|
_logger.warning("Mesh auto-register failed: %s", exc)
|
|
238
238
|
|
|
239
239
|
import threading
|
|
240
|
-
|
|
241
|
-
|
|
240
|
+
|
|
241
|
+
# v3.6.7: Suppress standalone-process behaviours when the MCP server is
|
|
242
|
+
# imported inside the daemon (SLM_MCP_EMBEDDED=1). Three threads are safe
|
|
243
|
+
# to run in a dedicated `slm mcp` subprocess but harmful inside the daemon:
|
|
244
|
+
# mcp-warmup — creates a LIGHT engine duplicate; daemon has a FULL one.
|
|
245
|
+
# parent-watchdog — calls os._exit(0) if its parent IDE quits, which would
|
|
246
|
+
# kill the daemon along with it.
|
|
247
|
+
# stdin-eof-monitor — monitors stdin pipe; meaningless inside the daemon.
|
|
248
|
+
_embedded_in_daemon = _os.environ.get("SLM_MCP_EMBEDDED") == "1"
|
|
249
|
+
|
|
250
|
+
if not _embedded_in_daemon:
|
|
251
|
+
_warmup_thread = threading.Thread(target=_eager_warmup, daemon=True, name="mcp-warmup")
|
|
252
|
+
_warmup_thread.start()
|
|
242
253
|
|
|
243
254
|
|
|
244
255
|
# V3.4.57: Parent watchdog — self-terminate when the IDE/Claude session dies.
|
|
@@ -274,8 +285,9 @@ def _parent_watchdog() -> None:
|
|
|
274
285
|
pass # Transient errors — keep watching
|
|
275
286
|
|
|
276
287
|
|
|
277
|
-
|
|
278
|
-
_watchdog_thread.
|
|
288
|
+
if not _embedded_in_daemon:
|
|
289
|
+
_watchdog_thread = threading.Thread(target=_parent_watchdog, daemon=True, name="parent-watchdog")
|
|
290
|
+
_watchdog_thread.start()
|
|
279
291
|
|
|
280
292
|
|
|
281
293
|
# V3.5.9: Stdin EOF monitor — complements the parent watchdog for the case where
|
|
@@ -337,8 +349,9 @@ def _stdin_eof_monitor() -> None:
|
|
|
337
349
|
_mlog.debug("stdin EOF monitor error: %s — watchdog will cover", exc)
|
|
338
350
|
|
|
339
351
|
|
|
340
|
-
|
|
341
|
-
_stdin_monitor_thread.
|
|
352
|
+
if not _embedded_in_daemon:
|
|
353
|
+
_stdin_monitor_thread = threading.Thread(target=_stdin_eof_monitor, daemon=True, name="stdin-eof-monitor")
|
|
354
|
+
_stdin_monitor_thread.start()
|
|
342
355
|
|
|
343
356
|
|
|
344
357
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""Runtime recall-health monitor — keep the 6-channel recall path warm,
|
|
2
|
+
detect a "warm-but-broken" embedder at runtime, and self-heal it (v3.6.8).
|
|
3
|
+
|
|
4
|
+
Why this exists
|
|
5
|
+
---------------
|
|
6
|
+
On a long-running daemon the cold full-fusion recall could exceed the MCP
|
|
7
|
+
pool's 30s timeout, and ``session_init`` then silently fell back to FTS5/BM25
|
|
8
|
+
("DEGRADED MODE") — observed 7×/2 days in production logs. Two root causes:
|
|
9
|
+
|
|
10
|
+
1. **Page-cache eviction.** The ~100 MB ``association_edges`` / graph table is
|
|
11
|
+
evicted under memory pressure, so the first recall after idle re-reads it
|
|
12
|
+
from disk (15-24 s+), blowing the pool timeout.
|
|
13
|
+
2. **Silent embedder death.** ``OllamaEmbedder.embed`` returns ``None`` on a
|
|
14
|
+
transient Ollama failure, while the boot-set ``_embedding_warm`` flag still
|
|
15
|
+
reports ``True``. With ``q_emb is None`` the engine skips the semantic,
|
|
16
|
+
hopfield and spreading_activation channels — recall silently degrades to
|
|
17
|
+
keyword-only (``semantic`` score ``0.0`` on every result).
|
|
18
|
+
|
|
19
|
+
The boot warmup (``_warmup_recall``) runs ONCE and never again, so neither
|
|
20
|
+
condition is repaired in-life.
|
|
21
|
+
|
|
22
|
+
The fix — an industry-standard 3-tier monitor, validated against Ollama
|
|
23
|
+
keep-alive, Chroma's active heartbeat, LangChain's circuit breaker and the
|
|
24
|
+
Kubernetes liveness/readiness split:
|
|
25
|
+
|
|
26
|
+
* **Tier 1 — RE-WARM.** Fire a real ``engine.recall`` every ``interval_s`` to
|
|
27
|
+
keep the graph page cache hot and nomic-embed resident.
|
|
28
|
+
* **Tier 2 — READINESS PROBE.** Assert the semantic channel actually fired
|
|
29
|
+
(``max semantic > 0``). Rows returned with ``semantic == 0`` everywhere is the
|
|
30
|
+
warm-but-broken signature → the embedder is returning ``None``.
|
|
31
|
+
* **Tier 3 — CIRCUIT-BREAKER SELF-HEAL.** Reset the embedder's cached
|
|
32
|
+
``_available`` flag (the "available once, cached forever" bug), re-exercise
|
|
33
|
+
``embed()``, track consecutive failures, and log **CRITICAL** so the
|
|
34
|
+
degradation is never silent.
|
|
35
|
+
|
|
36
|
+
All logic is fail-soft: a crash in the monitor never takes down the daemon.
|
|
37
|
+
"""
|
|
38
|
+
from __future__ import annotations
|
|
39
|
+
|
|
40
|
+
import logging
|
|
41
|
+
import threading
|
|
42
|
+
from dataclasses import dataclass
|
|
43
|
+
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
# A stable probe query. Content-agnostic: we only assert that *some* result
|
|
47
|
+
# carries a non-zero semantic score, which proves the embedder + semantic
|
|
48
|
+
# channel are alive end-to-end.
|
|
49
|
+
DEFAULT_PROBE = "memory recall health probe"
|
|
50
|
+
# A distinct string for the heal embed() call so it is obvious in thread dumps
|
|
51
|
+
# / Ollama logs and never collides with a real cached query embedding.
|
|
52
|
+
HEAL_PROBE = "__recall_health_rewarm__"
|
|
53
|
+
|
|
54
|
+
# Default cadence. 5 min keeps nomic-embed resident (Ollama default unload is
|
|
55
|
+
# 5 min) and the page cache warm without meaningful load.
|
|
56
|
+
DEFAULT_INTERVAL_S = 300
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass
|
|
60
|
+
class RecallHealth:
|
|
61
|
+
"""Mutable health state for the recall path."""
|
|
62
|
+
|
|
63
|
+
healthy: bool = True
|
|
64
|
+
consecutive_failures: int = 0
|
|
65
|
+
total_heals: int = 0
|
|
66
|
+
checks: int = 0
|
|
67
|
+
last_semantic_score: float = 0.0
|
|
68
|
+
last_error: str = ""
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _max_semantic(results) -> float:
|
|
72
|
+
"""Largest semantic channel score across results (0.0 if none)."""
|
|
73
|
+
best = 0.0
|
|
74
|
+
for r in results:
|
|
75
|
+
cs = getattr(r, "channel_scores", None) or {}
|
|
76
|
+
try:
|
|
77
|
+
best = max(best, float(cs.get("semantic", 0.0) or 0.0))
|
|
78
|
+
except (TypeError, ValueError):
|
|
79
|
+
continue
|
|
80
|
+
return best
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _get_embedder(engine):
|
|
84
|
+
"""Locate the engine's embedder (full mode: engine._embedder; some paths
|
|
85
|
+
hang it off the retrieval engine)."""
|
|
86
|
+
emb = getattr(engine, "_embedder", None)
|
|
87
|
+
if emb is None:
|
|
88
|
+
re_eng = getattr(engine, "_retrieval_engine", None)
|
|
89
|
+
emb = getattr(re_eng, "_embedder", None) if re_eng is not None else None
|
|
90
|
+
return emb
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _heal_embedder(engine, *, log) -> bool:
|
|
94
|
+
"""Tier 3: reset the cached availability flag and re-exercise the embedder.
|
|
95
|
+
|
|
96
|
+
``OllamaEmbedder.is_available`` caches its first result forever, so once
|
|
97
|
+
Ollama blips the flag can stay stale. Clearing ``_available`` forces a
|
|
98
|
+
re-probe; ``embed()`` itself always re-attempts the HTTP call, so a single
|
|
99
|
+
successful embed proves recovery. Returns True iff the embedder produced a
|
|
100
|
+
vector.
|
|
101
|
+
"""
|
|
102
|
+
emb = _get_embedder(engine)
|
|
103
|
+
if emb is None:
|
|
104
|
+
log.critical("recall-health: no embedder on engine — cannot self-heal")
|
|
105
|
+
return False
|
|
106
|
+
# Reset the "available once, cached forever" flag if present.
|
|
107
|
+
if hasattr(emb, "_available"):
|
|
108
|
+
try:
|
|
109
|
+
emb._available = None
|
|
110
|
+
except Exception: # pragma: no cover - defensive
|
|
111
|
+
pass
|
|
112
|
+
try:
|
|
113
|
+
vec = emb.embed(HEAL_PROBE)
|
|
114
|
+
except Exception as exc:
|
|
115
|
+
log.warning("recall-health: heal embed() raised: %s", exc)
|
|
116
|
+
return False
|
|
117
|
+
return vec is not None and bool(vec)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def run_health_tick(engine, state: RecallHealth, *, probe: str = DEFAULT_PROBE,
|
|
121
|
+
log=logger) -> RecallHealth:
|
|
122
|
+
"""One monitor tick: re-warm (Tier 1), probe (Tier 2), self-heal (Tier 3).
|
|
123
|
+
|
|
124
|
+
Mutates and returns ``state``. Never raises — a timed-out / failing recall
|
|
125
|
+
marks the path unhealthy instead of propagating.
|
|
126
|
+
"""
|
|
127
|
+
state.checks += 1
|
|
128
|
+
|
|
129
|
+
# Tier 1: re-warm. A real full-fusion recall keeps the graph page cache hot
|
|
130
|
+
# and the embedder resident.
|
|
131
|
+
try:
|
|
132
|
+
resp = engine.recall(probe, limit=3, fast=False)
|
|
133
|
+
except Exception as exc:
|
|
134
|
+
state.healthy = False
|
|
135
|
+
state.consecutive_failures += 1
|
|
136
|
+
state.last_error = f"recall raised: {exc}"
|
|
137
|
+
log.critical(
|
|
138
|
+
"recall-health: re-warm recall FAILED (%s) — recall path unhealthy",
|
|
139
|
+
exc,
|
|
140
|
+
)
|
|
141
|
+
return state
|
|
142
|
+
|
|
143
|
+
results = list(getattr(resp, "results", []) or [])
|
|
144
|
+
sem = _max_semantic(results)
|
|
145
|
+
state.last_semantic_score = sem
|
|
146
|
+
|
|
147
|
+
# Tier 2: readiness. Rows present but semantic never fired == warm-but-broken.
|
|
148
|
+
# Zero results is NOT this signature (could be an empty/filtered corpus).
|
|
149
|
+
broken = bool(results) and sem <= 0.0
|
|
150
|
+
if not broken:
|
|
151
|
+
if not state.healthy:
|
|
152
|
+
log.warning(
|
|
153
|
+
"recall-health: RECOVERED (semantic=%.3f, %d results)",
|
|
154
|
+
sem, len(results),
|
|
155
|
+
)
|
|
156
|
+
state.healthy = True
|
|
157
|
+
state.consecutive_failures = 0
|
|
158
|
+
state.last_error = ""
|
|
159
|
+
return state
|
|
160
|
+
|
|
161
|
+
# Tier 3: self-heal.
|
|
162
|
+
log.critical(
|
|
163
|
+
"recall-health: semantic channel DEAD (%d results, max semantic=0.0) "
|
|
164
|
+
"— embedder returning None; attempting self-heal",
|
|
165
|
+
len(results),
|
|
166
|
+
)
|
|
167
|
+
if _heal_embedder(engine, log=log):
|
|
168
|
+
state.total_heals += 1
|
|
169
|
+
state.healthy = True
|
|
170
|
+
state.consecutive_failures = 0
|
|
171
|
+
state.last_error = ""
|
|
172
|
+
log.warning("recall-health: embedder self-heal SUCCEEDED (re-warmed)")
|
|
173
|
+
else:
|
|
174
|
+
state.healthy = False
|
|
175
|
+
state.consecutive_failures += 1
|
|
176
|
+
state.last_error = "semantic channel dead; embedder heal failed"
|
|
177
|
+
log.critical(
|
|
178
|
+
"recall-health: self-heal FAILED — recall DEGRADED to keyword-only "
|
|
179
|
+
"(consecutive_failures=%d)", state.consecutive_failures,
|
|
180
|
+
)
|
|
181
|
+
return state
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def health_monitor_loop(engine, *, interval_s: int, stop_event: threading.Event,
|
|
185
|
+
state: RecallHealth, probe: str = DEFAULT_PROBE,
|
|
186
|
+
log=logger) -> None:
|
|
187
|
+
"""Background loop. Sleeps ``interval_s`` between ticks; exits promptly when
|
|
188
|
+
``stop_event`` is set. An initial short delay avoids racing boot warmup."""
|
|
189
|
+
# Initial delay (bounded) so we don't pile onto the boot warmup threads.
|
|
190
|
+
if stop_event.wait(min(interval_s, 60)):
|
|
191
|
+
return
|
|
192
|
+
while not stop_event.is_set():
|
|
193
|
+
try:
|
|
194
|
+
run_health_tick(engine, state, probe=probe, log=log)
|
|
195
|
+
except Exception as exc: # pragma: no cover - belt & suspenders
|
|
196
|
+
log.warning("recall-health: tick crashed (non-fatal): %s", exc)
|
|
197
|
+
if stop_event.wait(interval_s):
|
|
198
|
+
break
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# Module-level state so /health can surface the latest verdict without holding
|
|
202
|
+
# a reference to the thread.
|
|
203
|
+
_GLOBAL_STATE = RecallHealth()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def start_recall_health_monitor(engine, *, interval_s: int = DEFAULT_INTERVAL_S,
|
|
207
|
+
probe: str = DEFAULT_PROBE, log=None):
|
|
208
|
+
"""Start the monitor as a daemon thread. Returns ``(thread, stop_event,
|
|
209
|
+
state)``. The state is the shared module-level state read by
|
|
210
|
+
:func:`get_recall_health`."""
|
|
211
|
+
log = log or logger
|
|
212
|
+
state = _GLOBAL_STATE
|
|
213
|
+
stop = threading.Event()
|
|
214
|
+
t = threading.Thread(
|
|
215
|
+
target=health_monitor_loop,
|
|
216
|
+
kwargs=dict(
|
|
217
|
+
engine=engine, interval_s=interval_s, stop_event=stop,
|
|
218
|
+
state=state, probe=probe, log=log,
|
|
219
|
+
),
|
|
220
|
+
daemon=True,
|
|
221
|
+
name="recall-health",
|
|
222
|
+
)
|
|
223
|
+
t.start()
|
|
224
|
+
return t, stop, state
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_recall_health() -> dict:
|
|
228
|
+
"""Snapshot for /health surfacing (visibility — never silent degradation)."""
|
|
229
|
+
s = _GLOBAL_STATE
|
|
230
|
+
return {
|
|
231
|
+
"recall_healthy": s.healthy,
|
|
232
|
+
"consecutive_failures": s.consecutive_failures,
|
|
233
|
+
"total_heals": s.total_heals,
|
|
234
|
+
"checks": s.checks,
|
|
235
|
+
"last_semantic_score": round(s.last_semantic_score, 4),
|
|
236
|
+
"last_error": s.last_error,
|
|
237
|
+
}
|
{superlocalmemory-3.6.6 → superlocalmemory-3.6.8}/src/superlocalmemory/server/unified_daemon.py
RENAMED
|
@@ -34,11 +34,17 @@ import signal
|
|
|
34
34
|
import sys
|
|
35
35
|
import threading
|
|
36
36
|
import time
|
|
37
|
-
from contextlib import asynccontextmanager
|
|
37
|
+
from contextlib import asynccontextmanager, AsyncExitStack
|
|
38
38
|
from datetime import datetime, timezone
|
|
39
39
|
from pathlib import Path
|
|
40
40
|
from typing import Optional
|
|
41
41
|
|
|
42
|
+
# v3.6.7: Tell mcp/server.py it is being imported inside the daemon process.
|
|
43
|
+
# This suppresses the three side-effect threads (mcp-warmup, parent-watchdog,
|
|
44
|
+
# stdin-eof-monitor) that are harmful when the MCP server runs embedded.
|
|
45
|
+
# Must be set BEFORE any import of superlocalmemory.mcp.server.
|
|
46
|
+
os.environ.setdefault("SLM_MCP_EMBEDDED", "1")
|
|
47
|
+
|
|
42
48
|
from fastapi import FastAPI, HTTPException, Request
|
|
43
49
|
from fastapi.middleware.cors import CORSMiddleware
|
|
44
50
|
from fastapi.middleware.gzip import GZipMiddleware
|
|
@@ -677,6 +683,25 @@ async def lifespan(application: FastAPI):
|
|
|
677
683
|
threading.Thread(target=_warmup_recall, daemon=True, name="recall-warmup").start()
|
|
678
684
|
threading.Thread(target=_backfill_vector_store, daemon=True, name="vs-backfill").start()
|
|
679
685
|
|
|
686
|
+
# v3.6.8: Runtime recall-health monitor. The three warmups above run
|
|
687
|
+
# ONCE at boot; on a long-running daemon the graph page cache gets
|
|
688
|
+
# evicted and the embedder can start returning None while _embedding_warm
|
|
689
|
+
# still claims True — both silently degrade recall to keyword-only BM25
|
|
690
|
+
# (observed: session_init "pool.recall timed out → DEGRADED MODE", 7×/2d).
|
|
691
|
+
# This monitor re-warms + actively probes the semantic channel + self-heals
|
|
692
|
+
# a dead embedder for the daemon's whole life. See server/recall_health.py.
|
|
693
|
+
try:
|
|
694
|
+
from superlocalmemory.server.recall_health import (
|
|
695
|
+
start_recall_health_monitor,
|
|
696
|
+
)
|
|
697
|
+
_rh_thread, _rh_stop, _ = start_recall_health_monitor(engine)
|
|
698
|
+
application.state.recall_health_stop = _rh_stop
|
|
699
|
+
except Exception as _rh_exc:
|
|
700
|
+
logger.warning(
|
|
701
|
+
"recall-health monitor start failed (non-fatal): %s", _rh_exc,
|
|
702
|
+
)
|
|
703
|
+
application.state.recall_health_stop = None
|
|
704
|
+
|
|
680
705
|
# v3.4.37: QueueConsumer uses daemon's engine directly via adapter.
|
|
681
706
|
# Previously routed through WorkerPool → recall_worker subprocess,
|
|
682
707
|
# which loaded a duplicate MemoryEngine (~800 MB waste).
|
|
@@ -850,7 +875,20 @@ async def lifespan(application: FastAPI):
|
|
|
850
875
|
except Exception as e:
|
|
851
876
|
logger.warning("optimize module not available: %s", e)
|
|
852
877
|
|
|
853
|
-
|
|
878
|
+
# v3.6.7: Start MCP Streamable-HTTP session manager (GOTCHA #1).
|
|
879
|
+
# streamable_http_app() carries its own Starlette lifespan that initialises
|
|
880
|
+
# an anyio task group inside the session manager. Without entering that
|
|
881
|
+
# lifespan every POST /mcp 500s with "Task group is not initialized."
|
|
882
|
+
# AsyncExitStack enters the context only when _mcp_app was mounted; if the
|
|
883
|
+
# mount failed (non-fatal) the daemon starts normally without HTTP MCP.
|
|
884
|
+
async with AsyncExitStack() as _mcp_stack:
|
|
885
|
+
if _mcp_app is not None:
|
|
886
|
+
await _mcp_stack.enter_async_context(
|
|
887
|
+
_mcp_app.router.lifespan_context(_mcp_app)
|
|
888
|
+
)
|
|
889
|
+
logger.info("MCP HTTP session manager started (Streamable-HTTP on /mcp)")
|
|
890
|
+
|
|
891
|
+
yield
|
|
854
892
|
|
|
855
893
|
# Cancel optimize metrics flush loop + run final flush before shutdown
|
|
856
894
|
try:
|
|
@@ -949,6 +987,14 @@ async def lifespan(application: FastAPI):
|
|
|
949
987
|
except Exception as exc: # pragma: no cover — defensive
|
|
950
988
|
logger.warning("recall_queue close failed: %s", exc)
|
|
951
989
|
|
|
990
|
+
# v3.6.8: Stop recall-health monitor (owns a daemon thread).
|
|
991
|
+
_rh_stop = getattr(application.state, "recall_health_stop", None)
|
|
992
|
+
if _rh_stop is not None:
|
|
993
|
+
try:
|
|
994
|
+
_rh_stop.set()
|
|
995
|
+
except Exception as exc: # pragma: no cover — defensive
|
|
996
|
+
logger.warning("recall_health monitor stop failed: %s", exc)
|
|
997
|
+
|
|
952
998
|
# Stop HealthMonitor (health_monitor.py owns a daemon thread).
|
|
953
999
|
_health = getattr(application.state, "health_monitor", None)
|
|
954
1000
|
if _health is not None:
|
|
@@ -1149,6 +1195,28 @@ def create_app() -> FastAPI:
|
|
|
1149
1195
|
# -- Daemon-specific routes --
|
|
1150
1196
|
_register_daemon_routes(application)
|
|
1151
1197
|
|
|
1198
|
+
# -- v3.6.7: MCP Streamable-HTTP transport at /mcp --
|
|
1199
|
+
# Mount the FastMCP server as a Starlette ASGI sub-app so ALL clients
|
|
1200
|
+
# (Claude Code sessions, subagents, desktop, hermes) share ONE daemon
|
|
1201
|
+
# process instead of spawning an `slm mcp` subprocess per connection.
|
|
1202
|
+
# The session manager lifespan is started in lifespan() via AsyncExitStack.
|
|
1203
|
+
# Fail-open: if import or mount fails, stdio transport keeps working.
|
|
1204
|
+
#
|
|
1205
|
+
# streamable_http_path is set to "/" so that when mounted at "/mcp" the
|
|
1206
|
+
# effective user-facing endpoint is exactly http://127.0.0.1:8765/mcp.
|
|
1207
|
+
# (FastAPI strips the mount prefix before passing the request to the
|
|
1208
|
+
# sub-app, so the sub-app's internal route must be "/".)
|
|
1209
|
+
try:
|
|
1210
|
+
from superlocalmemory.mcp.server import server as _mcp_fastmcp
|
|
1211
|
+
_mcp_fastmcp.settings.streamable_http_path = "/"
|
|
1212
|
+
_mcp_fastmcp._session_manager = None # Defensive reset for idempotency
|
|
1213
|
+
global _mcp_app
|
|
1214
|
+
_mcp_app = _mcp_fastmcp.streamable_http_app()
|
|
1215
|
+
application.mount("/mcp", _mcp_app)
|
|
1216
|
+
logger.info("MCP HTTP transport mounted at /mcp (Streamable HTTP, port 8765)")
|
|
1217
|
+
except Exception as _mcp_exc: # pragma: no cover — defensive
|
|
1218
|
+
logger.warning("MCP HTTP mount failed (non-fatal, stdio still works): %s", _mcp_exc)
|
|
1219
|
+
|
|
1152
1220
|
return application
|
|
1153
1221
|
|
|
1154
1222
|
|
|
@@ -1202,7 +1270,9 @@ def _register_dashboard_routes(application: FastAPI) -> None:
|
|
|
1202
1270
|
# for Gemini), never X-SLM-API-Key. Verified: auth_middleware.py:50-82
|
|
1203
1271
|
# returns False for POST when api_key file exists and X-SLM-API-Key
|
|
1204
1272
|
# is absent.
|
|
1205
|
-
|
|
1273
|
+
# v3.6.7: /mcp is also exempt — MCP clients negotiate their own session
|
|
1274
|
+
# via the MCP protocol; they have no knowledge of X-SLM-API-Key.
|
|
1275
|
+
_AUTH_EXEMPT_PREFIXES = ("/v1/", "/v1beta/", "/mcp")
|
|
1206
1276
|
|
|
1207
1277
|
@application.middleware("http")
|
|
1208
1278
|
async def auth_middleware(request, call_next):
|
|
@@ -1536,6 +1606,13 @@ def _register_daemon_routes(application: FastAPI) -> None:
|
|
|
1536
1606
|
_update_activity()
|
|
1537
1607
|
# Non-blocking peek: report status without forcing a re-init.
|
|
1538
1608
|
engine = getattr(application.state, "engine", None)
|
|
1609
|
+
# v3.6.8: surface the recall-health verdict so a silently-degraded
|
|
1610
|
+
# recall path (warm-but-broken embedder) is VISIBLE, never silent.
|
|
1611
|
+
try:
|
|
1612
|
+
from superlocalmemory.server.recall_health import get_recall_health
|
|
1613
|
+
_recall_health = get_recall_health()
|
|
1614
|
+
except Exception:
|
|
1615
|
+
_recall_health = {"recall_healthy": None}
|
|
1539
1616
|
return {
|
|
1540
1617
|
"status": "ok",
|
|
1541
1618
|
"pid": os.getpid(),
|
|
@@ -1544,6 +1621,9 @@ def _register_daemon_routes(application: FastAPI) -> None:
|
|
|
1544
1621
|
# v3.4.52: clients can poll this to wait for embedding model
|
|
1545
1622
|
# readiness before issuing recall calls.
|
|
1546
1623
|
"embedding_warm": _embedding_warm,
|
|
1624
|
+
# v3.6.8: True iff the semantic channel actually fired on the last
|
|
1625
|
+
# health probe; includes self-heal counters.
|
|
1626
|
+
"recall_health": _recall_health,
|
|
1547
1627
|
}
|
|
1548
1628
|
|
|
1549
1629
|
@application.get("/recall")
|
|
@@ -1820,6 +1900,10 @@ def _update_activity():
|
|
|
1820
1900
|
|
|
1821
1901
|
_start_time: float | None = None
|
|
1822
1902
|
|
|
1903
|
+
# v3.6.7: Starlette app returned by mcp_server.streamable_http_app().
|
|
1904
|
+
# Set in create_app(); consumed by lifespan() to start the session manager.
|
|
1905
|
+
_mcp_app = None
|
|
1906
|
+
|
|
1823
1907
|
|
|
1824
1908
|
# ---------------------------------------------------------------------------
|
|
1825
1909
|
# Server entry point
|