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.
Files changed (458) hide show
  1. {superlocalmemory-3.4.41/src/superlocalmemory.egg-info → superlocalmemory-3.4.43}/PKG-INFO +45 -5
  2. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/README.md +41 -0
  3. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/pyproject.toml +19 -5
  4. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/commands.py +110 -31
  5. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/daemon.py +53 -21
  6. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_wiring.py +27 -2
  7. superlocalmemory-3.4.43/src/superlocalmemory/hooks/before_web_hook.py +128 -0
  8. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/claude_code_hooks.py +57 -15
  9. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/hook_handlers.py +27 -15
  10. superlocalmemory-3.4.43/src/superlocalmemory/hooks/topic_shift_hook.py +272 -0
  11. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_active.py +5 -5
  12. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43/src/superlocalmemory.egg-info}/PKG-INFO +45 -5
  13. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/SOURCES.txt +5 -0
  14. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/requires.txt +3 -4
  15. superlocalmemory-3.4.43/tests/test_before_web_hook.py +212 -0
  16. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_claude_hooks.py +48 -6
  17. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_hook_handlers.py +19 -6
  18. superlocalmemory-3.4.43/tests/test_mode_switch_preservation.py +271 -0
  19. superlocalmemory-3.4.43/tests/test_topic_shift_hook.py +353 -0
  20. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/AUTHORS.md +0 -0
  21. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/LICENSE +0 -0
  22. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/NOTICE +0 -0
  23. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/setup.cfg +0 -0
  24. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/__init__.py +0 -0
  25. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/__init__.py +0 -0
  26. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  27. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/signer.py +0 -0
  28. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/attribution/watermark.py +0 -0
  29. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/__init__.py +0 -0
  30. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/context_commands.py +0 -0
  31. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/db_migrate.py +0 -0
  32. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  33. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  34. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  35. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/json_output.py +0 -0
  36. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/main.py +0 -0
  37. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  38. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/pending_store.py +0 -0
  39. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/post_install.py +0 -0
  40. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/service_installer.py +0 -0
  41. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  42. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/version_banner.py +0 -0
  43. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  44. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/__init__.py +0 -0
  45. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  46. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  47. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  48. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  49. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  50. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  51. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  52. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/changes.py +0 -0
  53. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/communities.py +0 -0
  54. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/config.py +0 -0
  55. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/database.py +0 -0
  56. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  57. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  58. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  59. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/flows.py +0 -0
  60. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  61. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  62. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  63. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/incremental.py +0 -0
  64. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/models.py +0 -0
  65. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/parser.py +0 -0
  66. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/resolver.py +0 -0
  67. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/search.py +0 -0
  68. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/service.py +0 -0
  69. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/code_graph/watcher.py +0 -0
  70. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/__init__.py +0 -0
  71. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/abac.py +0 -0
  72. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/audit.py +0 -0
  73. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  74. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/gdpr.py +0 -0
  75. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  76. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/retention.py +0 -0
  77. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/compliance/scheduler.py +0 -0
  78. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/__init__.py +0 -0
  79. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/clock_monitor.py +0 -0
  80. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/config.py +0 -0
  81. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/consolidation_engine.py +0 -0
  82. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/context_cache.py +0 -0
  83. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/db_pool.py +0 -0
  84. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/embedding_worker.py +0 -0
  85. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/embeddings.py +0 -0
  86. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine.py +0 -0
  87. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  88. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/engine_lock.py +0 -0
  89. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/error_catalog.py +0 -0
  90. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/error_envelope.py +0 -0
  91. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  92. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/file_lock.py +0 -0
  93. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  94. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/graph_pruner.py +0 -0
  95. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/health_monitor.py +0 -0
  96. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/hooks.py +0 -0
  97. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  98. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/maintenance.py +0 -0
  99. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
  100. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/modes.py +0 -0
  101. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  102. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/platform_utils.py +0 -0
  103. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/priority_queue.py +0 -0
  104. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/profiles.py +0 -0
  105. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/queue_consumer.py +0 -0
  106. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  107. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/ram_lock.py +0 -0
  108. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/rate_limit.py +0 -0
  109. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_gate.py +0 -0
  110. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_pipeline.py +0 -0
  111. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_queue.py +0 -0
  112. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/recall_worker.py +0 -0
  113. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/registry.py +0 -0
  114. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/reranker_worker.py +0 -0
  115. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/safe_fs.py +0 -0
  116. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/security_primitives.py +0 -0
  117. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/shadow_router.py +0 -0
  118. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/slm_disabled.py +0 -0
  119. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/slmignore.py +0 -0
  120. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/store_pipeline.py +0 -0
  121. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/summarizer.py +0 -0
  122. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/tier_manager.py +0 -0
  123. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/topic_signature.py +0 -0
  124. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/core/worker_pool.py +0 -0
  125. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/__init__.py +0 -0
  126. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  127. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  128. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  129. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  130. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/__init__.py +0 -0
  131. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  132. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  133. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/consolidator.py +0 -0
  134. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/context_generator.py +0 -0
  135. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/emotional.py +0 -0
  136. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  137. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  138. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  139. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/foresight.py +0 -0
  140. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  141. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  142. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  143. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  144. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  145. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  146. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/encoding/type_router.py +0 -0
  147. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/__init__.py +0 -0
  148. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  149. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/budget.py +0 -0
  150. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  151. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  152. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  153. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  154. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/triggers.py +0 -0
  155. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/evolution/types.py +0 -0
  156. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/__init__.py +0 -0
  157. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  158. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  159. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  160. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  161. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  162. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  163. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  164. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  165. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/context_payload.py +0 -0
  166. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  167. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  168. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  169. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  170. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  171. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  172. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  173. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  174. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  175. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/session_registry.py +0 -0
  176. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  177. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  178. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  179. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  180. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/__init__.py +0 -0
  181. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  182. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/backup.py +0 -0
  183. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/cache_manager.py +0 -0
  184. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  185. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/event_bus.py +0 -0
  186. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  187. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/pid_manager.py +0 -0
  188. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/process_reaper.py +0 -0
  189. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  190. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  191. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/__init__.py +0 -0
  192. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  193. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  194. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  195. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/credentials.py +0 -0
  196. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  197. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/parsers.py +0 -0
  198. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  199. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/__init__.py +0 -0
  200. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/adaptive.py +0 -0
  201. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  202. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  203. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bandit.py +0 -0
  204. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  205. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/behavioral.py +0 -0
  206. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  207. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/bootstrap.py +0 -0
  208. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  209. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  210. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  211. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/cross_project.py +0 -0
  212. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/database.py +0 -0
  213. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  214. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/engagement.py +0 -0
  215. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ensemble.py +0 -0
  216. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  217. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  218. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/features.py +0 -0
  219. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/feedback.py +0 -0
  220. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  221. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  222. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/labeler.py +0 -0
  223. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  224. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/memory_merge.py +0 -0
  225. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/model_cache.py +0 -0
  226. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/model_rollback.py +0 -0
  227. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  228. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/outcomes.py +0 -0
  229. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  230. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  231. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/project_context.py +0 -0
  232. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  233. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker.py +0 -0
  234. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_common.py +0 -0
  235. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  236. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  237. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward.py +0 -0
  238. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_archive.py +0 -0
  239. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_boost.py +0 -0
  240. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  241. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/shadow_test.py +0 -0
  242. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/signal_worker.py +0 -0
  243. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/signals.py +0 -0
  244. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  245. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/source_quality.py +0 -0
  246. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/trigram_index.py +0 -0
  247. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/learning/workflows.py +0 -0
  248. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/llm/__init__.py +0 -0
  249. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/llm/backbone.py +0 -0
  250. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/__init__.py +0 -0
  251. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  252. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/fisher.py +0 -0
  253. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  254. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/hopfield.py +0 -0
  255. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/langevin.py +0 -0
  256. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/polar_quant.py +0 -0
  257. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/qjl.py +0 -0
  258. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/sheaf.py +0 -0
  259. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/math/turbo_quant.py +0 -0
  260. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/__init__.py +0 -0
  261. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  262. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  263. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/resources.py +0 -0
  264. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/server.py +0 -0
  265. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/shared.py +0 -0
  266. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools.py +0 -0
  267. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  268. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_context.py +0 -0
  269. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_core.py +0 -0
  270. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  271. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  272. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  273. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  274. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  275. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  276. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mesh/__init__.py +0 -0
  277. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/mesh/broker.py +0 -0
  278. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/migrations/__init__.py +0 -0
  279. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  280. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/__init__.py +0 -0
  281. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  282. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  283. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  284. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  285. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  286. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/__init__.py +0 -0
  287. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/agentic.py +0 -0
  288. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  289. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  290. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  291. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  292. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/engine.py +0 -0
  293. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  294. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  295. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/fusion.py +0 -0
  296. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  297. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  298. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  299. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/reranker.py +0 -0
  300. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  301. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  302. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/strategy.py +0 -0
  303. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  304. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  305. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/__init__.py +0 -0
  306. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/api.py +0 -0
  307. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/bandit_loops.py +0 -0
  308. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  309. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  310. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/__init__.py +0 -0
  311. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/adapters.py +0 -0
  312. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/agents.py +0 -0
  313. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/backup.py +0 -0
  314. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  315. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/brain.py +0 -0
  316. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/chat.py +0 -0
  317. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/compliance.py +0 -0
  318. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/data_io.py +0 -0
  319. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/entity.py +0 -0
  320. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/events.py +0 -0
  321. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/evolution.py +0 -0
  322. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/helpers.py +0 -0
  323. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/ingest.py +0 -0
  324. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/insights.py +0 -0
  325. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/learning.py +0 -0
  326. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  327. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/memories.py +0 -0
  328. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/mesh.py +0 -0
  329. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  330. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/profiles.py +0 -0
  331. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/stats.py +0 -0
  332. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/tiers.py +0 -0
  333. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/timeline.py +0 -0
  334. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/token.py +0 -0
  335. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/v3_api.py +0 -0
  336. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/routes/ws.py +0 -0
  337. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/security_middleware.py +0 -0
  338. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/ui.py +0 -0
  339. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/server/unified_daemon.py +0 -0
  340. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  341. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  342. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  343. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  344. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  345. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  346. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  347. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/__init__.py +0 -0
  348. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/access_control.py +0 -0
  349. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/access_log.py +0 -0
  350. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/database.py +0 -0
  351. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  352. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migration_runner.py +0 -0
  353. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migration_v33.py +0 -0
  354. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  355. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  356. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  357. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  358. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  359. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  360. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  361. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  362. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  363. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  364. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  365. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  366. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  367. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/migrations.py +0 -0
  368. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/models.py +0 -0
  369. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/quantized_store.py +0 -0
  370. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema.py +0 -0
  371. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  372. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v32.py +0 -0
  373. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  374. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  375. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v343.py +0 -0
  376. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/schema_v347.py +0 -0
  377. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  378. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/__init__.py +0 -0
  379. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/gate.py +0 -0
  380. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/provenance.py +0 -0
  381. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/scorer.py +0 -0
  382. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/trust/signals.py +0 -0
  383. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/brain.css +0 -0
  384. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  385. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  386. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/index.html +0 -0
  387. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/agents.js +0 -0
  388. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  389. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/brain.js +0 -0
  390. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/clusters.js +0 -0
  391. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/compliance.js +0 -0
  392. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/core.js +0 -0
  393. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  394. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/events.js +0 -0
  395. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  396. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/feedback.js +0 -0
  397. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  398. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  399. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  400. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  401. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/init.js +0 -0
  402. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  403. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  404. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/math-health.js +0 -0
  405. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memories.js +0 -0
  406. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  407. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  408. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/modal.js +0 -0
  409. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  410. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  411. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  412. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  413. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  414. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  415. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/profiles.js +0 -0
  416. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  417. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  418. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/search.js +0 -0
  419. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/settings.js +0 -0
  420. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/timeline.js +0 -0
  421. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  422. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  423. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  424. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  425. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  426. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  427. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  428. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  429. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  430. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  431. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  432. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  433. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  434. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  435. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  436. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  437. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_auto_hooks.py +0 -0
  438. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_behavioral_full.py +0 -0
  439. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli.py +0 -0
  440. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli_json.py +0 -0
  441. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_cli_v33.py +0 -0
  442. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_compliance_full.py +0 -0
  443. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_config_system.py +0 -0
  444. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_engine_hooks.py +0 -0
  445. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_event_bus.py +0 -0
  446. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_features.py +0 -0
  447. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_final_locomo_mini.py +0 -0
  448. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_ide_connector.py +0 -0
  449. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_infra.py +0 -0
  450. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_learning_advanced.py +0 -0
  451. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_learning_collectors.py +0 -0
  452. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_llm_provider.py +0 -0
  453. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_mcp_server.py +0 -0
  454. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_migration.py +0 -0
  455. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_post_install.py +0 -0
  456. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_ranker.py +0 -0
  457. {superlocalmemory-3.4.41 → superlocalmemory-3.4.43}/tests/test_trust_full.py +0 -0
  458. {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.41
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.0.0
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.0.0; extra == "search"
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.41"
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
- "sentence-transformers[onnx]>=5.0.0",
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.0.0",
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 ensure_daemon
321
- started = ensure_daemon()
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 = SLMConfig.for_mode(
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 = SLMConfig.for_mode(
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
- # V3.3: Check if embedding model changed inform about re-indexing
668
- if (config.embedding.provider != updated.embedding.provider
669
- or config.embedding.model_name != updated.embedding.model_name):
670
- print(" ⚠ Embedding model changed. Re-indexing will run on next recall.")
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 ["diskcache", "orjson"]:
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 len(perf_ok) == 2:
1426
- _check("Performance deps", "PASS", "diskcache, orjson")
1463
+ if perf_ok:
1464
+ _check("Performance deps", "PASS", "orjson")
1427
1465
  else:
1428
- missing = {"diskcache", "orjson"} - set(perf_ok)
1429
- _check("Performance deps", "WARN", f"Missing: {', '.join(missing)}",
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
- # Increase timeout for first-time download
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
- import subprocess
181
- cmd = [sys.executable, "-m", "superlocalmemory.server.unified_daemon", "--start"]
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 /
@@ -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
- else:
569
- logger.warning("Cross-encoder reranker warmup failed recalls will use fallback scoring")
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