superlocalmemory 3.6.3__tar.gz → 3.6.4__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.3/src/superlocalmemory.egg-info → superlocalmemory-3.6.4}/PKG-INFO +1 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/pyproject.toml +1 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/consolidation_engine.py +8 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine.py +6 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/fact_consolidator.py +54 -13
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/graph_pruner.py +55 -19
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/maintenance.py +9 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/store_pipeline.py +120 -51
- superlocalmemory-3.6.4/src/superlocalmemory/mcp/_stdin_guard.py +60 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/server.py +34 -5
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/engine.py +17 -6
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/entity_channel.py +10 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/hopfield_channel.py +3 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/database.py +113 -9
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4/src/superlocalmemory.egg-info}/PKG-INFO +1 -1
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/SOURCES.txt +2 -0
- superlocalmemory-3.6.4/tests/test_graph_integrity.py +135 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_injection.py +10 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/AUTHORS.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/LICENSE +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/NOTICE +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/README.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/setup.cfg +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/signer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/watermark.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/cache_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/commands.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/compress_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/context_commands.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/daemon.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/db_migrate.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/escape_hatch.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/help_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/json_output.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/main.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/optimize_constants.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/pending_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/post_install.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/service_installer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/setup_wizard.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/version_banner.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/changes.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/communities.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/config.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/database.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/flows.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/graph_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/incremental.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/models.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/parser.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/resolver.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/search.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/service.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/watcher.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/abac.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/audit.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/gdpr.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/lifecycle.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/retention.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/scheduler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/clock_monitor.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/config.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/context_cache.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/db_pool.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/embedding_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/embeddings.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_capabilities.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_lock.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_wiring.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/error_catalog.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/error_envelope.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/file_lock.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/graph_analyzer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/health_monitor.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/injection.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/loop_watchdog.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/modes.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/ollama_embedder.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/platform_utils.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/priority_queue.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/profiles.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/pruning_engine.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/queue_consumer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/ram_lock.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/rate_limit.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_gate.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_pipeline.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_queue.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/registry.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/reranker_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/safe_fs.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/security_primitives.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/shadow_router.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/slm_disabled.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/slmignore.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/summarizer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/tier_manager.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/topic_signature.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/worker_pool.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/auto_linker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/consolidator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/context_generator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/emotional.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/foresight.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/graph_builder.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/observation_builder.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/scene_builder.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/signal_inference.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/type_router.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/budget.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/evolution_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/triggers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/types.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/graph/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/graph/cozo_backend.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/adapter_base.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_capture.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_recall.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/context_payload.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/ide_connector.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/rules_engine.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/session_registry.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/sync_loop.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/auth_middleware.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/backup.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/cache_manager.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/cloud_backup.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/event_bus.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/pid_manager.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/process_reaper.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/rate_limiter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/credentials.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/parsers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/adaptive.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/arm_catalog.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/assertion_miner.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bandit.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bandit_cache.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/behavioral.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bootstrap.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/cross_project.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/database.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/engagement.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ensemble.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/entity_compiler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/features.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/feedback.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/labeler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/legacy_migration.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/memory_merge.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/model_cache.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/model_rollback.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/outcome_queue.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/outcomes.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/pattern_miner.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/project_context.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_common.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_archive.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_boost.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_proxy.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/shadow_test.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/signal_worker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/signals.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/source_quality.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/trigram_index.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/workflows.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/llm/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/llm/backbone.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/ebbinghaus.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/fisher.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/fisher_quantized.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/hopfield.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/langevin.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/polar_quant.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/qjl.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/sheaf.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/turbo_quant.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/resources.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/shared.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_active.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_context.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_core.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_learning.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v28.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v3.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v33.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/broker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/remote_sync.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/migrations/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/exact.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/manager.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/align.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/extractive_code.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/extractive_json.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/router.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/defaults.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/schema.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/server.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/db.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/schema.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/agentic.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/ann_index.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/fusion.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/reranker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/strategy.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/vector_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/api.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/bandit_loops.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/middleware/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/adapters.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/agents.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/backup.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/behavioral.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/brain.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/chat.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/compliance.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/data_io.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/entity.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/events.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/evolution.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/helpers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/ingest.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/insights.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/learning.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/memories.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/mesh.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/optimize.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/prewarm.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/profiles.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/stats.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/tiers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/timeline.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/token.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/v3_api.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/ws.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/security_middleware.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/ui.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/unified_daemon.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/access_control.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/access_log.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migration_runner.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migration_v33.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/models.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/quantized_store.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v32.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v3410.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v3411.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v343.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v345.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v347.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/v2_migrator.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/gate.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/provenance.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/scorer.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/signals.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/brain.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/index.html +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/agents.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/brain.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/clusters.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/compliance.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/core.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/dashboard.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/events.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/feedback.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ide-status.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/init.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/math-health.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memories.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/modal.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-health.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/optimize.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/profiles.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/search.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/settings.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/timeline.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/vector/__init__.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/requires.txt +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/top_level.txt +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_auto_hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_before_web_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_behavioral_full.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_claude_hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_core.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_json.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_v33.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_compliance_full.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_config_system.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_engine_hooks.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_event_bus.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_features.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_final_locomo_mini.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_hook_handlers.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_ide_connector.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_infra.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_learning_advanced.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_learning_collectors.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_llm_provider.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_mcp_server.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_migration.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_mode_switch_preservation.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_post_install.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_ranker.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_topic_shift_hook.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_trust_full.py +0 -0
- {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_v3_api.py +0 -0
{superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/consolidation_engine.py
RENAMED
|
@@ -745,6 +745,14 @@ class ConsolidationEngine:
|
|
|
745
745
|
"""
|
|
746
746
|
from superlocalmemory.storage.models import _new_id
|
|
747
747
|
|
|
748
|
+
# NOTE (core-promotion-02, intentionally NOT changed): the audit
|
|
749
|
+
# flagged placeholder core blocks ("No data available.") + version
|
|
750
|
+
# churn. Investigation showed BOTH the "always 5 blocks" layout and the
|
|
751
|
+
# monotonic version-on-recompile counter are intentional, tested design
|
|
752
|
+
# (see test_consolidation_engine), and the read-side injection filter
|
|
753
|
+
# already hides placeholders from agents. Suppressing or de-churning
|
|
754
|
+
# here breaks that design for a cosmetic gain — so it is left as-is.
|
|
755
|
+
|
|
748
756
|
# Get existing version for increment
|
|
749
757
|
existing = self._db.get_core_block(profile_id, block_type)
|
|
750
758
|
version = (existing["version"] + 1) if existing else 1
|
|
@@ -281,13 +281,18 @@ class MemoryEngine:
|
|
|
281
281
|
# V3.2: ConsolidationEngine (Phase 5) -- sleep-time consolidation
|
|
282
282
|
from superlocalmemory.core.summarizer import Summarizer
|
|
283
283
|
summarizer = Summarizer(self._config)
|
|
284
|
+
# P1-5 (core-promotion-01): wire a real behavioral store. Previously
|
|
285
|
+
# hardcoded None → _compile_behavioral_block always returned the
|
|
286
|
+
# "No behavioral patterns detected yet." placeholder, so behavioral
|
|
287
|
+
# patterns never reached the always-injected core block (dead feature).
|
|
288
|
+
from superlocalmemory.core.recall_pipeline import _get_behavioral_tracker
|
|
284
289
|
self._consolidation_engine = _init_consolidation(
|
|
285
290
|
self._config, self._db,
|
|
286
291
|
auto_linker=self._auto_linker,
|
|
287
292
|
graph_analyzer=self._graph_analyzer,
|
|
288
293
|
temporal_validator=self._temporal_validator,
|
|
289
294
|
summarizer=summarizer,
|
|
290
|
-
behavioral_store=
|
|
295
|
+
behavioral_store=_get_behavioral_tracker(self._db),
|
|
291
296
|
embedder=self._embedder, # v3.4.7: for CCQ worker
|
|
292
297
|
llm=getattr(self, "_llm", None), # v3.4.7: for CCQ worker
|
|
293
298
|
)
|
{superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/fact_consolidator.py
RENAMED
|
@@ -226,19 +226,41 @@ def _consolidate_cluster(
|
|
|
226
226
|
except (json.JSONDecodeError, TypeError):
|
|
227
227
|
pass
|
|
228
228
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
))
|
|
229
|
+
# P0-3 (dedup-complete-01): apply the SAME content-idempotency invariant
|
|
230
|
+
# as storage.database.store_fact — but on THIS cursor so it stays inside
|
|
231
|
+
# the cluster SAVEPOINT. Previously this raw INSERT bypassed dedup, so a
|
|
232
|
+
# consolidated summary identical to an existing live fact created a
|
|
233
|
+
# duplicate row and never reinforced evidence. Now: reinforce-or-insert.
|
|
234
|
+
# (Excludes 'archived' = soft-deleted, mirroring store_fact.)
|
|
235
|
+
_existing = c.execute(
|
|
236
|
+
"SELECT fact_id FROM atomic_facts "
|
|
237
|
+
"WHERE profile_id = ? AND content = ? "
|
|
238
|
+
"AND lifecycle IN ('active', 'warm', 'cold') "
|
|
239
|
+
"ORDER BY created_at LIMIT 1",
|
|
240
|
+
(profile_id, summary),
|
|
241
|
+
).fetchone()
|
|
242
|
+
if _existing:
|
|
243
|
+
new_fact_id = _existing["fact_id"]
|
|
244
|
+
c.execute(
|
|
245
|
+
"UPDATE atomic_facts "
|
|
246
|
+
"SET evidence_count = evidence_count + ?, access_count = access_count + 1 "
|
|
247
|
+
"WHERE fact_id = ?",
|
|
248
|
+
(len(facts), new_fact_id),
|
|
249
|
+
)
|
|
250
|
+
else:
|
|
251
|
+
c.execute("""
|
|
252
|
+
INSERT INTO atomic_facts
|
|
253
|
+
(fact_id, memory_id, profile_id, content, fact_type,
|
|
254
|
+
entities_json, canonical_entities_json,
|
|
255
|
+
confidence, importance, evidence_count, access_count,
|
|
256
|
+
created_at, lifecycle)
|
|
257
|
+
VALUES (?, '', ?, ?, 'semantic', ?, ?, ?, 0.8, ?, 0, ?, 'active')
|
|
258
|
+
""", (
|
|
259
|
+
new_fact_id, profile_id, summary,
|
|
260
|
+
json.dumps(list(all_entities)),
|
|
261
|
+
json.dumps(list(all_entities)),
|
|
262
|
+
round(avg_confidence, 3), len(facts), now,
|
|
263
|
+
))
|
|
242
264
|
|
|
243
265
|
# Record the consolidation
|
|
244
266
|
consolidation_id = uuid.uuid4().hex[:16]
|
|
@@ -257,6 +279,25 @@ def _consolidate_cluster(
|
|
|
257
279
|
(*fact_ids, profile_id),
|
|
258
280
|
)
|
|
259
281
|
|
|
282
|
+
# P1-4 (graph-integrity-01): archived facts must stop influencing
|
|
283
|
+
# graph-based ranking. The association_edges FK is ON DELETE CASCADE
|
|
284
|
+
# only (no ON UPDATE), so archiving via UPDATE leaves orphaned edges
|
|
285
|
+
# that spreading_activation still reads. Remove edges touching the
|
|
286
|
+
# archived facts, and set their retention zone so ForgettingFilter
|
|
287
|
+
# excludes them. Inside the SAVEPOINT for atomicity.
|
|
288
|
+
c.execute(
|
|
289
|
+
f"DELETE FROM association_edges "
|
|
290
|
+
f"WHERE profile_id = ? "
|
|
291
|
+
f"AND (source_fact_id IN ({placeholders}) "
|
|
292
|
+
f" OR target_fact_id IN ({placeholders}))",
|
|
293
|
+
(profile_id, *fact_ids, *fact_ids),
|
|
294
|
+
)
|
|
295
|
+
c.execute(
|
|
296
|
+
f"UPDATE fact_retention SET lifecycle_zone = 'archive' "
|
|
297
|
+
f"WHERE profile_id = ? AND fact_id IN ({placeholders})",
|
|
298
|
+
(profile_id, *fact_ids),
|
|
299
|
+
)
|
|
300
|
+
|
|
260
301
|
c.execute(f"RELEASE SAVEPOINT {savepoint_name}")
|
|
261
302
|
|
|
262
303
|
except Exception:
|
|
@@ -56,6 +56,7 @@ def prune_graph(
|
|
|
56
56
|
"self_loops_removed": 0,
|
|
57
57
|
"duplicates_removed": 0,
|
|
58
58
|
"hub_edges_removed": 0,
|
|
59
|
+
"association_orphans_removed": 0, # gi-04
|
|
59
60
|
"total_before": 0,
|
|
60
61
|
"total_after": 0,
|
|
61
62
|
}
|
|
@@ -83,6 +84,9 @@ def prune_graph(
|
|
|
83
84
|
stats["hub_edges_removed"] = _cap_node_degree(
|
|
84
85
|
c, profile_id, _MAX_DEGREE_PER_NODE, dry_run,
|
|
85
86
|
)
|
|
87
|
+
stats["association_orphans_removed"] = _remove_orphan_association_edges(
|
|
88
|
+
c, profile_id, dry_run,
|
|
89
|
+
)
|
|
86
90
|
|
|
87
91
|
if dry_run:
|
|
88
92
|
c.execute("ROLLBACK")
|
|
@@ -122,6 +126,34 @@ def prune_graph(
|
|
|
122
126
|
return stats
|
|
123
127
|
|
|
124
128
|
|
|
129
|
+
def _remove_orphan_association_edges(
|
|
130
|
+
c: sqlite3.Cursor,
|
|
131
|
+
profile_id: str,
|
|
132
|
+
dry_run: bool,
|
|
133
|
+
) -> int:
|
|
134
|
+
"""gi-04: remove association_edges whose source/target fact no longer
|
|
135
|
+
exists in atomic_facts.
|
|
136
|
+
|
|
137
|
+
prune_graph historically only touched graph_edges despite its docstring
|
|
138
|
+
claiming "all graph pruning". Hard-deleted facts leave orphaned
|
|
139
|
+
association_edges (the FK cascade only fires under FK-on connections),
|
|
140
|
+
which spreading_activation then has to scan. Returns rows removed.
|
|
141
|
+
"""
|
|
142
|
+
where = (
|
|
143
|
+
"profile_id = ? AND ("
|
|
144
|
+
"source_fact_id NOT IN (SELECT fact_id FROM atomic_facts WHERE profile_id = ?) "
|
|
145
|
+
"OR target_fact_id NOT IN (SELECT fact_id FROM atomic_facts WHERE profile_id = ?))"
|
|
146
|
+
)
|
|
147
|
+
c.execute(f"SELECT COUNT(*) AS cnt FROM association_edges WHERE {where}",
|
|
148
|
+
(profile_id, profile_id, profile_id))
|
|
149
|
+
n = c.fetchone()["cnt"]
|
|
150
|
+
if dry_run or not n:
|
|
151
|
+
return n
|
|
152
|
+
c.execute(f"DELETE FROM association_edges WHERE {where}",
|
|
153
|
+
(profile_id, profile_id, profile_id))
|
|
154
|
+
return c.rowcount
|
|
155
|
+
|
|
156
|
+
|
|
125
157
|
def _remove_orphan_edges(
|
|
126
158
|
c: sqlite3.Cursor,
|
|
127
159
|
profile_id: str,
|
|
@@ -321,60 +353,64 @@ def _cap_node_degree(
|
|
|
321
353
|
2. Edges with rn > max_degree are deleted in a single DELETE statement.
|
|
322
354
|
Requires SQLite 3.25+ (window functions). System is on 3.53.1.
|
|
323
355
|
"""
|
|
356
|
+
# gi-03: cap BOTH out-degree (PARTITION BY source_id) AND in-degree
|
|
357
|
+
# (PARTITION BY target_id). Previously only out-degree was capped, so hub
|
|
358
|
+
# nodes accumulated unbounded in-degree (observed up to 1457), inflating
|
|
359
|
+
# entity-channel fan-in cost. An edge is removed if it exceeds max_degree
|
|
360
|
+
# in EITHER direction (low-weight to both its endpoints). Computed in one
|
|
361
|
+
# window-function pass, no Python loops.
|
|
324
362
|
if dry_run:
|
|
325
363
|
c.execute(
|
|
326
364
|
"""
|
|
327
365
|
SELECT COUNT(*) as cnt FROM (
|
|
328
366
|
SELECT edge_id,
|
|
329
|
-
ROW_NUMBER() OVER (
|
|
330
|
-
|
|
331
|
-
) as rn
|
|
367
|
+
ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY weight DESC) as out_rn,
|
|
368
|
+
ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY weight DESC) as in_rn
|
|
332
369
|
FROM graph_edges
|
|
333
370
|
WHERE profile_id = ?
|
|
334
|
-
) WHERE
|
|
371
|
+
) WHERE out_rn > ? OR in_rn > ?
|
|
335
372
|
""",
|
|
336
|
-
(profile_id, max_degree),
|
|
373
|
+
(profile_id, max_degree, max_degree),
|
|
337
374
|
)
|
|
338
375
|
excess = c.fetchone()["cnt"]
|
|
339
376
|
logger.info(
|
|
340
|
-
"(dry-run) _cap_node_degree: ~%d edges would be removed (max_degree=%d)",
|
|
377
|
+
"(dry-run) _cap_node_degree: ~%d edges would be removed (max_degree=%d, in+out)",
|
|
341
378
|
excess, max_degree,
|
|
342
379
|
)
|
|
343
380
|
return excess
|
|
344
381
|
|
|
345
|
-
# Step 1:
|
|
346
|
-
c.execute("
|
|
347
|
-
c.execute("
|
|
382
|
+
# Step 1: collect edges exceeding the cap in either direction (one pass).
|
|
383
|
+
c.execute("DROP TABLE IF EXISTS _slm_cap_del")
|
|
384
|
+
c.execute("CREATE TEMP TABLE _slm_cap_del (edge_id TEXT PRIMARY KEY)")
|
|
348
385
|
c.execute(
|
|
349
386
|
"""
|
|
350
|
-
INSERT INTO
|
|
387
|
+
INSERT OR IGNORE INTO _slm_cap_del (edge_id)
|
|
351
388
|
SELECT edge_id FROM (
|
|
352
389
|
SELECT edge_id,
|
|
353
|
-
ROW_NUMBER() OVER (
|
|
354
|
-
|
|
355
|
-
) as rn
|
|
390
|
+
ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY weight DESC) as out_rn,
|
|
391
|
+
ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY weight DESC) as in_rn
|
|
356
392
|
FROM graph_edges
|
|
357
393
|
WHERE profile_id = ?
|
|
358
|
-
) WHERE
|
|
394
|
+
) WHERE out_rn > ? OR in_rn > ?
|
|
359
395
|
""",
|
|
360
|
-
(profile_id, max_degree),
|
|
396
|
+
(profile_id, max_degree, max_degree),
|
|
361
397
|
)
|
|
362
398
|
|
|
363
|
-
# Step 2: delete
|
|
399
|
+
# Step 2: delete the over-cap edges (single DELETE).
|
|
364
400
|
c.execute(
|
|
365
401
|
"""
|
|
366
402
|
DELETE FROM graph_edges
|
|
367
403
|
WHERE profile_id = ?
|
|
368
|
-
AND edge_id
|
|
404
|
+
AND edge_id IN (SELECT edge_id FROM _slm_cap_del)
|
|
369
405
|
""",
|
|
370
406
|
(profile_id,),
|
|
371
407
|
)
|
|
372
408
|
deleted = c.rowcount
|
|
373
409
|
|
|
374
|
-
c.execute("DROP TABLE IF EXISTS
|
|
410
|
+
c.execute("DROP TABLE IF EXISTS _slm_cap_del")
|
|
375
411
|
|
|
376
412
|
logger.info(
|
|
377
|
-
"_cap_node_degree: deleted %d low-weight edges (max_degree=%d)",
|
|
413
|
+
"_cap_node_degree: deleted %d low-weight edges (max_degree=%d, in+out capped)",
|
|
378
414
|
deleted, max_degree,
|
|
379
415
|
)
|
|
380
416
|
return deleted
|
|
@@ -107,8 +107,17 @@ def run_maintenance(
|
|
|
107
107
|
"fisher_coupled": 0,
|
|
108
108
|
"sheaf_checked": 0,
|
|
109
109
|
"entity_summaries_consolidated": 0, # V3.4.40
|
|
110
|
+
"orphan_metadata_gc": 0, # v3.6.4 (P1-3)
|
|
110
111
|
}
|
|
111
112
|
|
|
113
|
+
# P1-3 (embeddings-vector-02): sweep orphaned embedding_metadata left by
|
|
114
|
+
# any FK-off delete path, so the semantic channel never maps to dead facts.
|
|
115
|
+
# Runs before the early-return so it sweeps even for empty profiles.
|
|
116
|
+
try:
|
|
117
|
+
counts["orphan_metadata_gc"] = db.gc_orphaned_embedding_metadata()
|
|
118
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
119
|
+
logger.debug("orphan metadata GC skipped: %s", exc)
|
|
120
|
+
|
|
112
121
|
facts = db.get_all_facts(profile_id)
|
|
113
122
|
if not facts:
|
|
114
123
|
return counts
|
{superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/store_pipeline.py
RENAMED
|
@@ -102,6 +102,37 @@ def enrich_fact(
|
|
|
102
102
|
)
|
|
103
103
|
|
|
104
104
|
|
|
105
|
+
# ---------------------------------------------------------------------------
|
|
106
|
+
# Vector dual-write helper (P1-2 / embeddings-vector-01)
|
|
107
|
+
# ---------------------------------------------------------------------------
|
|
108
|
+
|
|
109
|
+
def _upsert_fact_vectors(fact, profile_id, ann_index, vector_store, embedder=None):
|
|
110
|
+
"""Dual-write a fact's embedding to the ANN index + sqlite-vec store.
|
|
111
|
+
|
|
112
|
+
Embeds on-demand when the fact has no embedding (e.g. consolidated
|
|
113
|
+
summary facts created without one), so UPDATE/SUPERSEDE and consolidated
|
|
114
|
+
facts remain visible to the semantic channel instead of having a row in
|
|
115
|
+
``atomic_facts`` but none in the vector store.
|
|
116
|
+
"""
|
|
117
|
+
if not getattr(fact, "embedding", None) and embedder is not None and fact.content:
|
|
118
|
+
try:
|
|
119
|
+
fact.embedding = embedder.embed(fact.content)
|
|
120
|
+
except Exception as _emb_exc: # pragma: no cover - defensive
|
|
121
|
+
logger.debug("on-demand embed failed for %s: %s", fact.fact_id, _emb_exc)
|
|
122
|
+
return
|
|
123
|
+
if not getattr(fact, "embedding", None):
|
|
124
|
+
return
|
|
125
|
+
if ann_index:
|
|
126
|
+
ann_index.add(fact.fact_id, fact.embedding)
|
|
127
|
+
# V3.2: VectorStore upsert (sqlite-vec) -- dual-write (Rule 12)
|
|
128
|
+
if vector_store and getattr(vector_store, "available", False):
|
|
129
|
+
vector_store.upsert(
|
|
130
|
+
fact_id=fact.fact_id,
|
|
131
|
+
profile_id=profile_id,
|
|
132
|
+
embedding=fact.embedding,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
105
136
|
# ---------------------------------------------------------------------------
|
|
106
137
|
# run_store (was MemoryEngine.store)
|
|
107
138
|
# ---------------------------------------------------------------------------
|
|
@@ -175,10 +206,20 @@ def run_store(
|
|
|
175
206
|
)
|
|
176
207
|
db.store_memory(record)
|
|
177
208
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
209
|
+
try:
|
|
210
|
+
facts = fact_extractor.extract_facts(
|
|
211
|
+
turns=[content], session_id=session_id,
|
|
212
|
+
session_date=parsed_date, speaker_a=speaker,
|
|
213
|
+
)
|
|
214
|
+
except Exception as _extract_exc:
|
|
215
|
+
# P0-1 (remember-write-04): an extractor EXCEPTION (transient LLM/embed
|
|
216
|
+
# backend error) must NOT orphan the already-committed memory. The None
|
|
217
|
+
# guard below only handled a None *return*, not a raise. Treat a raise
|
|
218
|
+
# as "no facts" so the verbatim/raw fallback persists the content.
|
|
219
|
+
logger.warning(
|
|
220
|
+
"extract_facts() raised — falling back to raw fact: %s", _extract_exc,
|
|
221
|
+
)
|
|
222
|
+
facts = None
|
|
182
223
|
|
|
183
224
|
# v3.4.38: Defensive None guard. extract_facts() returns None on transient
|
|
184
225
|
# failures (embedding worker timeout, LLM call fail). Without this guard,
|
|
@@ -257,58 +298,77 @@ def run_store(
|
|
|
257
298
|
)
|
|
258
299
|
|
|
259
300
|
if consolidator:
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
301
|
+
try:
|
|
302
|
+
action = consolidator.consolidate(fact, profile_id)
|
|
303
|
+
except Exception as _consolidate_exc:
|
|
304
|
+
# P0-1 (remember-write-03): a consolidate failure (e.g. LLM
|
|
305
|
+
# timeout) must NOT orphan the already-committed memory. Fall
|
|
306
|
+
# back to storing the raw enriched fact so the content stays
|
|
307
|
+
# retrievable across all channels.
|
|
308
|
+
logger.warning(
|
|
309
|
+
"consolidate() failed for fact %s — storing raw fact as "
|
|
310
|
+
"fallback: %s", fact.fact_id, _consolidate_exc,
|
|
311
|
+
)
|
|
312
|
+
action = None
|
|
313
|
+
|
|
314
|
+
if action is not None:
|
|
315
|
+
if action.action_type.value == "noop":
|
|
316
|
+
continue
|
|
317
|
+
|
|
318
|
+
# Opinion confidence tracking: reinforce or decay
|
|
319
|
+
if fact.fact_type == FactType.OPINION and action.action_type.value == "update":
|
|
320
|
+
try:
|
|
321
|
+
existing = db.get_fact(action.new_fact_id)
|
|
322
|
+
if existing and existing.fact_type == FactType.OPINION:
|
|
323
|
+
new_conf = min(1.0, existing.confidence + 0.1)
|
|
324
|
+
db.update_fact(action.new_fact_id, {"confidence": new_conf})
|
|
325
|
+
except Exception:
|
|
326
|
+
pass
|
|
327
|
+
elif fact.fact_type == FactType.OPINION and action.action_type.value == "supersede":
|
|
328
|
+
try:
|
|
329
|
+
old_id = getattr(action, "old_fact_id", None)
|
|
330
|
+
if old_id:
|
|
331
|
+
old_fact = db.get_fact(old_id)
|
|
332
|
+
if old_fact:
|
|
333
|
+
new_conf = max(0.0, old_fact.confidence - 0.2)
|
|
334
|
+
db.update_fact(old_id, {"confidence": new_conf})
|
|
335
|
+
except Exception:
|
|
336
|
+
pass
|
|
337
|
+
|
|
338
|
+
if action.action_type.value in ("update", "supersede"):
|
|
339
|
+
updated_fact = db.get_fact(action.new_fact_id)
|
|
340
|
+
if updated_fact:
|
|
341
|
+
# P1-2 (embeddings-vector-01): the merged/superseding
|
|
342
|
+
# fact must reach the vector store (embed on-demand if
|
|
343
|
+
# it has none) — otherwise it is invisible to the
|
|
344
|
+
# semantic channel despite living in atomic_facts.
|
|
345
|
+
_upsert_fact_vectors(
|
|
346
|
+
updated_fact, profile_id, ann_index, vector_store, embedder,
|
|
347
|
+
)
|
|
348
|
+
if graph_builder:
|
|
349
|
+
graph_builder.build_edges(updated_fact, profile_id)
|
|
350
|
+
if observation_builder:
|
|
351
|
+
for eid in updated_fact.canonical_entities:
|
|
352
|
+
observation_builder.update_profile(
|
|
353
|
+
eid, updated_fact, profile_id,
|
|
354
|
+
)
|
|
355
|
+
stored_ids.append(action.new_fact_id)
|
|
356
|
+
continue
|
|
357
|
+
# ADD case: consolidator already stored the fact (F8 fix)
|
|
358
|
+
# Fall through to post-processing below
|
|
359
|
+
else:
|
|
360
|
+
# Consolidate failed → store the raw fact ourselves so the
|
|
361
|
+
# memory is never left without a retrievable fact, then fall
|
|
362
|
+
# through to post-processing (embeddings, graph, context).
|
|
363
|
+
db.store_fact(fact)
|
|
298
364
|
else:
|
|
299
365
|
db.store_fact(fact)
|
|
300
366
|
|
|
301
367
|
stored_ids.append(fact.fact_id)
|
|
302
368
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
if fact.embedding and vector_store and vector_store.available:
|
|
307
|
-
vector_store.upsert(
|
|
308
|
-
fact_id=fact.fact_id,
|
|
309
|
-
profile_id=profile_id,
|
|
310
|
-
embedding=fact.embedding,
|
|
311
|
-
)
|
|
369
|
+
# Dual-write embedding to ANN index + vector store (embed on-demand if
|
|
370
|
+
# a consolidated ADD fact arrived without one). See _upsert_fact_vectors.
|
|
371
|
+
_upsert_fact_vectors(fact, profile_id, ann_index, vector_store, embedder)
|
|
312
372
|
# Phase 2: Generate contextual description (after consolidator, before graph_builder)
|
|
313
373
|
if context_generator:
|
|
314
374
|
try:
|
|
@@ -489,6 +549,15 @@ def run_store_fact_direct(
|
|
|
489
549
|
and graph edges are all populated — even for auxiliary data.
|
|
490
550
|
Creates a parent memory record to satisfy FK constraint.
|
|
491
551
|
"""
|
|
552
|
+
# remember-write-02: gate low-quality content (empty, bare category tags,
|
|
553
|
+
# placeholder/template leakage) at the WRITE boundary, matching run_store's
|
|
554
|
+
# gate. Previously this direct path had no filter, so junk entered the KB
|
|
555
|
+
# and polluted evidence/stats/embeddings (the read-side filter only hid it).
|
|
556
|
+
from superlocalmemory.core.injection import is_low_quality
|
|
557
|
+
if is_low_quality(fact.content):
|
|
558
|
+
logger.debug("run_store_fact_direct: skipping low-quality content")
|
|
559
|
+
return fact.fact_id
|
|
560
|
+
|
|
492
561
|
# Create parent memory record (FK: atomic_facts.memory_id → memories.memory_id)
|
|
493
562
|
if not fact.memory_id:
|
|
494
563
|
record = MemoryRecord(
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
+
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
+
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
+
|
|
5
|
+
"""Pure decision logic for the MCP stdin-EOF self-termination monitor.
|
|
6
|
+
|
|
7
|
+
Isolated here (no imports, no side effects) so the kqueue ``EV_EOF``
|
|
8
|
+
handling contract is unit-testable without importing the FastMCP server
|
|
9
|
+
module, which starts daemon threads and auto-starts the SLM daemon at
|
|
10
|
+
import time.
|
|
11
|
+
|
|
12
|
+
Background (v3.6.4 fix)
|
|
13
|
+
-----------------------
|
|
14
|
+
The stdin-EOF monitor (``superlocalmemory.mcp.server._stdin_eof_monitor``)
|
|
15
|
+
exists to reap orphaned ``slm mcp`` processes when an IDE/agent abandons the
|
|
16
|
+
stdio pipe without quitting. It registers ``EVFILT_READ | EV_EOF`` on stdin
|
|
17
|
+
and terminates the process when the write-end closes.
|
|
18
|
+
|
|
19
|
+
On macOS, ``EVFILT_READ`` reports ``EV_EOF`` *together with* still-readable
|
|
20
|
+
bytes (``ev.data > 0``) when the write-end is closed while a final request
|
|
21
|
+
is still buffered in the pipe. The original monitor exited on the EOF flag
|
|
22
|
+
alone — dropping that buffered request and tearing down a session that
|
|
23
|
+
still had a pending in-flight call. Under strict MCP hosts whose transport
|
|
24
|
+
half-closes stdin around reconnect/teardown, this surfaced as the server
|
|
25
|
+
self-terminating mid-request, which the host then logged as a keepalive
|
|
26
|
+
failure and respawned (observed against the Hermes agent).
|
|
27
|
+
|
|
28
|
+
The guard defers termination until the buffer is genuinely drained
|
|
29
|
+
(``ev.data <= 0``), letting the FastMCP reader consume the last request
|
|
30
|
+
first. Genuine disconnects (EOF with an empty buffer) still terminate
|
|
31
|
+
immediately — behaviour identical to before for the common case.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
__all__ = ["eof_action"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def eof_action(flags: int, data: int, eof_flag: int) -> str:
|
|
40
|
+
"""Decide how the stdin-EOF monitor should react to one kqueue event.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
flags: ``kevent.flags`` bitmask returned by ``kqueue.control``.
|
|
44
|
+
data: ``kevent.data`` — for ``EVFILT_READ`` this is the number of
|
|
45
|
+
bytes still readable on the descriptor.
|
|
46
|
+
eof_flag: the platform ``select.KQ_EV_EOF`` constant (injected so
|
|
47
|
+
this function stays import-free and trivially testable).
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
- ``"exit"`` — genuine end-of-stream: write-end closed and the
|
|
51
|
+
buffer is drained (``data <= 0``). Safe to self-terminate.
|
|
52
|
+
- ``"drain"`` — write-end closed but unread bytes remain
|
|
53
|
+
(``data > 0``). Must NOT terminate yet; let the reader consume
|
|
54
|
+
the buffered request first, otherwise it is silently dropped.
|
|
55
|
+
- ``"ignore"`` — no EOF on this event (ordinary readability or a
|
|
56
|
+
spurious wake); nothing to do.
|
|
57
|
+
"""
|
|
58
|
+
if not (flags & eof_flag):
|
|
59
|
+
return "ignore"
|
|
60
|
+
return "drain" if data > 0 else "exit"
|
|
@@ -288,11 +288,26 @@ _watchdog_thread.start()
|
|
|
288
288
|
# closes WITHOUT consuming any bytes, so it cannot race with FastMCP's asyncio
|
|
289
289
|
# stdin reader. On Linux (no kqueue), the watchdog alone provides coverage.
|
|
290
290
|
def _stdin_eof_monitor() -> None:
|
|
291
|
-
"""Exit when the IDE closes our stdin pipe (kqueue — macOS only).
|
|
292
|
-
|
|
291
|
+
"""Exit when the IDE closes our stdin pipe (kqueue — macOS only).
|
|
292
|
+
|
|
293
|
+
V3.6.4: kqueue ``EVFILT_READ`` reports ``EV_EOF`` *together with*
|
|
294
|
+
still-readable bytes (``ev.data > 0``) when the write-end closes while a
|
|
295
|
+
final request is buffered. Exiting on the EOF flag alone (pre-3.6.4)
|
|
296
|
+
dropped that in-flight request and self-terminated a session that still
|
|
297
|
+
had work to deliver — strict MCP hosts (e.g. the Hermes agent) then
|
|
298
|
+
logged a keepalive failure and respawned the process. We now defer
|
|
299
|
+
termination until the buffer is genuinely drained (see ``_stdin_guard``).
|
|
300
|
+
"""
|
|
301
|
+
import select as _sel, os as _os_eof, time as _time
|
|
302
|
+
from superlocalmemory.mcp._stdin_guard import eof_action
|
|
293
303
|
_mlog = logging.getLogger(__name__ + ".stdin_monitor")
|
|
294
304
|
if not hasattr(_sel, "kqueue"):
|
|
295
305
|
return # Linux / non-macOS: watchdog covers process death
|
|
306
|
+
# Bounded grace for the FastMCP reader to drain a buffered final request
|
|
307
|
+
# before we tear down. ~2 s ceiling (40 × 50 ms): a genuine EOF means the
|
|
308
|
+
# session is ending regardless, so we never wait indefinitely.
|
|
309
|
+
_DRAIN_POLL_S = 0.05
|
|
310
|
+
_DRAIN_MAX_POLLS = 40
|
|
296
311
|
try:
|
|
297
312
|
fd = sys.stdin.fileno()
|
|
298
313
|
kq = _sel.kqueue()
|
|
@@ -301,9 +316,23 @@ def _stdin_eof_monitor() -> None:
|
|
|
301
316
|
while True:
|
|
302
317
|
evs = kq.control(None, 4, 30.0) # 30 s poll — low cost
|
|
303
318
|
for ev in evs:
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
319
|
+
action = eof_action(ev.flags, ev.data, _sel.KQ_EV_EOF)
|
|
320
|
+
if action == "ignore":
|
|
321
|
+
continue
|
|
322
|
+
if action == "drain":
|
|
323
|
+
# Write-end closed but unread bytes remain. Let the
|
|
324
|
+
# FastMCP reader consume the final request(s); poll until
|
|
325
|
+
# drained or the grace ceiling elapses.
|
|
326
|
+
for _ in range(_DRAIN_MAX_POLLS):
|
|
327
|
+
_time.sleep(_DRAIN_POLL_S)
|
|
328
|
+
recheck = kq.control(None, 4, 0) # non-blocking
|
|
329
|
+
if not recheck:
|
|
330
|
+
break
|
|
331
|
+
ev = recheck[0]
|
|
332
|
+
if eof_action(ev.flags, ev.data, _sel.KQ_EV_EOF) != "drain":
|
|
333
|
+
break
|
|
334
|
+
_mlog.info("stdin write-end closed (kqueue EOF, drained), self-terminating")
|
|
335
|
+
_os_eof._exit(0)
|
|
307
336
|
except Exception as exc:
|
|
308
337
|
_mlog.debug("stdin EOF monitor error: %s — watchdog will cover", exc)
|
|
309
338
|
|