superlocalmemory 3.4.41__tar.gz → 3.4.43__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.41/src/superlocalmemory.egg-info → superlocalmemory-3.4.43}/PKG-INFO +45 -5
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/README.md +41 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/pyproject.toml +19 -5
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/commands.py +110 -31
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/daemon.py +53 -21
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_wiring.py +27 -2
- superlocalmemory-3.4.43/src/superlocalmemory/hooks/before_web_hook.py +128 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/claude_code_hooks.py +57 -15
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/hook_handlers.py +27 -15
- superlocalmemory-3.4.43/src/superlocalmemory/hooks/topic_shift_hook.py +272 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_active.py +5 -5
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43/src/superlocalmemory.egg-info}/PKG-INFO +45 -5
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/SOURCES.txt +5 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/requires.txt +3 -4
- superlocalmemory-3.4.43/tests/test_before_web_hook.py +212 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_claude_hooks.py +48 -6
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_hook_handlers.py +19 -6
- superlocalmemory-3.4.43/tests/test_mode_switch_preservation.py +271 -0
- superlocalmemory-3.4.43/tests/test_topic_shift_hook.py +353 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/AUTHORS.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/LICENSE +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/NOTICE +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/setup.cfg +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/signer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/watermark.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/context_commands.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/db_migrate.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/escape_hatch.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/json_output.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/main.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/pending_store.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/post_install.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/service_installer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/setup_wizard.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/version_banner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/changes.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/communities.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/config.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/database.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/flows.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/graph_store.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/incremental.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/models.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/parser.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/resolver.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/search.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/service.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/watcher.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/abac.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/audit.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/gdpr.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/lifecycle.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/retention.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/scheduler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/clock_monitor.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/config.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/consolidation_engine.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/context_cache.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/db_pool.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/embedding_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/embeddings.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_capabilities.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_lock.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/error_catalog.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/error_envelope.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/fact_consolidator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/file_lock.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/graph_analyzer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/graph_pruner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/health_monitor.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/hooks.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/loop_watchdog.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/maintenance.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/modes.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/ollama_embedder.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/platform_utils.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/priority_queue.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/profiles.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/queue_consumer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/ram_lock.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/rate_limit.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_gate.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_pipeline.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_queue.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/registry.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/reranker_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/safe_fs.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/security_primitives.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/shadow_router.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/slm_disabled.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/slmignore.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/store_pipeline.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/summarizer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/tier_manager.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/topic_signature.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/worker_pool.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/auto_linker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/consolidator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/context_generator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/emotional.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/foresight.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/graph_builder.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/observation_builder.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/scene_builder.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/signal_inference.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/type_router.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/budget.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/evolution_store.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/triggers.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/types.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/adapter_base.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_capture.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_recall.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/context_payload.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/ide_connector.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/rules_engine.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/session_registry.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/sync_loop.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/auth_middleware.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/backup.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/cache_manager.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/cloud_backup.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/event_bus.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/pid_manager.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/process_reaper.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/rate_limiter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/credentials.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/parsers.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/adaptive.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/arm_catalog.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/assertion_miner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bandit.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bandit_cache.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/behavioral.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bootstrap.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/cross_project.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/database.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/engagement.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ensemble.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/entity_compiler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/features.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/feedback.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/labeler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/legacy_migration.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/memory_merge.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/model_cache.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/model_rollback.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/outcome_queue.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/outcomes.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/pattern_miner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/project_context.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_common.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_archive.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_boost.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_proxy.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/shadow_test.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/signal_worker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/signals.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/source_quality.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/trigram_index.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/workflows.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/llm/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/llm/backbone.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/ebbinghaus.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/fisher.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/fisher_quantized.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/hopfield.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/langevin.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/polar_quant.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/qjl.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/sheaf.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/turbo_quant.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/resources.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/server.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/shared.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_context.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_core.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_learning.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v28.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v3.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v33.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mesh/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mesh/broker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/migrations/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/agentic.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/ann_index.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/engine.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/fusion.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/reranker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/strategy.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/vector_store.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/api.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/bandit_loops.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/middleware/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/adapters.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/agents.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/backup.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/behavioral.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/brain.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/chat.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/compliance.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/data_io.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/entity.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/events.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/evolution.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/helpers.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/ingest.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/insights.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/learning.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/memories.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/mesh.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/prewarm.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/profiles.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/stats.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/tiers.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/timeline.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/token.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/v3_api.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/ws.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/security_middleware.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/ui.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/unified_daemon.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/access_control.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/access_log.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/database.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migration_runner.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migration_v33.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/models.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/quantized_store.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v32.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v3410.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v3411.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v343.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v347.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/v2_migrator.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/__init__.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/gate.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/provenance.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/scorer.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/signals.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/brain.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/index.html +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/agents.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/brain.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/clusters.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/compliance.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/core.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/dashboard.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/events.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/feedback.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ide-status.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/init.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/math-health.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memories.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/modal.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-health.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/profiles.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/search.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/settings.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/timeline.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/top_level.txt +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_auto_hooks.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_behavioral_full.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli_json.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli_v33.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_compliance_full.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_config_system.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_engine_hooks.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_event_bus.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_features.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_final_locomo_mini.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_ide_connector.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_infra.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_learning_advanced.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_learning_collectors.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_llm_provider.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_mcp_server.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_migration.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_post_install.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_ranker.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_trust_full.py +0 -0
- {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_v3_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superlocalmemory
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.43
|
|
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
|
|
@@ -40,7 +40,6 @@ Requires-Dist: fastapi[all]>=0.135.1
|
|
|
40
40
|
Requires-Dist: uvicorn>=0.42.0
|
|
41
41
|
Requires-Dist: websockets>=16.0
|
|
42
42
|
Requires-Dist: lightgbm>=4.0.0
|
|
43
|
-
Requires-Dist: diskcache>=5.6.0
|
|
44
43
|
Requires-Dist: orjson>=3.9.0
|
|
45
44
|
Requires-Dist: tree-sitter<1,>=0.23.0
|
|
46
45
|
Requires-Dist: tree-sitter-language-pack<1,>=0.5
|
|
@@ -49,11 +48,11 @@ Requires-Dist: watchdog<6,>=4.0
|
|
|
49
48
|
Requires-Dist: psutil>=5.9.0
|
|
50
49
|
Requires-Dist: structlog<27.0.0,>=24.0.0
|
|
51
50
|
Requires-Dist: portalocker<4.0.0,>=2.7.0
|
|
52
|
-
Requires-Dist: sentence-transformers[onnx]>=5.
|
|
51
|
+
Requires-Dist: sentence-transformers[onnx]>=5.2.0
|
|
53
52
|
Requires-Dist: torch>=2.2.0
|
|
54
53
|
Requires-Dist: scikit-learn<2.0.0,>=1.3.0
|
|
55
54
|
Provides-Extra: search
|
|
56
|
-
Requires-Dist: sentence-transformers[onnx]>=5.
|
|
55
|
+
Requires-Dist: sentence-transformers[onnx]>=5.2.0; extra == "search"
|
|
57
56
|
Requires-Dist: einops>=0.8.2; extra == "search"
|
|
58
57
|
Requires-Dist: torch>=2.2.0; extra == "search"
|
|
59
58
|
Requires-Dist: scikit-learn<2.0.0,>=1.3.0; extra == "search"
|
|
@@ -66,7 +65,6 @@ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "ui"
|
|
|
66
65
|
Provides-Extra: learning
|
|
67
66
|
Requires-Dist: lightgbm>=4.0.0; extra == "learning"
|
|
68
67
|
Provides-Extra: performance
|
|
69
|
-
Requires-Dist: diskcache>=5.6.0; extra == "performance"
|
|
70
68
|
Requires-Dist: orjson>=3.9.0; extra == "performance"
|
|
71
69
|
Provides-Extra: ingestion
|
|
72
70
|
Requires-Dist: keyring>=25.0.0; extra == "ingestion"
|
|
@@ -78,6 +76,7 @@ Requires-Dist: superlocalmemory[ingestion,learning,performance,search,ui]; extra
|
|
|
78
76
|
Provides-Extra: dev
|
|
79
77
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
80
78
|
Requires-Dist: pytest-cov>=4.1; extra == "dev"
|
|
79
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
|
|
81
80
|
Requires-Dist: sqlite-vec>=0.1.6; extra == "dev"
|
|
82
81
|
Dynamic: license-file
|
|
83
82
|
|
|
@@ -317,6 +316,47 @@ All `--json` responses follow a consistent envelope with `success`, `command`, `
|
|
|
317
316
|
|
|
318
317
|
---
|
|
319
318
|
|
|
319
|
+
## Smart-hook architecture (v3.4.43)
|
|
320
|
+
|
|
321
|
+
SLM ships a small set of Claude Code hooks that fire memory operations only
|
|
322
|
+
when there's a real signal — not on a timer, not on every keystroke. The
|
|
323
|
+
hooks are perf-budgeted (<10ms p99 for the hot path) and fail-open (any
|
|
324
|
+
crash → silent exit, never blocks your prompt). Install them with one
|
|
325
|
+
command:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
slm hooks install # wires hooks into ~/.claude/settings.json
|
|
329
|
+
slm hooks status # shows what's installed
|
|
330
|
+
slm hooks remove # cleans up, preserves non-SLM hooks
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
| Hook | Event | When it fires | Why |
|
|
334
|
+
|---|---|---|---|
|
|
335
|
+
| `slm hook start` | SessionStart | Once at session boot | Injects core memory + recent context + learned patterns. ~80ms. |
|
|
336
|
+
| `slm hook user_prompt_rehash` | UserPromptSubmit | Every prompt | Detects re-queries within 60s (negative signal that prior recall didn't satisfy). <10ms hot path. |
|
|
337
|
+
| **`slm hook topic_shift`** *(new in 3.4.43)* | UserPromptSubmit | When current prompt shares zero content words with every prompt in a 5-turn sliding window | Surfaces a one-line "consider recall" hint on real topic pivots. Replaces the time-based 15-min nag — event-based, not timer-based. <10ms. |
|
|
338
|
+
| **`slm hook before_web`** *(new in 3.4.43)* | PreToolUse on `WebSearch\|WebFetch` | Every web search/fetch | Runs `slm recall <query> --limit 5` and injects local memories as a system-reminder BEFORE the web call. Cost: ~500-800ms per fire, fires 5-20× per session. |
|
|
339
|
+
| `slm hook checkpoint` | PostToolUse on `Write\|Edit` | Every file write/edit | Auto-observes file changes into SLM. No periodic nag (removed in v3.4.43). |
|
|
340
|
+
| `slm hook post_tool_outcome` | PostToolUse (all tools) | Every tool call | Tracks which recalled facts got used (learning signal). |
|
|
341
|
+
| `slm hook stop` | Stop | Session end | Saves rich session summary with git context. |
|
|
342
|
+
|
|
343
|
+
**What "smart" means here:** the hooks don't interrupt you on a schedule.
|
|
344
|
+
They watch for specific events that indicate memory work would add value —
|
|
345
|
+
a topic pivot, a web call about to fire, a re-asked question, a file edit.
|
|
346
|
+
Otherwise they stay out of your way.
|
|
347
|
+
|
|
348
|
+
**Observability for the new hooks:**
|
|
349
|
+
`topic_shift` writes one TSV line per decision to
|
|
350
|
+
`~/.superlocalmemory/logs/topic-shift.log`
|
|
351
|
+
(`timestamp | session_hash | current_words_count | window_depth | max_overlap |
|
|
352
|
+
fired | prompt_preview`). Disable with `SLM_TOPIC_SHIFT_LOG=0`.
|
|
353
|
+
|
|
354
|
+
**Upgrading from v3.4.42 or older:** Run `slm hooks install` once after
|
|
355
|
+
upgrade to pull in the new wiring. `slm hooks status` will flag the
|
|
356
|
+
version mismatch. Merge is idempotent — safe to run twice.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
320
360
|
## Three Operating Modes
|
|
321
361
|
|
|
322
362
|
| Mode | What | Cloud? | EU AI Act | Best For |
|
|
@@ -234,6 +234,47 @@ All `--json` responses follow a consistent envelope with `success`, `command`, `
|
|
|
234
234
|
|
|
235
235
|
---
|
|
236
236
|
|
|
237
|
+
## Smart-hook architecture (v3.4.43)
|
|
238
|
+
|
|
239
|
+
SLM ships a small set of Claude Code hooks that fire memory operations only
|
|
240
|
+
when there's a real signal — not on a timer, not on every keystroke. The
|
|
241
|
+
hooks are perf-budgeted (<10ms p99 for the hot path) and fail-open (any
|
|
242
|
+
crash → silent exit, never blocks your prompt). Install them with one
|
|
243
|
+
command:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
slm hooks install # wires hooks into ~/.claude/settings.json
|
|
247
|
+
slm hooks status # shows what's installed
|
|
248
|
+
slm hooks remove # cleans up, preserves non-SLM hooks
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
| Hook | Event | When it fires | Why |
|
|
252
|
+
|---|---|---|---|
|
|
253
|
+
| `slm hook start` | SessionStart | Once at session boot | Injects core memory + recent context + learned patterns. ~80ms. |
|
|
254
|
+
| `slm hook user_prompt_rehash` | UserPromptSubmit | Every prompt | Detects re-queries within 60s (negative signal that prior recall didn't satisfy). <10ms hot path. |
|
|
255
|
+
| **`slm hook topic_shift`** *(new in 3.4.43)* | UserPromptSubmit | When current prompt shares zero content words with every prompt in a 5-turn sliding window | Surfaces a one-line "consider recall" hint on real topic pivots. Replaces the time-based 15-min nag — event-based, not timer-based. <10ms. |
|
|
256
|
+
| **`slm hook before_web`** *(new in 3.4.43)* | PreToolUse on `WebSearch\|WebFetch` | Every web search/fetch | Runs `slm recall <query> --limit 5` and injects local memories as a system-reminder BEFORE the web call. Cost: ~500-800ms per fire, fires 5-20× per session. |
|
|
257
|
+
| `slm hook checkpoint` | PostToolUse on `Write\|Edit` | Every file write/edit | Auto-observes file changes into SLM. No periodic nag (removed in v3.4.43). |
|
|
258
|
+
| `slm hook post_tool_outcome` | PostToolUse (all tools) | Every tool call | Tracks which recalled facts got used (learning signal). |
|
|
259
|
+
| `slm hook stop` | Stop | Session end | Saves rich session summary with git context. |
|
|
260
|
+
|
|
261
|
+
**What "smart" means here:** the hooks don't interrupt you on a schedule.
|
|
262
|
+
They watch for specific events that indicate memory work would add value —
|
|
263
|
+
a topic pivot, a web call about to fire, a re-asked question, a file edit.
|
|
264
|
+
Otherwise they stay out of your way.
|
|
265
|
+
|
|
266
|
+
**Observability for the new hooks:**
|
|
267
|
+
`topic_shift` writes one TSV line per decision to
|
|
268
|
+
`~/.superlocalmemory/logs/topic-shift.log`
|
|
269
|
+
(`timestamp | session_hash | current_words_count | window_depth | max_overlap |
|
|
270
|
+
fired | prompt_preview`). Disable with `SLM_TOPIC_SHIFT_LOG=0`.
|
|
271
|
+
|
|
272
|
+
**Upgrading from v3.4.42 or older:** Run `slm hooks install` once after
|
|
273
|
+
upgrade to pull in the new wiring. `slm hooks status` will flag the
|
|
274
|
+
version mismatch. Merge is idempotent — safe to run twice.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
237
278
|
## Three Operating Modes
|
|
238
279
|
|
|
239
280
|
| Mode | What | Cloud? | EU AI Act | Best For |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "superlocalmemory"
|
|
3
|
-
version = "3.4.
|
|
3
|
+
version = "3.4.43"
|
|
4
4
|
description = "Information-geometric agent memory with mathematical guarantees"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "AGPL-3.0-or-later"}
|
|
@@ -42,7 +42,6 @@ dependencies = [
|
|
|
42
42
|
"uvicorn>=0.42.0",
|
|
43
43
|
"websockets>=16.0",
|
|
44
44
|
"lightgbm>=4.0.0",
|
|
45
|
-
"diskcache>=5.6.0",
|
|
46
45
|
"orjson>=3.9.0",
|
|
47
46
|
# CodeGraph — code knowledge graph (v3.4)
|
|
48
47
|
"tree-sitter>=0.23.0,<1",
|
|
@@ -57,7 +56,19 @@ dependencies = [
|
|
|
57
56
|
# V3.4.18: Semantic search + cross-encoder reranker (npm install parity).
|
|
58
57
|
# Previously under [search] extra — pip users silently lost 30pp of recall
|
|
59
58
|
# quality vs. npm users. Now ships by default for both install paths.
|
|
60
|
-
|
|
59
|
+
# v3.4.43: bumped from >=5.0.0 to >=5.2.0 so the resolver doesn't pick
|
|
60
|
+
# 5.0.0-5.1.2 which cap transformers<5.0.0 (security headroom for when
|
|
61
|
+
# optimum-onnx upstream eventually supports transformers 5.x).
|
|
62
|
+
"sentence-transformers[onnx]>=5.2.0",
|
|
63
|
+
# NOTE on CVE-2026-1839 (transformers Trainer.torch.load RCE):
|
|
64
|
+
# SLM does NOT use transformers.Trainer (inference-only path via
|
|
65
|
+
# sentence-transformers + ONNX backend). The vulnerable method
|
|
66
|
+
# Trainer._load_rng_state is never called by SLM code, so the CVE is
|
|
67
|
+
# unreachable through SLM's API surface. We CANNOT pin transformers>=5.0.0
|
|
68
|
+
# because optimum-onnx 0.1.0 (latest upstream) caps transformers<4.58.0
|
|
69
|
+
# and SLM's embedding_worker.py:68 hard-codes backend="onnx". Will
|
|
70
|
+
# tighten this pin in a future release once optimum-onnx ships a
|
|
71
|
+
# transformers-5.x-compatible build.
|
|
61
72
|
"torch>=2.2.0",
|
|
62
73
|
"scikit-learn>=1.3.0,<2.0.0",
|
|
63
74
|
]
|
|
@@ -67,7 +78,7 @@ dependencies = [
|
|
|
67
78
|
# moved into core in v3.4.18. ``pip install superlocalmemory[search]`` still
|
|
68
79
|
# works but installs nothing extra.
|
|
69
80
|
search = [
|
|
70
|
-
"sentence-transformers[onnx]>=5.
|
|
81
|
+
"sentence-transformers[onnx]>=5.2.0",
|
|
71
82
|
"einops>=0.8.2",
|
|
72
83
|
"torch>=2.2.0",
|
|
73
84
|
"scikit-learn>=1.3.0,<2.0.0",
|
|
@@ -83,7 +94,6 @@ learning = [
|
|
|
83
94
|
"lightgbm>=4.0.0",
|
|
84
95
|
]
|
|
85
96
|
performance = [
|
|
86
|
-
"diskcache>=5.6.0",
|
|
87
97
|
"orjson>=3.9.0",
|
|
88
98
|
]
|
|
89
99
|
ingestion = [
|
|
@@ -98,6 +108,7 @@ full = [
|
|
|
98
108
|
dev = [
|
|
99
109
|
"pytest>=8.0",
|
|
100
110
|
"pytest-cov>=4.1",
|
|
111
|
+
"pytest-asyncio>=0.21",
|
|
101
112
|
"sqlite-vec>=0.1.6",
|
|
102
113
|
]
|
|
103
114
|
|
|
@@ -124,10 +135,12 @@ superlocalmemory = ["ui/**/*", "skills/**/*"]
|
|
|
124
135
|
testpaths = ["tests"]
|
|
125
136
|
pythonpath = ["src"]
|
|
126
137
|
addopts = "-m 'not slow and not ollama and not benchmark'"
|
|
138
|
+
asyncio_mode = "auto"
|
|
127
139
|
markers = [
|
|
128
140
|
"slow: marks tests as slow — real engine/model loading (run with: pytest -m slow)",
|
|
129
141
|
"ollama: marks tests that require a running Ollama instance",
|
|
130
142
|
"benchmark: marks CI-only evo-memory benchmark tests (run with: pytest tests/test_benchmarks/ -m benchmark)",
|
|
143
|
+
"asyncio: marks tests as async — runs via pytest-asyncio (auto-mode in this project)",
|
|
131
144
|
]
|
|
132
145
|
filterwarnings = [
|
|
133
146
|
"ignore::DeprecationWarning:vaderSentiment",
|
|
@@ -167,5 +180,6 @@ select = ["E", "F", "I", "W"]
|
|
|
167
180
|
dev = [
|
|
168
181
|
"build>=1.4.0",
|
|
169
182
|
"pytest>=9.0.2",
|
|
183
|
+
"pytest-asyncio>=0.21",
|
|
170
184
|
"twine>=6.2.0",
|
|
171
185
|
]
|
|
@@ -316,9 +316,16 @@ def cmd_restart(args: Namespace) -> None:
|
|
|
316
316
|
f"removed: {', '.join(cleaned)}" if cleaned else "already clean")
|
|
317
317
|
|
|
318
318
|
# Step 3: Start fresh daemon (lock still held — no races)
|
|
319
|
+
# v3.4.42: Call _start_daemon_subprocess() directly instead of
|
|
320
|
+
# ensure_daemon(). The latter tries to acquire daemon.lock itself,
|
|
321
|
+
# which the SAME PROCESS holds via restart_lock_fd above — BSD-style
|
|
322
|
+
# flock blocks per-fd even within one process, so ensure_daemon would
|
|
323
|
+
# fall into its lock-fail branch and time out after 60s while the
|
|
324
|
+
# actual daemon never gets started. Calling the helper directly
|
|
325
|
+
# bypasses that self-deadlock and starts the daemon as intended.
|
|
319
326
|
time.sleep(1)
|
|
320
|
-
from superlocalmemory.cli.daemon import
|
|
321
|
-
started =
|
|
327
|
+
from superlocalmemory.cli.daemon import _start_daemon_subprocess
|
|
328
|
+
started = _start_daemon_subprocess()
|
|
322
329
|
|
|
323
330
|
# Release restart lock — daemon is now running with its own lock
|
|
324
331
|
if restart_lock_fd:
|
|
@@ -622,24 +629,53 @@ def cmd_setup(args: Namespace) -> None:
|
|
|
622
629
|
|
|
623
630
|
|
|
624
631
|
def cmd_mode(args: Namespace) -> None:
|
|
625
|
-
"""Get or set the operating mode.
|
|
632
|
+
"""Get or set the operating mode.
|
|
633
|
+
|
|
634
|
+
v3.4.43 behavior change: switching modes via this CLI now PRESERVES the
|
|
635
|
+
user's existing embedding, retrieval, evolution, forgetting, and math
|
|
636
|
+
settings. Previously the CLI called ``SLMConfig.for_mode(...)`` which
|
|
637
|
+
re-derived every field from mode defaults — silently clobbering user
|
|
638
|
+
customizations (e.g. a tuned cross-encoder model, a custom embedding
|
|
639
|
+
endpoint, or custom forgetting half-lives). The v3.4.34 ``mode_change=True``
|
|
640
|
+
guard only protected the ``mode`` field itself; everything else was lost.
|
|
641
|
+
|
|
642
|
+
New rules:
|
|
643
|
+
- Only ``config.mode`` changes.
|
|
644
|
+
- If the user has NO LLM provider configured AND is switching to a mode
|
|
645
|
+
that typically needs one (B or C), mode-appropriate LLM defaults are
|
|
646
|
+
populated to avoid the daemon coming up dead. Existing LLM config
|
|
647
|
+
is preserved as-is.
|
|
648
|
+
- Embedding / retrieval / evolution / forgetting / math: untouched.
|
|
649
|
+
"""
|
|
626
650
|
from superlocalmemory.core.config import SLMConfig
|
|
627
651
|
from superlocalmemory.storage.models import Mode
|
|
628
652
|
|
|
629
653
|
config = SLMConfig.load()
|
|
630
654
|
|
|
655
|
+
def _apply_mode_change(new_value: str) -> tuple[SLMConfig, bool]:
|
|
656
|
+
"""Mutate-in-place mode switch. Returns (updated_config, llm_was_set).
|
|
657
|
+
|
|
658
|
+
Only changes ``config.mode``. If the user has no LLM provider
|
|
659
|
+
configured AND is moving to Mode B or C, populates the mode's
|
|
660
|
+
default LLM block so the daemon has something to talk to.
|
|
661
|
+
Everything else (embedding, retrieval, evolution, forgetting,
|
|
662
|
+
math, profile) is preserved byte-for-byte.
|
|
663
|
+
"""
|
|
664
|
+
new_mode = Mode(new_value)
|
|
665
|
+
llm_was_set = False
|
|
666
|
+
if new_mode != Mode.A and not config.llm.provider:
|
|
667
|
+
defaults = SLMConfig.for_mode(new_mode)
|
|
668
|
+
config.llm = defaults.llm
|
|
669
|
+
llm_was_set = True
|
|
670
|
+
config.mode = new_mode
|
|
671
|
+
config.save(mode_change=True)
|
|
672
|
+
return config, llm_was_set
|
|
673
|
+
|
|
631
674
|
if getattr(args, 'json', False):
|
|
632
675
|
from superlocalmemory.cli.json_output import json_print
|
|
633
676
|
if args.value:
|
|
634
677
|
old_mode = config.mode.value.upper()
|
|
635
|
-
updated =
|
|
636
|
-
Mode(args.value),
|
|
637
|
-
llm_provider=config.llm.provider,
|
|
638
|
-
llm_model=config.llm.model,
|
|
639
|
-
llm_api_key=config.llm.api_key,
|
|
640
|
-
llm_api_base=config.llm.api_base,
|
|
641
|
-
)
|
|
642
|
-
updated.save(mode_change=True)
|
|
678
|
+
updated, _ = _apply_mode_change(args.value)
|
|
643
679
|
json_print("mode", data={
|
|
644
680
|
"previous_mode": old_mode, "current_mode": args.value.upper(),
|
|
645
681
|
}, next_actions=[
|
|
@@ -654,20 +690,18 @@ def cmd_mode(args: Namespace) -> None:
|
|
|
654
690
|
return
|
|
655
691
|
|
|
656
692
|
if args.value:
|
|
657
|
-
updated =
|
|
658
|
-
Mode(args.value),
|
|
659
|
-
llm_provider=config.llm.provider,
|
|
660
|
-
llm_model=config.llm.model,
|
|
661
|
-
llm_api_key=config.llm.api_key,
|
|
662
|
-
llm_api_base=config.llm.api_base,
|
|
663
|
-
)
|
|
664
|
-
updated.save(mode_change=True)
|
|
693
|
+
updated, llm_was_set = _apply_mode_change(args.value)
|
|
665
694
|
print(f"Mode set to: {args.value.upper()}")
|
|
666
695
|
|
|
667
|
-
#
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
696
|
+
# v3.4.43: embedding/retrieval are now preserved, so the old
|
|
697
|
+
# "Embedding model changed. Re-indexing will run on next recall."
|
|
698
|
+
# warning no longer fires from a CLI mode switch — that was the
|
|
699
|
+
# symptom of the bug. The warning is retained ONLY as an
|
|
700
|
+
# informational note when LLM defaults were freshly populated.
|
|
701
|
+
if llm_was_set:
|
|
702
|
+
print(f" ℹ LLM provider populated from mode defaults: "
|
|
703
|
+
f"{updated.llm.provider}/{updated.llm.model}. "
|
|
704
|
+
f"Run `slm provider set` to customize.")
|
|
671
705
|
|
|
672
706
|
# V3.3.4: Warn if Mode C lacks cloud API key
|
|
673
707
|
if args.value == "c" and not updated.llm.api_key:
|
|
@@ -1415,19 +1449,22 @@ def cmd_doctor(args: Namespace) -> None:
|
|
|
1415
1449
|
"brew install libomp && pip install --force-reinstall lightgbm")
|
|
1416
1450
|
|
|
1417
1451
|
# 6. Performance deps
|
|
1452
|
+
# v3.4.43: diskcache removed from this check — it was a phantom dependency
|
|
1453
|
+
# (declared in pyproject.toml but never imported anywhere in src/ or tests/).
|
|
1454
|
+
# Dropping it closes CVE-2025-69872 (pickle deserialization RCE) without any
|
|
1455
|
+
# behavior change. orjson remains a real performance dep.
|
|
1418
1456
|
perf_ok = []
|
|
1419
|
-
for mod in ["
|
|
1457
|
+
for mod in ["orjson"]:
|
|
1420
1458
|
try:
|
|
1421
1459
|
__import__(mod)
|
|
1422
1460
|
perf_ok.append(mod)
|
|
1423
1461
|
except ImportError:
|
|
1424
1462
|
pass
|
|
1425
|
-
if
|
|
1426
|
-
_check("Performance deps", "PASS", "
|
|
1463
|
+
if perf_ok:
|
|
1464
|
+
_check("Performance deps", "PASS", "orjson")
|
|
1427
1465
|
else:
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
"pip install diskcache orjson")
|
|
1466
|
+
_check("Performance deps", "WARN", "Missing: orjson",
|
|
1467
|
+
"pip install orjson")
|
|
1431
1468
|
|
|
1432
1469
|
# 7. Embedding worker functional test — skipped under --quick.
|
|
1433
1470
|
if quick:
|
|
@@ -1662,7 +1699,19 @@ def cmd_mcp(_args: Namespace) -> None:
|
|
|
1662
1699
|
|
|
1663
1700
|
|
|
1664
1701
|
def cmd_warmup(_args: Namespace) -> None:
|
|
1665
|
-
"""Pre-download the embedding model so first use is instant.
|
|
1702
|
+
"""Pre-download the embedding model so first use is instant.
|
|
1703
|
+
|
|
1704
|
+
v3.4.42: daemon-aware. The embedding worker is a machine-wide
|
|
1705
|
+
singleton (`_is_embedding_worker_alive` + PID file), so when the
|
|
1706
|
+
unified daemon is running it OWNS the worker. A fresh
|
|
1707
|
+
`EmbeddingService` started here would see the singleton, set
|
|
1708
|
+
`_available = False`, return None from `_subprocess_embed`, and
|
|
1709
|
+
print "embedding verification failed" — even though the daemon's
|
|
1710
|
+
worker is already happily serving the same model. The fix: detect
|
|
1711
|
+
the daemon, verify via its health endpoint, and skip the local
|
|
1712
|
+
spawn. Only fall through to the original local-worker path when
|
|
1713
|
+
the daemon is genuinely unreachable.
|
|
1714
|
+
"""
|
|
1666
1715
|
import superlocalmemory.core.embeddings as _emb_mod
|
|
1667
1716
|
|
|
1668
1717
|
print("SuperLocalMemory V3 — Embedding Model Warmup")
|
|
@@ -1671,7 +1720,37 @@ def cmd_warmup(_args: Namespace) -> None:
|
|
|
1671
1720
|
print(f" Model: nomic-ai/nomic-embed-text-v1.5 (~500MB)")
|
|
1672
1721
|
print()
|
|
1673
1722
|
|
|
1674
|
-
#
|
|
1723
|
+
# v3.4.42 — daemon-aware fast path. If the daemon is up and reports
|
|
1724
|
+
# engine=initialized, the embedding model is already loaded inside
|
|
1725
|
+
# the daemon's worker subprocess. No need to spawn a redundant one;
|
|
1726
|
+
# in fact, the machine-wide singleton would refuse to do so anyway.
|
|
1727
|
+
try:
|
|
1728
|
+
from superlocalmemory.cli.daemon import (
|
|
1729
|
+
is_daemon_running, daemon_request,
|
|
1730
|
+
)
|
|
1731
|
+
if is_daemon_running():
|
|
1732
|
+
health = daemon_request("GET", "/health")
|
|
1733
|
+
if health and health.get("engine") == "initialized":
|
|
1734
|
+
from superlocalmemory.core.config import EmbeddingConfig
|
|
1735
|
+
cfg = EmbeddingConfig()
|
|
1736
|
+
print("[PASS] Daemon is running with embedding model loaded.")
|
|
1737
|
+
print(f" Model: {cfg.model_name} ({cfg.dimension}-dim)")
|
|
1738
|
+
print("Semantic search is fully operational.")
|
|
1739
|
+
return
|
|
1740
|
+
# Daemon up but engine not yet initialized — warn and return
|
|
1741
|
+
# rather than racing the daemon for the singleton lock.
|
|
1742
|
+
engine_state = (health or {}).get("engine", "unknown")
|
|
1743
|
+
print(f"[INFO] Daemon is up but engine state is '{engine_state}'.")
|
|
1744
|
+
print(" Wait ~30s and retry, or run: slm doctor")
|
|
1745
|
+
return
|
|
1746
|
+
except Exception:
|
|
1747
|
+
# Any failure in the daemon path falls through to local warmup —
|
|
1748
|
+
# better to spawn a local worker than block warmup entirely.
|
|
1749
|
+
pass
|
|
1750
|
+
|
|
1751
|
+
# Local-warmup fallback path: daemon is unreachable, so it's safe
|
|
1752
|
+
# to spawn our own embedding worker (no singleton conflict).
|
|
1753
|
+
# Increase timeout for first-time download.
|
|
1675
1754
|
original_timeout = _emb_mod._SUBPROCESS_RESPONSE_TIMEOUT
|
|
1676
1755
|
_emb_mod._SUBPROCESS_RESPONSE_TIMEOUT = 180 # 3 min for cold start
|
|
1677
1756
|
|
|
@@ -137,6 +137,50 @@ def daemon_request(method: str, path: str, body: dict | None = None) -> dict | N
|
|
|
137
137
|
_LOCK_FILE = Path.home() / ".superlocalmemory" / "daemon.lock"
|
|
138
138
|
|
|
139
139
|
|
|
140
|
+
def _start_daemon_subprocess() -> bool:
|
|
141
|
+
"""Spawn the unified daemon subprocess and wait for readiness.
|
|
142
|
+
|
|
143
|
+
v3.4.42: Extracted from ensure_daemon() so callers that already hold
|
|
144
|
+
daemon.lock (e.g. cmd_restart Step 2) can start the daemon WITHOUT
|
|
145
|
+
triggering a second flock acquisition. BSD-style flock blocks per-fd
|
|
146
|
+
even within the same process, so the previous code path produced a
|
|
147
|
+
self-deadlock when called from Step 3 of `slm restart`: the lock held
|
|
148
|
+
by Step 2 caused ensure_daemon's own flock to fail with EWOULDBLOCK,
|
|
149
|
+
falling into the wait-for-someone-else branch and timing out at 60s
|
|
150
|
+
even though the daemon would have started cleanly.
|
|
151
|
+
|
|
152
|
+
PRECONDITION: caller has either acquired daemon.lock OR is certain no
|
|
153
|
+
other CLI/MCP process is racing to start a daemon (e.g. we just killed
|
|
154
|
+
everything in `slm restart` Step 1).
|
|
155
|
+
|
|
156
|
+
Returns True if daemon is reachable on the health endpoint within
|
|
157
|
+
60 seconds, False otherwise.
|
|
158
|
+
"""
|
|
159
|
+
if is_daemon_running():
|
|
160
|
+
return True
|
|
161
|
+
|
|
162
|
+
import subprocess
|
|
163
|
+
cmd = [sys.executable, "-m", "superlocalmemory.server.unified_daemon", "--start"]
|
|
164
|
+
log_dir = Path.home() / ".superlocalmemory" / "logs"
|
|
165
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
166
|
+
log_file = log_dir / "daemon.log"
|
|
167
|
+
|
|
168
|
+
kwargs: dict = {}
|
|
169
|
+
if sys.platform == "win32":
|
|
170
|
+
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
|
|
171
|
+
else:
|
|
172
|
+
kwargs["start_new_session"] = True
|
|
173
|
+
|
|
174
|
+
with open(log_file, "a") as lf:
|
|
175
|
+
proc = subprocess.Popen(cmd, stdout=lf, stderr=lf, **kwargs)
|
|
176
|
+
|
|
177
|
+
# Write PID immediately so other callers see it during warmup
|
|
178
|
+
_PID_FILE.write_text(str(proc.pid))
|
|
179
|
+
_PORT_FILE.write_text(str(_DEFAULT_PORT))
|
|
180
|
+
|
|
181
|
+
return _wait_for_daemon(timeout=60)
|
|
182
|
+
|
|
183
|
+
|
|
140
184
|
def ensure_daemon() -> bool:
|
|
141
185
|
"""Start daemon if not running. Returns True if daemon is ready.
|
|
142
186
|
|
|
@@ -145,6 +189,12 @@ def ensure_daemon() -> bool:
|
|
|
145
189
|
2. File lock prevents two callers from starting concurrent daemons
|
|
146
190
|
3. After starting, waits for PID file (not health check) — fast detection
|
|
147
191
|
4. Cross-platform: macOS + Windows + Linux
|
|
192
|
+
|
|
193
|
+
v3.4.42: Refactored to delegate the actual subprocess start to
|
|
194
|
+
`_start_daemon_subprocess()`. Callers that already hold daemon.lock
|
|
195
|
+
(e.g. `slm restart` Step 3) should call that helper directly to avoid
|
|
196
|
+
the same-process flock self-deadlock that returned a false-negative
|
|
197
|
+
"failed to start" while the daemon was actually starting cleanly.
|
|
148
198
|
"""
|
|
149
199
|
if is_daemon_running():
|
|
150
200
|
return True
|
|
@@ -176,27 +226,9 @@ def ensure_daemon() -> bool:
|
|
|
176
226
|
if is_daemon_running():
|
|
177
227
|
return True
|
|
178
228
|
|
|
179
|
-
# Start unified daemon in background
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
log_dir = Path.home() / ".superlocalmemory" / "logs"
|
|
183
|
-
log_dir.mkdir(parents=True, exist_ok=True)
|
|
184
|
-
log_file = log_dir / "daemon.log"
|
|
185
|
-
|
|
186
|
-
kwargs: dict = {}
|
|
187
|
-
if sys.platform == "win32":
|
|
188
|
-
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
|
|
189
|
-
else:
|
|
190
|
-
kwargs["start_new_session"] = True
|
|
191
|
-
|
|
192
|
-
with open(log_file, "a") as lf:
|
|
193
|
-
proc = subprocess.Popen(cmd, stdout=lf, stderr=lf, **kwargs)
|
|
194
|
-
|
|
195
|
-
# Write PID immediately so other callers see it during warmup
|
|
196
|
-
_PID_FILE.write_text(str(proc.pid))
|
|
197
|
-
_PORT_FILE.write_text(str(_DEFAULT_PORT))
|
|
198
|
-
|
|
199
|
-
return _wait_for_daemon(timeout=60)
|
|
229
|
+
# Start unified daemon in background — delegated to helper so the
|
|
230
|
+
# same logic can be reused by callers that already hold the lock.
|
|
231
|
+
return _start_daemon_subprocess()
|
|
200
232
|
|
|
201
233
|
except Exception as exc:
|
|
202
234
|
# Daemon auto-start is the entry point for dashboard / mesh /
|
{superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_wiring.py
RENAMED
|
@@ -559,14 +559,39 @@ def init_retrieval(
|
|
|
559
559
|
# The CrossEncoderReranker constructor starts background warmup, but
|
|
560
560
|
# callers can also call warmup_sync() to block until ready.
|
|
561
561
|
# Here we just log warmup status — benchmark scripts call warmup_sync() explicitly.
|
|
562
|
+
#
|
|
563
|
+
# v3.4.42: Distinguish the legitimate "another process owns the
|
|
564
|
+
# reranker worker" case (machine-wide singleton — usually the unified
|
|
565
|
+
# daemon) from a real warmup failure. Before this fix, any CLI process
|
|
566
|
+
# that wired an Engine while the daemon was up would log
|
|
567
|
+
# "reranker warmup failed — recalls will use fallback scoring" even
|
|
568
|
+
# though the daemon's reranker was healthy and serving fine. The
|
|
569
|
+
# warning was a false positive that masked real failures and eroded
|
|
570
|
+
# trust in slm health / slm doctor output.
|
|
562
571
|
if reranker is not None:
|
|
563
572
|
import threading
|
|
564
573
|
def _log_warmup_status() -> None:
|
|
565
574
|
ready = reranker.warmup_sync(timeout=180)
|
|
566
575
|
if ready:
|
|
567
576
|
logger.info("Cross-encoder reranker warm and ready")
|
|
568
|
-
|
|
569
|
-
|
|
577
|
+
return
|
|
578
|
+
# warmup_sync returned False. Could be (a) singleton held by
|
|
579
|
+
# another process (benign), or (b) actual model load failure.
|
|
580
|
+
# Disambiguate by probing the singleton PID file.
|
|
581
|
+
try:
|
|
582
|
+
from superlocalmemory.retrieval.reranker import _is_reranker_worker_alive
|
|
583
|
+
if _is_reranker_worker_alive():
|
|
584
|
+
logger.info(
|
|
585
|
+
"Cross-encoder reranker worker held by another process "
|
|
586
|
+
"(machine-wide singleton — usually the unified daemon); "
|
|
587
|
+
"this process will route reranking through that worker"
|
|
588
|
+
)
|
|
589
|
+
return
|
|
590
|
+
except Exception:
|
|
591
|
+
pass
|
|
592
|
+
logger.warning(
|
|
593
|
+
"Cross-encoder reranker warmup failed — recalls will use fallback scoring"
|
|
594
|
+
)
|
|
570
595
|
t = threading.Thread(target=_log_warmup_status, daemon=True, name="ce-init-warmup")
|
|
571
596
|
t.start()
|
|
572
597
|
|