superlocalmemory 3.4.58__tar.gz → 3.5.1__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.4.58/src/superlocalmemory.egg-info → superlocalmemory-3.5.1}/PKG-INFO +4 -2
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/pyproject.toml +5 -2
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/__init__.py +1 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/commands.py +80 -33
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/daemon.py +14 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/main.py +1 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/backend_orchestrator.py +19 -13
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/config.py +83 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/graph_pruner.py +92 -2
- superlocalmemory-3.5.1/src/superlocalmemory/core/injection.py +351 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/recall_pipeline.py +29 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/store_pipeline.py +13 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/graph_builder.py +32 -8
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/auto_recall_hook.py +50 -26
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/before_web_hook.py +3 -2
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/user_prompt_hook.py +5 -2
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/_daemon_proxy.py +1 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_active.py +130 -9
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_context.py +18 -4
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/bm25_channel.py +50 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/engine.py +43 -9
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/hopfield_channel.py +22 -9
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/spreading_activation.py +27 -7
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/temporal_channel.py +10 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/memories.py +43 -12
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/v3_api.py +40 -25
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/unified_daemon.py +113 -3
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/database.py +47 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migration_runner.py +4 -0
- superlocalmemory-3.5.1/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +40 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/__init__.py +1 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/models.py +3 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1/src/superlocalmemory.egg-info}/PKG-INFO +4 -2
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory.egg-info/SOURCES.txt +3 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory.egg-info/requires.txt +4 -1
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_before_web_hook.py +1 -1
- superlocalmemory-3.5.1/tests/test_injection.py +424 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/AUTHORS.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/LICENSE +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/NOTICE +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/README.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/setup.cfg +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/attribution/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/attribution/signer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/attribution/watermark.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/context_commands.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/db_migrate.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/escape_hatch.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/json_output.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/pending_store.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/post_install.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/service_installer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/setup_wizard.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/version_banner.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/changes.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/communities.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/config.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/database.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/flows.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/graph_store.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/incremental.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/models.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/parser.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/resolver.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/search.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/service.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/code_graph/watcher.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/abac.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/audit.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/gdpr.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/lifecycle.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/retention.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/compliance/scheduler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/clock_monitor.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/consolidation_engine.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/context_cache.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/db_pool.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/embedding_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/embeddings.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/engine.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/engine_capabilities.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/engine_lock.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/engine_wiring.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/error_catalog.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/error_envelope.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/fact_consolidator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/file_lock.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/graph_analyzer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/health_monitor.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/loop_watchdog.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/maintenance.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/modes.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/ollama_embedder.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/platform_utils.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/priority_queue.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/profiles.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/pruning_engine.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/queue_consumer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/ram_lock.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/rate_limit.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/recall_gate.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/recall_queue.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/recall_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/registry.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/reranker_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/safe_fs.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/security_primitives.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/shadow_router.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/slm_disabled.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/slmignore.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/summarizer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/tier_manager.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/topic_signature.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/worker_pool.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/dynamics/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/auto_linker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/consolidator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/context_generator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/emotional.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/foresight.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/observation_builder.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/scene_builder.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/signal_inference.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/encoding/type_router.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/budget.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/evolution_store.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/triggers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/evolution/types.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/graph/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/graph/cozo_backend.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/adapter_base.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/auto_capture.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/auto_recall.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/context_payload.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/ide_connector.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/rules_engine.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/session_registry.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/sync_loop.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/auth_middleware.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/backup.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/cache_manager.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/cloud_backup.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/event_bus.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/pid_manager.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/process_reaper.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/rate_limiter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/credentials.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/parsers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/adaptive.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/arm_catalog.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/assertion_miner.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/bandit.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/bandit_cache.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/behavioral.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/bootstrap.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/cross_project.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/database.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/engagement.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/ensemble.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/entity_compiler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/features.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/feedback.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/labeler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/legacy_migration.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/memory_merge.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/model_cache.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/model_rollback.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/outcome_queue.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/outcomes.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/pattern_miner.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/project_context.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/ranker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/ranker_common.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/reward.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/reward_archive.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/reward_boost.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/reward_proxy.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/shadow_test.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/signal_worker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/signals.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/source_quality.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/trigram_index.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/learning/workflows.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/llm/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/llm/backbone.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/ebbinghaus.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/fisher.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/fisher_quantized.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/hopfield.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/langevin.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/polar_quant.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/qjl.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/sheaf.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/math/turbo_quant.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/resources.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/server.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/shared.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_core.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_learning.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_v28.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_v3.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mcp/tools_v33.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mesh/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mesh/broker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/mesh/remote_sync.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/migrations/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/agentic.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/ann_index.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/fusion.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/reranker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/strategy.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/retrieval/vector_store.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/api.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/bandit_loops.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/middleware/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/adapters.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/agents.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/backup.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/behavioral.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/brain.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/chat.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/compliance.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/data_io.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/entity.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/events.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/evolution.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/helpers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/ingest.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/insights.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/learning.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/mesh.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/prewarm.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/profiles.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/stats.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/tiers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/timeline.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/token.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/routes/ws.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/security_middleware.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/server/ui.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/access_control.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/access_log.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migration_v33.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/migrations.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/quantized_store.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v32.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v3410.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v3411.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v343.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v345.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/schema_v347.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/storage/v2_migrator.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/trust/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/trust/gate.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/trust/provenance.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/trust/scorer.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/trust/signals.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/css/brain.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/index.html +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/agents.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/brain.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/clusters.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/compliance.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/core.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/dashboard.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/events.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/feedback.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ide-status.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/init.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/math-health.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/memories.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/modal.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-health.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/profiles.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/search.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/settings.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/timeline.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/vector/__init__.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory.egg-info/top_level.txt +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_auto_hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_behavioral_full.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_claude_hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_cli.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_cli_json.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_cli_v33.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_compliance_full.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_config_system.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_engine_hooks.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_event_bus.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_features.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_final_locomo_mini.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_hook_handlers.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_ide_connector.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_infra.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_learning_advanced.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_learning_collectors.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_llm_provider.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_mcp_server.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_migration.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_mode_switch_preservation.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_post_install.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_ranker.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_topic_shift_hook.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_trust_full.py +0 -0
- {superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/tests/test_v3_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superlocalmemory
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.1
|
|
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
|
|
@@ -69,6 +69,8 @@ Provides-Extra: ui
|
|
|
69
69
|
Requires-Dist: fastapi[all]>=0.135.1; extra == "ui"
|
|
70
70
|
Requires-Dist: uvicorn>=0.42.0; extra == "ui"
|
|
71
71
|
Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "ui"
|
|
72
|
+
Provides-Extra: injection
|
|
73
|
+
Requires-Dist: tiktoken>=0.8.0; extra == "injection"
|
|
72
74
|
Provides-Extra: learning
|
|
73
75
|
Requires-Dist: lightgbm>=4.0.0; extra == "learning"
|
|
74
76
|
Provides-Extra: performance
|
|
@@ -79,7 +81,7 @@ Requires-Dist: google-auth-oauthlib>=1.2.0; extra == "ingestion"
|
|
|
79
81
|
Requires-Dist: google-api-python-client>=2.100.0; extra == "ingestion"
|
|
80
82
|
Requires-Dist: icalendar>=6.0.0; extra == "ingestion"
|
|
81
83
|
Provides-Extra: full
|
|
82
|
-
Requires-Dist: superlocalmemory[ingestion,learning,performance,search,ui]; extra == "full"
|
|
84
|
+
Requires-Dist: superlocalmemory[ingestion,injection,learning,performance,search,ui]; extra == "full"
|
|
83
85
|
Provides-Extra: dev
|
|
84
86
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
85
87
|
Requires-Dist: pytest-cov>=4.1; extra == "dev"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "superlocalmemory"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.5.1"
|
|
4
4
|
description = "Information-geometric agent memory with mathematical guarantees"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "AGPL-3.0-or-later"}
|
|
@@ -89,6 +89,9 @@ ui = [
|
|
|
89
89
|
"uvicorn>=0.42.0",
|
|
90
90
|
"python-multipart>=0.0.6,<1.0.0",
|
|
91
91
|
]
|
|
92
|
+
injection = [
|
|
93
|
+
"tiktoken>=0.8.0",
|
|
94
|
+
]
|
|
92
95
|
learning = [
|
|
93
96
|
"lightgbm>=4.0.0",
|
|
94
97
|
]
|
|
@@ -102,7 +105,7 @@ ingestion = [
|
|
|
102
105
|
"icalendar>=6.0.0",
|
|
103
106
|
]
|
|
104
107
|
full = [
|
|
105
|
-
"superlocalmemory[search,ui,learning,performance,ingestion]",
|
|
108
|
+
"superlocalmemory[search,ui,learning,performance,ingestion,injection]",
|
|
106
109
|
]
|
|
107
110
|
dev = [
|
|
108
111
|
"pytest>=8.0",
|
|
@@ -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.4.
|
|
31
|
+
__version__ = "3.4.64"
|
|
32
32
|
|
|
33
33
|
_REQUIRED_VERSIONS = {
|
|
34
34
|
"sentence_transformers": "5.3.0",
|
|
@@ -2067,14 +2067,18 @@ def cmd_session_context(args: Namespace) -> None:
|
|
|
2067
2067
|
This ensures the SessionStart hook completes within its 15s timeout even
|
|
2068
2068
|
when Ollama requires a 60s+ cold start. The fast path returns:
|
|
2069
2069
|
- Core Memory blocks (always-on context)
|
|
2070
|
-
- Recent high-importance memories (last
|
|
2070
|
+
- Recent high-importance memories (last N days)
|
|
2071
2071
|
- Session summary from last session
|
|
2072
2072
|
Falls back to the full engine path only if --full is passed explicitly.
|
|
2073
|
+
|
|
2074
|
+
v3.4.65: uses shared injection formatter (render_context) for identical
|
|
2075
|
+
output across MCP and CLI surfaces. --json flag returns structured JSON.
|
|
2073
2076
|
"""
|
|
2074
2077
|
import sqlite3
|
|
2075
2078
|
from pathlib import Path
|
|
2076
2079
|
from superlocalmemory.core.config import SLMConfig
|
|
2077
2080
|
|
|
2081
|
+
use_json = getattr(args, "json", False)
|
|
2078
2082
|
use_full = getattr(args, "full", False)
|
|
2079
2083
|
|
|
2080
2084
|
if use_full:
|
|
@@ -2093,13 +2097,21 @@ def cmd_session_context(args: Namespace) -> None:
|
|
|
2093
2097
|
query=getattr(args, "query", "") or "recent decisions and important context",
|
|
2094
2098
|
)
|
|
2095
2099
|
if context:
|
|
2096
|
-
|
|
2100
|
+
if use_json:
|
|
2101
|
+
from superlocalmemory.cli.json_output import json_print
|
|
2102
|
+
json_print("session-context", data={"context": context}, next_actions=[
|
|
2103
|
+
{"command": "slm recall --json <query>", "description": "Search memories"},
|
|
2104
|
+
])
|
|
2105
|
+
else:
|
|
2106
|
+
print(context)
|
|
2097
2107
|
except Exception as exc:
|
|
2098
2108
|
logger.debug("session-context (full) failed: %s", exc)
|
|
2099
2109
|
return
|
|
2100
2110
|
|
|
2101
2111
|
# ── FAST PATH: direct SQLite, no engine, <500ms ──────────────
|
|
2102
2112
|
try:
|
|
2113
|
+
from superlocalmemory.core.injection import InjectableMemory, render_context
|
|
2114
|
+
|
|
2103
2115
|
config = SLMConfig.load()
|
|
2104
2116
|
db_path = config.base_dir / "memory.db"
|
|
2105
2117
|
if not db_path.exists():
|
|
@@ -2108,78 +2120,113 @@ def cmd_session_context(args: Namespace) -> None:
|
|
|
2108
2120
|
pid = config.active_profile
|
|
2109
2121
|
conn = sqlite3.connect(str(db_path))
|
|
2110
2122
|
conn.row_factory = sqlite3.Row
|
|
2111
|
-
sections = []
|
|
2112
2123
|
|
|
2113
|
-
#
|
|
2124
|
+
# Collect facts for injection — same queries as pre-v3.4.65 but
|
|
2125
|
+
# mapped into InjectableMemory for the shared formatter.
|
|
2126
|
+
inj_mems: list[InjectableMemory] = []
|
|
2127
|
+
|
|
2128
|
+
# Core Memory blocks (compiled high-value context)
|
|
2114
2129
|
try:
|
|
2115
|
-
|
|
2130
|
+
cm_rows = conn.execute(
|
|
2116
2131
|
"SELECT block_type, content FROM core_memory_blocks "
|
|
2117
2132
|
"WHERE profile_id = ? ORDER BY block_type",
|
|
2118
2133
|
(pid,),
|
|
2119
2134
|
).fetchall()
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2135
|
+
for r in cm_rows:
|
|
2136
|
+
content = f"[{r['block_type']}] {r['content']}"
|
|
2137
|
+
inj_mems.append(InjectableMemory(
|
|
2138
|
+
content=content, score=1.0, fact_id="",
|
|
2139
|
+
importance=1.0, access_count=10,
|
|
2140
|
+
pinned=True,
|
|
2141
|
+
))
|
|
2123
2142
|
except sqlite3.OperationalError:
|
|
2124
2143
|
pass
|
|
2125
2144
|
|
|
2126
|
-
#
|
|
2145
|
+
# Recent important memories — age gate from --max-age-days (default 30)
|
|
2127
2146
|
max_age = getattr(args, "max_age_days", 30)
|
|
2128
2147
|
age_clause = (
|
|
2129
2148
|
f"AND created_at >= datetime('now', '-{int(max_age)} days') "
|
|
2130
2149
|
if max_age > 0 else ""
|
|
2131
2150
|
)
|
|
2132
2151
|
try:
|
|
2133
|
-
|
|
2134
|
-
"SELECT content,
|
|
2152
|
+
fact_rows = conn.execute(
|
|
2153
|
+
"SELECT fact_id, content, importance, access_count, fact_type FROM atomic_facts "
|
|
2135
2154
|
"WHERE profile_id = ? "
|
|
2136
2155
|
f"{age_clause}"
|
|
2137
2156
|
"AND lifecycle = 'active' "
|
|
2138
2157
|
"ORDER BY importance DESC, created_at DESC LIMIT 10",
|
|
2139
2158
|
(pid,),
|
|
2140
2159
|
).fetchall()
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2160
|
+
for r in fact_rows:
|
|
2161
|
+
inj_mems.append(InjectableMemory(
|
|
2162
|
+
content=r["content"],
|
|
2163
|
+
score=r["importance"] or 0.5,
|
|
2164
|
+
fact_id=r["fact_id"],
|
|
2165
|
+
importance=r["importance"] or 0.0,
|
|
2166
|
+
access_count=r["access_count"] or 0,
|
|
2167
|
+
))
|
|
2147
2168
|
except sqlite3.OperationalError:
|
|
2148
2169
|
pass
|
|
2149
2170
|
|
|
2150
|
-
#
|
|
2171
|
+
# Session markers (last session summary)
|
|
2151
2172
|
try:
|
|
2152
|
-
|
|
2153
|
-
"SELECT content,
|
|
2173
|
+
sess_rows = conn.execute(
|
|
2174
|
+
"SELECT fact_id, content, importance, access_count FROM atomic_facts "
|
|
2154
2175
|
"WHERE profile_id = ? AND content LIKE 'Session%' "
|
|
2155
2176
|
"ORDER BY created_at DESC LIMIT 3",
|
|
2156
2177
|
(pid,),
|
|
2157
2178
|
).fetchall()
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2179
|
+
for r in sess_rows:
|
|
2180
|
+
inj_mems.append(InjectableMemory(
|
|
2181
|
+
content=r["content"],
|
|
2182
|
+
score=r["importance"] or 0.3,
|
|
2183
|
+
fact_id=r["fact_id"],
|
|
2184
|
+
importance=r["importance"] or 0.0,
|
|
2185
|
+
access_count=r["access_count"] or 0,
|
|
2186
|
+
))
|
|
2161
2187
|
except sqlite3.OperationalError:
|
|
2162
2188
|
pass
|
|
2163
2189
|
|
|
2164
|
-
|
|
2190
|
+
conn.close()
|
|
2191
|
+
|
|
2192
|
+
if not inj_mems:
|
|
2193
|
+
return
|
|
2194
|
+
|
|
2195
|
+
# V3.3 Soft prompts (auto-learned patterns) — append as high-importance
|
|
2165
2196
|
try:
|
|
2166
|
-
|
|
2197
|
+
conn2 = sqlite3.connect(str(db_path))
|
|
2198
|
+
conn2.row_factory = sqlite3.Row
|
|
2199
|
+
sp_rows = conn2.execute(
|
|
2167
2200
|
"SELECT category, content FROM soft_prompt_templates "
|
|
2168
2201
|
"WHERE profile_id = ? AND active = 1 "
|
|
2169
2202
|
"ORDER BY confidence DESC LIMIT 5",
|
|
2170
2203
|
(pid,),
|
|
2171
2204
|
).fetchall()
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2205
|
+
conn2.close()
|
|
2206
|
+
for r in sp_rows:
|
|
2207
|
+
inj_mems.append(InjectableMemory(
|
|
2208
|
+
content=f"[{r['category']}] {r['content']}",
|
|
2209
|
+
score=0.7, fact_id="",
|
|
2210
|
+
importance=0.7, access_count=5,
|
|
2211
|
+
))
|
|
2212
|
+
except Exception:
|
|
2176
2213
|
pass
|
|
2177
2214
|
|
|
2178
|
-
|
|
2215
|
+
cfg_inj = getattr(config, "injection", None)
|
|
2216
|
+
context = render_context(inj_mems, mode=config.mode.value.upper(), cfg=cfg_inj, wrap=True)
|
|
2217
|
+
if context:
|
|
2218
|
+
if use_json:
|
|
2219
|
+
from superlocalmemory.cli.json_output import json_print
|
|
2220
|
+
json_print("session-context", data={
|
|
2221
|
+
"context": context,
|
|
2222
|
+
"memory_count": len(inj_mems),
|
|
2223
|
+
"mode": config.mode.value.upper(),
|
|
2224
|
+
}, next_actions=[
|
|
2225
|
+
{"command": "slm recall --json <query>", "description": "Search memories"},
|
|
2226
|
+
])
|
|
2227
|
+
else:
|
|
2228
|
+
print(context)
|
|
2179
2229
|
|
|
2180
|
-
if sections:
|
|
2181
|
-
header = f"# SLM Session Context — {config.active_profile}"
|
|
2182
|
-
print(header + "\n\n" + "\n\n".join(sections))
|
|
2183
2230
|
except Exception as exc:
|
|
2184
2231
|
logger.debug("session-context (fast) failed: %s", exc)
|
|
2185
2232
|
|
|
@@ -171,6 +171,17 @@ def _start_daemon_subprocess() -> bool:
|
|
|
171
171
|
else:
|
|
172
172
|
kwargs["start_new_session"] = True
|
|
173
173
|
|
|
174
|
+
# v3.4.60: Force OMP_NUM_THREADS=1 in daemon env BEFORE Python imports
|
|
175
|
+
# numpy/torch/lightgbm. Setting it in __init__.py is too late on M5 Pro —
|
|
176
|
+
# by the time superlocalmemory.__init__ runs, libomp has already been
|
|
177
|
+
# initialized by an earlier import, causing the SIGSEGV at
|
|
178
|
+
# __kmp_suspend_initialize_thread when lightgbm forks its worker pool.
|
|
179
|
+
# Forcing serial OpenMP eliminates the parallel barrier race entirely.
|
|
180
|
+
daemon_env = os.environ.copy()
|
|
181
|
+
daemon_env["OMP_NUM_THREADS"] = "1"
|
|
182
|
+
daemon_env["KMP_DUPLICATE_LIB_OK"] = "TRUE"
|
|
183
|
+
kwargs["env"] = daemon_env
|
|
184
|
+
|
|
174
185
|
with open(log_file, "a") as lf:
|
|
175
186
|
proc = subprocess.Popen(cmd, stdout=lf, stderr=lf, **kwargs)
|
|
176
187
|
|
|
@@ -523,8 +534,10 @@ class DaemonHandler(BaseHTTPRequestHandler):
|
|
|
523
534
|
session_id = f"http:{int(_t.time() * 1000)}"
|
|
524
535
|
|
|
525
536
|
engine = _get_engine()
|
|
537
|
+
raw_fast = params.get("fast", ["false"])[0]
|
|
538
|
+
fast = raw_fast.lower() in ("true", "1")
|
|
526
539
|
response = engine.recall(
|
|
527
|
-
query, limit=limit, session_id=session_id,
|
|
540
|
+
query, limit=limit, session_id=session_id, fast=fast,
|
|
528
541
|
)
|
|
529
542
|
# Return the same field shape as recall_worker._handle_recall,
|
|
530
543
|
# so MCP processes that proxy through the daemon get recall_trace-
|
|
@@ -136,7 +136,7 @@ def main() -> None:
|
|
|
136
136
|
|
|
137
137
|
mode_p = sub.add_parser("mode", help="Get or set operating mode (a/b/c)")
|
|
138
138
|
mode_p.add_argument(
|
|
139
|
-
"value", nargs="?", choices=["a", "b", "c"], help="Mode to set",
|
|
139
|
+
"value", nargs="?", choices=["a", "b", "c", "A", "B", "C"], help="Mode to set",
|
|
140
140
|
)
|
|
141
141
|
mode_p.add_argument("--json", action="store_true", help="Output structured JSON (agent-native)")
|
|
142
142
|
|
{superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/backend_orchestrator.py
RENAMED
|
@@ -62,7 +62,7 @@ class BackendOrchestrator:
|
|
|
62
62
|
def __init__(self, config: SLMConfig, db: DatabaseManager) -> None:
|
|
63
63
|
self._config = config
|
|
64
64
|
self._db = db
|
|
65
|
-
self._data_dir = Path(config
|
|
65
|
+
self._data_dir = Path(getattr(config, "data_dir", None) or config.base_dir)
|
|
66
66
|
self._cozo: Any = None
|
|
67
67
|
self._lancedb: Any = None
|
|
68
68
|
self._tiers: Any = None
|
|
@@ -236,22 +236,28 @@ class BackendOrchestrator:
|
|
|
236
236
|
# ------------------------------------------------------------------
|
|
237
237
|
|
|
238
238
|
def _detect_cozo(self) -> bool:
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
try:
|
|
242
|
-
import pycozo # noqa: F401
|
|
243
|
-
return True
|
|
244
|
-
except ImportError:
|
|
239
|
+
gb = getattr(self._config, "graph_backend", "auto") or "auto"
|
|
240
|
+
if gb == "sqlite":
|
|
245
241
|
return False
|
|
242
|
+
if gb in ("auto", "cozo"):
|
|
243
|
+
try:
|
|
244
|
+
import pycozo # noqa: F401
|
|
245
|
+
return True
|
|
246
|
+
except ImportError:
|
|
247
|
+
return False
|
|
248
|
+
return False
|
|
246
249
|
|
|
247
250
|
def _detect_lancedb(self) -> bool:
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
try:
|
|
251
|
-
import lancedb # noqa: F401
|
|
252
|
-
return True
|
|
253
|
-
except ImportError:
|
|
251
|
+
vb = getattr(self._config, "vector_backend", "auto") or "auto"
|
|
252
|
+
if vb == "sqlite-vec":
|
|
254
253
|
return False
|
|
254
|
+
if vb in ("auto", "lancedb"):
|
|
255
|
+
try:
|
|
256
|
+
import lancedb # noqa: F401
|
|
257
|
+
return True
|
|
258
|
+
except ImportError:
|
|
259
|
+
return False
|
|
260
|
+
return False
|
|
255
261
|
|
|
256
262
|
# ------------------------------------------------------------------
|
|
257
263
|
# Internal: Init
|
|
@@ -233,6 +233,50 @@ class MathConfig:
|
|
|
233
233
|
# Rate-Distortion (production only, disabled for benchmarks)
|
|
234
234
|
|
|
235
235
|
|
|
236
|
+
# ---------------------------------------------------------------------------
|
|
237
|
+
# Context Injection (v3.4.65)
|
|
238
|
+
# ---------------------------------------------------------------------------
|
|
239
|
+
|
|
240
|
+
@dataclass(frozen=True)
|
|
241
|
+
class InjectionConfig:
|
|
242
|
+
"""Context-injection budgets & framing (v3.4.65).
|
|
243
|
+
|
|
244
|
+
Single source of truth for what reaches the agent at session_init,
|
|
245
|
+
prestage_context, and the recall hooks. Replaces scattered char caps.
|
|
246
|
+
|
|
247
|
+
Budgets are in *estimated tokens* (chars/4 heuristic; see
|
|
248
|
+
core/injection.estimate_tokens). Mode-aware: A=fast/cheap, C=rich.
|
|
249
|
+
"""
|
|
250
|
+
enabled: bool = True
|
|
251
|
+
|
|
252
|
+
# Mode-aware TOTAL budget (core block + recall), in estimated tokens.
|
|
253
|
+
total_budget_tokens_a: int = 2000
|
|
254
|
+
total_budget_tokens_b: int = 4000
|
|
255
|
+
total_budget_tokens_c: int = 8000
|
|
256
|
+
|
|
257
|
+
# Per-memory ceiling (estimated tokens). Whole-memory inclusion until
|
|
258
|
+
# the total budget is hit; this only clamps a single oversized memory.
|
|
259
|
+
per_memory_max_tokens: int = 600
|
|
260
|
+
|
|
261
|
+
# Core Memory Block (Letta pattern).
|
|
262
|
+
core_block_enabled: bool = True
|
|
263
|
+
core_block_max_facts: int = 5
|
|
264
|
+
core_block_max_tokens: int = 1000
|
|
265
|
+
core_block_importance_min: float = 0.8
|
|
266
|
+
core_block_min_access_count: int = 2
|
|
267
|
+
|
|
268
|
+
# Lost-in-the-middle: place strongest at top & bottom edges.
|
|
269
|
+
edge_ordering: bool = True
|
|
270
|
+
|
|
271
|
+
# Trust framing. False (shipped) = cautious "reference only" wrapper.
|
|
272
|
+
# True (Varun personal) = clean "memory context" framing.
|
|
273
|
+
# redact_secrets ALWAYS runs regardless.
|
|
274
|
+
trust_first_party: bool = False
|
|
275
|
+
|
|
276
|
+
# prestage_context response byte cap (was hardcoded 16 KB).
|
|
277
|
+
prestage_max_response_bytes: int = 64 * 1024
|
|
278
|
+
|
|
279
|
+
|
|
236
280
|
# ---------------------------------------------------------------------------
|
|
237
281
|
# Master Config
|
|
238
282
|
# ---------------------------------------------------------------------------
|
|
@@ -613,6 +657,10 @@ class SLMConfig:
|
|
|
613
657
|
parameterization: ParameterizationConfig = field(
|
|
614
658
|
default_factory=ParameterizationConfig,
|
|
615
659
|
)
|
|
660
|
+
injection: InjectionConfig = field(default_factory=InjectionConfig)
|
|
661
|
+
# v3.5.0: scaling backends — "sqlite" / "cozo" / "auto" / "lancedb" / "sqlite-vec" / "auto".
|
|
662
|
+
graph_backend: str = "auto" # "auto" = cozo if pycozo installed, else sqlite
|
|
663
|
+
vector_backend: str = "auto" # "auto" = lancedb if installed, else sqlite-vec
|
|
616
664
|
evolution: EvolutionConfig = field(default_factory=EvolutionConfig)
|
|
617
665
|
|
|
618
666
|
# v3.4.3: Daemon configuration
|
|
@@ -701,6 +749,24 @@ class SLMConfig:
|
|
|
701
749
|
if k in EvolutionConfig.__dataclass_fields__
|
|
702
750
|
})
|
|
703
751
|
|
|
752
|
+
# V3.4.65: Injection config (additive — defaults if missing from JSON)
|
|
753
|
+
inj = data.get("injection", {}) or {}
|
|
754
|
+
config.injection = InjectionConfig(
|
|
755
|
+
enabled=bool(inj.get("enabled", True)),
|
|
756
|
+
total_budget_tokens_a=int(inj.get("total_budget_tokens_a", 2000)),
|
|
757
|
+
total_budget_tokens_b=int(inj.get("total_budget_tokens_b", 4000)),
|
|
758
|
+
total_budget_tokens_c=int(inj.get("total_budget_tokens_c", 8000)),
|
|
759
|
+
per_memory_max_tokens=int(inj.get("per_memory_max_tokens", 600)),
|
|
760
|
+
core_block_enabled=bool(inj.get("core_block_enabled", True)),
|
|
761
|
+
core_block_max_facts=int(inj.get("core_block_max_facts", 5)),
|
|
762
|
+
core_block_max_tokens=int(inj.get("core_block_max_tokens", 1000)),
|
|
763
|
+
core_block_importance_min=float(inj.get("core_block_importance_min", 0.8)),
|
|
764
|
+
core_block_min_access_count=int(inj.get("core_block_min_access_count", 2)),
|
|
765
|
+
edge_ordering=bool(inj.get("edge_ordering", True)),
|
|
766
|
+
trust_first_party=bool(inj.get("trust_first_party", False)),
|
|
767
|
+
prestage_max_response_bytes=int(inj.get("prestage_max_response_bytes", 64 * 1024)),
|
|
768
|
+
)
|
|
769
|
+
|
|
704
770
|
return config
|
|
705
771
|
|
|
706
772
|
def save(
|
|
@@ -775,6 +841,23 @@ class SLMConfig:
|
|
|
775
841
|
"max_evolutions_per_cycle": self.evolution.max_evolutions_per_cycle,
|
|
776
842
|
}
|
|
777
843
|
|
|
844
|
+
# V3.4.65: Persist injection config
|
|
845
|
+
data["injection"] = {
|
|
846
|
+
"enabled": self.injection.enabled,
|
|
847
|
+
"total_budget_tokens_a": self.injection.total_budget_tokens_a,
|
|
848
|
+
"total_budget_tokens_b": self.injection.total_budget_tokens_b,
|
|
849
|
+
"total_budget_tokens_c": self.injection.total_budget_tokens_c,
|
|
850
|
+
"per_memory_max_tokens": self.injection.per_memory_max_tokens,
|
|
851
|
+
"core_block_enabled": self.injection.core_block_enabled,
|
|
852
|
+
"core_block_max_facts": self.injection.core_block_max_facts,
|
|
853
|
+
"core_block_max_tokens": self.injection.core_block_max_tokens,
|
|
854
|
+
"core_block_importance_min": self.injection.core_block_importance_min,
|
|
855
|
+
"core_block_min_access_count": self.injection.core_block_min_access_count,
|
|
856
|
+
"edge_ordering": self.injection.edge_ordering,
|
|
857
|
+
"trust_first_party": self.injection.trust_first_party,
|
|
858
|
+
"prestage_max_response_bytes": self.injection.prestage_max_response_bytes,
|
|
859
|
+
}
|
|
860
|
+
|
|
778
861
|
# Preserve existing V3.3 config sections that aren't in for_mode()
|
|
779
862
|
for key in ("forgetting", "quantization", "sagq", "embedding_signature", "auto_invoke"):
|
|
780
863
|
if key in existing:
|
{superlocalmemory-3.4.58 → superlocalmemory-3.5.1}/src/superlocalmemory/core/graph_pruner.py
RENAMED
|
@@ -28,12 +28,18 @@ from pathlib import Path
|
|
|
28
28
|
logger = logging.getLogger("superlocalmemory.graph_pruner")
|
|
29
29
|
|
|
30
30
|
_CHAIN_BATCH_LIMIT = 10_000
|
|
31
|
+
# v3.4.59: Nodes with more than this many total edges (in+out) are hub nodes.
|
|
32
|
+
# SA and entity_graph channels cap fan-out at 30/node, so edges beyond this
|
|
33
|
+
# threshold provide zero additional recall signal while bloating the graph.
|
|
34
|
+
_MAX_DEGREE_PER_NODE: int = 100
|
|
35
|
+
_HUB_PRUNE_BATCH: int = 500 # delete edges in batches to avoid giant IN clauses
|
|
31
36
|
|
|
32
37
|
|
|
33
38
|
def prune_graph(
|
|
34
39
|
db_path: str | Path,
|
|
35
40
|
profile_id: str = "default",
|
|
36
41
|
dry_run: bool = False,
|
|
42
|
+
cap_degree: bool = True,
|
|
37
43
|
) -> dict:
|
|
38
44
|
"""Run all graph pruning strategies for a specific profile.
|
|
39
45
|
|
|
@@ -41,7 +47,7 @@ def prune_graph(
|
|
|
41
47
|
"""
|
|
42
48
|
conn = sqlite3.connect(str(db_path))
|
|
43
49
|
conn.execute("PRAGMA journal_mode=WAL")
|
|
44
|
-
conn.execute("PRAGMA busy_timeout=
|
|
50
|
+
conn.execute("PRAGMA busy_timeout=30000")
|
|
45
51
|
conn.row_factory = sqlite3.Row
|
|
46
52
|
|
|
47
53
|
stats = {
|
|
@@ -49,6 +55,7 @@ def prune_graph(
|
|
|
49
55
|
"supersedes_collapsed": 0,
|
|
50
56
|
"self_loops_removed": 0,
|
|
51
57
|
"duplicates_removed": 0,
|
|
58
|
+
"hub_edges_removed": 0,
|
|
52
59
|
"total_before": 0,
|
|
53
60
|
"total_after": 0,
|
|
54
61
|
}
|
|
@@ -72,6 +79,10 @@ def prune_graph(
|
|
|
72
79
|
stats["supersedes_collapsed"] = _collapse_supersedes_chains(
|
|
73
80
|
c, profile_id, dry_run,
|
|
74
81
|
)
|
|
82
|
+
if cap_degree:
|
|
83
|
+
stats["hub_edges_removed"] = _cap_node_degree(
|
|
84
|
+
c, profile_id, _MAX_DEGREE_PER_NODE, dry_run,
|
|
85
|
+
)
|
|
75
86
|
|
|
76
87
|
if dry_run:
|
|
77
88
|
c.execute("ROLLBACK")
|
|
@@ -91,10 +102,11 @@ def prune_graph(
|
|
|
91
102
|
prefix = "(dry-run) " if dry_run else ""
|
|
92
103
|
logger.info(
|
|
93
104
|
"%sGraph pruning: removed %d edges (%.1f%%) in %.1fs — "
|
|
94
|
-
"orphans=%d, supersedes=%d, self_loops=%d, duplicates=%d",
|
|
105
|
+
"orphans=%d, supersedes=%d, self_loops=%d, duplicates=%d, hub_cap=%d",
|
|
95
106
|
prefix, total_removed, pct, elapsed,
|
|
96
107
|
stats["orphans_removed"], stats["supersedes_collapsed"],
|
|
97
108
|
stats["self_loops_removed"], stats["duplicates_removed"],
|
|
109
|
+
stats["hub_edges_removed"],
|
|
98
110
|
)
|
|
99
111
|
|
|
100
112
|
except Exception as exc:
|
|
@@ -288,3 +300,81 @@ def _collapse_supersedes_chains(
|
|
|
288
300
|
)
|
|
289
301
|
|
|
290
302
|
return len(delete_ids)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def _cap_node_degree(
|
|
306
|
+
c: sqlite3.Cursor,
|
|
307
|
+
profile_id: str,
|
|
308
|
+
max_degree: int,
|
|
309
|
+
dry_run: bool,
|
|
310
|
+
) -> int:
|
|
311
|
+
"""Remove low-weight edges from hub nodes (nodes with degree > max_degree).
|
|
312
|
+
|
|
313
|
+
v3.4.59: At 17K facts, popular entities (SLM, Claude, AgentAssert) caused
|
|
314
|
+
1.4M+ entity edges — avg 121 per node, some nodes with 5000+. SA fan-out
|
|
315
|
+
is capped at 30/node during traversal, so edges beyond max_degree add zero
|
|
316
|
+
recall signal while making every graph query scan millions of rows.
|
|
317
|
+
|
|
318
|
+
Algorithm (single-pass window function — no Python loops):
|
|
319
|
+
1. ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY weight DESC) ranks
|
|
320
|
+
every edge per node in one full table scan.
|
|
321
|
+
2. Edges with rn > max_degree are deleted in a single DELETE statement.
|
|
322
|
+
Requires SQLite 3.25+ (window functions). System is on 3.53.1.
|
|
323
|
+
"""
|
|
324
|
+
if dry_run:
|
|
325
|
+
c.execute(
|
|
326
|
+
"""
|
|
327
|
+
SELECT COUNT(*) as cnt FROM (
|
|
328
|
+
SELECT edge_id,
|
|
329
|
+
ROW_NUMBER() OVER (
|
|
330
|
+
PARTITION BY source_id ORDER BY weight DESC
|
|
331
|
+
) as rn
|
|
332
|
+
FROM graph_edges
|
|
333
|
+
WHERE profile_id = ?
|
|
334
|
+
) WHERE rn > ?
|
|
335
|
+
""",
|
|
336
|
+
(profile_id, max_degree),
|
|
337
|
+
)
|
|
338
|
+
excess = c.fetchone()["cnt"]
|
|
339
|
+
logger.info(
|
|
340
|
+
"(dry-run) _cap_node_degree: ~%d edges would be removed (max_degree=%d)",
|
|
341
|
+
excess, max_degree,
|
|
342
|
+
)
|
|
343
|
+
return excess
|
|
344
|
+
|
|
345
|
+
# Step 1: build temp keep-list in one pass (ROW_NUMBER ranks by weight DESC)
|
|
346
|
+
c.execute("CREATE TEMP TABLE IF NOT EXISTS _slm_keep_edges (edge_id TEXT PRIMARY KEY)")
|
|
347
|
+
c.execute("DELETE FROM _slm_keep_edges") # idempotent if called twice
|
|
348
|
+
c.execute(
|
|
349
|
+
"""
|
|
350
|
+
INSERT INTO _slm_keep_edges (edge_id)
|
|
351
|
+
SELECT edge_id FROM (
|
|
352
|
+
SELECT edge_id,
|
|
353
|
+
ROW_NUMBER() OVER (
|
|
354
|
+
PARTITION BY source_id ORDER BY weight DESC
|
|
355
|
+
) as rn
|
|
356
|
+
FROM graph_edges
|
|
357
|
+
WHERE profile_id = ?
|
|
358
|
+
) WHERE rn <= ?
|
|
359
|
+
""",
|
|
360
|
+
(profile_id, max_degree),
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# Step 2: delete everything not in keep-list (single DELETE)
|
|
364
|
+
c.execute(
|
|
365
|
+
"""
|
|
366
|
+
DELETE FROM graph_edges
|
|
367
|
+
WHERE profile_id = ?
|
|
368
|
+
AND edge_id NOT IN (SELECT edge_id FROM _slm_keep_edges)
|
|
369
|
+
""",
|
|
370
|
+
(profile_id,),
|
|
371
|
+
)
|
|
372
|
+
deleted = c.rowcount
|
|
373
|
+
|
|
374
|
+
c.execute("DROP TABLE IF EXISTS _slm_keep_edges")
|
|
375
|
+
|
|
376
|
+
logger.info(
|
|
377
|
+
"_cap_node_degree: deleted %d low-weight edges (max_degree=%d)",
|
|
378
|
+
deleted, max_degree,
|
|
379
|
+
)
|
|
380
|
+
return deleted
|