superlocalmemory 3.5.4__tar.gz → 3.5.6__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 (471) hide show
  1. {superlocalmemory-3.5.4/src/superlocalmemory.egg-info → superlocalmemory-3.5.6}/PKG-INFO +1 -1
  2. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/pyproject.toml +1 -1
  3. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/engine.py +85 -0
  4. superlocalmemory-3.5.6/src/superlocalmemory/learning/lightgbm_subprocess.py +236 -0
  5. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_core.py +31 -13
  6. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/learning.py +20 -4
  7. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/v3_api.py +28 -6
  8. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/unified_daemon.py +51 -6
  9. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6/src/superlocalmemory.egg-info}/PKG-INFO +1 -1
  10. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory.egg-info/SOURCES.txt +1 -0
  11. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/AUTHORS.md +0 -0
  12. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/LICENSE +0 -0
  13. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/NOTICE +0 -0
  14. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/README.md +0 -0
  15. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/setup.cfg +0 -0
  16. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/__init__.py +0 -0
  17. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/attribution/__init__.py +0 -0
  18. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  19. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/attribution/signer.py +0 -0
  20. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/attribution/watermark.py +0 -0
  21. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/__init__.py +0 -0
  22. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/commands.py +0 -0
  23. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/context_commands.py +0 -0
  24. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/daemon.py +0 -0
  25. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/db_migrate.py +0 -0
  26. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  27. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  28. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  29. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/json_output.py +0 -0
  30. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/main.py +0 -0
  31. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  32. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/pending_store.py +0 -0
  33. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/post_install.py +0 -0
  34. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/service_installer.py +0 -0
  35. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  36. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/version_banner.py +0 -0
  37. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  38. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/__init__.py +0 -0
  39. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  40. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  41. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  42. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  43. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  44. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  45. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  46. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/changes.py +0 -0
  47. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/communities.py +0 -0
  48. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/config.py +0 -0
  49. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/database.py +0 -0
  50. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  51. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  52. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  53. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/flows.py +0 -0
  54. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  55. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  56. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  57. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/incremental.py +0 -0
  58. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/models.py +0 -0
  59. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/parser.py +0 -0
  60. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/resolver.py +0 -0
  61. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/search.py +0 -0
  62. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/service.py +0 -0
  63. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/code_graph/watcher.py +0 -0
  64. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/__init__.py +0 -0
  65. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/abac.py +0 -0
  66. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/audit.py +0 -0
  67. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  68. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/gdpr.py +0 -0
  69. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  70. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/retention.py +0 -0
  71. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/compliance/scheduler.py +0 -0
  72. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/__init__.py +0 -0
  73. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
  74. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/clock_monitor.py +0 -0
  75. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/config.py +0 -0
  76. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/consolidation_engine.py +0 -0
  77. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/context_cache.py +0 -0
  78. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/db_pool.py +0 -0
  79. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/embedding_worker.py +0 -0
  80. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/embeddings.py +0 -0
  81. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  82. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/engine_lock.py +0 -0
  83. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/engine_wiring.py +0 -0
  84. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/error_catalog.py +0 -0
  85. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/error_envelope.py +0 -0
  86. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  87. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/file_lock.py +0 -0
  88. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  89. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/graph_pruner.py +0 -0
  90. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/health_monitor.py +0 -0
  91. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/hooks.py +0 -0
  92. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/injection.py +0 -0
  93. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  94. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/maintenance.py +0 -0
  95. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
  96. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/modes.py +0 -0
  97. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  98. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/platform_utils.py +0 -0
  99. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/priority_queue.py +0 -0
  100. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/profiles.py +0 -0
  101. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/pruning_engine.py +0 -0
  102. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/queue_consumer.py +0 -0
  103. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  104. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/ram_lock.py +0 -0
  105. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/rate_limit.py +0 -0
  106. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/recall_gate.py +0 -0
  107. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/recall_pipeline.py +0 -0
  108. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/recall_queue.py +0 -0
  109. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/recall_worker.py +0 -0
  110. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/registry.py +0 -0
  111. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/reranker_worker.py +0 -0
  112. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/safe_fs.py +0 -0
  113. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/security_primitives.py +0 -0
  114. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/shadow_router.py +0 -0
  115. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/slm_disabled.py +0 -0
  116. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/slmignore.py +0 -0
  117. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/store_pipeline.py +0 -0
  118. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/summarizer.py +0 -0
  119. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/tier_manager.py +0 -0
  120. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/topic_signature.py +0 -0
  121. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/core/worker_pool.py +0 -0
  122. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/dynamics/__init__.py +0 -0
  123. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  124. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  125. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  126. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  127. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/__init__.py +0 -0
  128. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  129. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  130. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/consolidator.py +0 -0
  131. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/context_generator.py +0 -0
  132. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/emotional.py +0 -0
  133. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  134. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  135. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  136. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/foresight.py +0 -0
  137. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  138. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  139. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  140. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  141. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  142. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  143. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/encoding/type_router.py +0 -0
  144. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/__init__.py +0 -0
  145. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  146. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/budget.py +0 -0
  147. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  148. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  149. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  150. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  151. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/triggers.py +0 -0
  152. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/evolution/types.py +0 -0
  153. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/graph/__init__.py +0 -0
  154. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  155. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/__init__.py +0 -0
  156. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  157. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  158. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  159. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  160. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  161. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  162. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  163. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  164. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
  165. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  166. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/context_payload.py +0 -0
  167. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  168. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  169. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  170. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  171. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  172. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  173. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  174. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  175. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  176. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  177. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/session_registry.py +0 -0
  178. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  179. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  180. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  181. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  182. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  183. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/__init__.py +0 -0
  184. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  185. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/backup.py +0 -0
  186. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/cache_manager.py +0 -0
  187. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  188. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/event_bus.py +0 -0
  189. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  190. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/pid_manager.py +0 -0
  191. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/process_reaper.py +0 -0
  192. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  193. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  194. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/__init__.py +0 -0
  195. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  196. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  197. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  198. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/credentials.py +0 -0
  199. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  200. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/parsers.py +0 -0
  201. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  202. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/__init__.py +0 -0
  203. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/adaptive.py +0 -0
  204. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  205. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  206. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/bandit.py +0 -0
  207. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  208. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/behavioral.py +0 -0
  209. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  210. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/bootstrap.py +0 -0
  211. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  212. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  213. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  214. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/cross_project.py +0 -0
  215. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/database.py +0 -0
  216. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  217. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/engagement.py +0 -0
  218. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/ensemble.py +0 -0
  219. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  220. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  221. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/features.py +0 -0
  222. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/feedback.py +0 -0
  223. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  224. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  225. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/labeler.py +0 -0
  226. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  227. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/memory_merge.py +0 -0
  228. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/model_cache.py +0 -0
  229. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/model_rollback.py +0 -0
  230. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  231. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/outcomes.py +0 -0
  232. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  233. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  234. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/project_context.py +0 -0
  235. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  236. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/ranker.py +0 -0
  237. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/ranker_common.py +0 -0
  238. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  239. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  240. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/reward.py +0 -0
  241. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/reward_archive.py +0 -0
  242. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/reward_boost.py +0 -0
  243. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  244. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/shadow_test.py +0 -0
  245. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/signal_worker.py +0 -0
  246. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/signals.py +0 -0
  247. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  248. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/source_quality.py +0 -0
  249. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/trigram_index.py +0 -0
  250. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/learning/workflows.py +0 -0
  251. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/llm/__init__.py +0 -0
  252. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/llm/backbone.py +0 -0
  253. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/__init__.py +0 -0
  254. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  255. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/fisher.py +0 -0
  256. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  257. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/hopfield.py +0 -0
  258. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/langevin.py +0 -0
  259. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/polar_quant.py +0 -0
  260. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/qjl.py +0 -0
  261. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/sheaf.py +0 -0
  262. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/math/turbo_quant.py +0 -0
  263. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/__init__.py +0 -0
  264. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  265. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  266. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/resources.py +0 -0
  267. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/server.py +0 -0
  268. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/shared.py +0 -0
  269. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools.py +0 -0
  270. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_active.py +0 -0
  271. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  272. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_context.py +0 -0
  273. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  274. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  275. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  276. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  277. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  278. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  279. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mesh/__init__.py +0 -0
  280. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mesh/broker.py +0 -0
  281. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  282. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/migrations/__init__.py +0 -0
  283. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  284. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/__init__.py +0 -0
  285. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  286. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  287. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  288. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  289. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  290. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/__init__.py +0 -0
  291. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/agentic.py +0 -0
  292. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  293. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  294. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  295. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  296. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/engine.py +0 -0
  297. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  298. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  299. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/fusion.py +0 -0
  300. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  301. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  302. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  303. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/reranker.py +0 -0
  304. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  305. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  306. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/strategy.py +0 -0
  307. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  308. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  309. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/__init__.py +0 -0
  310. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/api.py +0 -0
  311. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/bandit_loops.py +0 -0
  312. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  313. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  314. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/__init__.py +0 -0
  315. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/adapters.py +0 -0
  316. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/agents.py +0 -0
  317. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/backup.py +0 -0
  318. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  319. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/brain.py +0 -0
  320. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/chat.py +0 -0
  321. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/compliance.py +0 -0
  322. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/data_io.py +0 -0
  323. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/entity.py +0 -0
  324. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/events.py +0 -0
  325. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/evolution.py +0 -0
  326. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/helpers.py +0 -0
  327. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/ingest.py +0 -0
  328. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/insights.py +0 -0
  329. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  330. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/memories.py +0 -0
  331. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/mesh.py +0 -0
  332. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  333. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/profiles.py +0 -0
  334. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/stats.py +0 -0
  335. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/tiers.py +0 -0
  336. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/timeline.py +0 -0
  337. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/token.py +0 -0
  338. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/routes/ws.py +0 -0
  339. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/security_middleware.py +0 -0
  340. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/server/ui.py +0 -0
  341. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  342. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  343. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  344. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  345. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  346. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  347. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  348. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/__init__.py +0 -0
  349. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/access_control.py +0 -0
  350. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/access_log.py +0 -0
  351. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/database.py +0 -0
  352. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  353. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migration_runner.py +0 -0
  354. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migration_v33.py +0 -0
  355. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  356. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  357. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  358. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  359. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  360. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  361. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  362. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  363. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  364. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  365. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  366. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  367. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  368. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
  369. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  370. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/migrations.py +0 -0
  371. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/models.py +0 -0
  372. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/quantized_store.py +0 -0
  373. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema.py +0 -0
  374. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  375. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v32.py +0 -0
  376. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  377. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  378. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v343.py +0 -0
  379. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v345.py +0 -0
  380. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/schema_v347.py +0 -0
  381. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  382. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/trust/__init__.py +0 -0
  383. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/trust/gate.py +0 -0
  384. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/trust/provenance.py +0 -0
  385. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/trust/scorer.py +0 -0
  386. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/trust/signals.py +0 -0
  387. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/css/brain.css +0 -0
  388. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  389. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  390. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/index.html +0 -0
  391. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/agents.js +0 -0
  392. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  393. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/brain.js +0 -0
  394. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/clusters.js +0 -0
  395. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/compliance.js +0 -0
  396. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/core.js +0 -0
  397. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  398. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/events.js +0 -0
  399. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  400. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/feedback.js +0 -0
  401. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  402. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  403. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  404. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  405. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/init.js +0 -0
  406. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  407. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  408. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/math-health.js +0 -0
  409. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/memories.js +0 -0
  410. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  411. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  412. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/modal.js +0 -0
  413. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  414. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  415. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  416. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  417. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  418. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  419. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/profiles.js +0 -0
  420. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  421. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  422. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/search.js +0 -0
  423. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/settings.js +0 -0
  424. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/timeline.js +0 -0
  425. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  426. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  427. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  428. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  429. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  430. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  431. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  432. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  433. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  434. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  435. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  436. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  437. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  438. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/vector/__init__.py +0 -0
  439. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  440. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  441. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  442. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory.egg-info/requires.txt +0 -0
  443. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  444. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_auto_hooks.py +0 -0
  445. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_before_web_hook.py +0 -0
  446. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_behavioral_full.py +0 -0
  447. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_claude_hooks.py +0 -0
  448. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_cli.py +0 -0
  449. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_cli_json.py +0 -0
  450. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_cli_v33.py +0 -0
  451. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_compliance_full.py +0 -0
  452. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_config_system.py +0 -0
  453. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_engine_hooks.py +0 -0
  454. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_event_bus.py +0 -0
  455. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_features.py +0 -0
  456. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_final_locomo_mini.py +0 -0
  457. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_hook_handlers.py +0 -0
  458. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_ide_connector.py +0 -0
  459. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_infra.py +0 -0
  460. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_injection.py +0 -0
  461. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_learning_advanced.py +0 -0
  462. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_learning_collectors.py +0 -0
  463. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_llm_provider.py +0 -0
  464. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_mcp_server.py +0 -0
  465. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_migration.py +0 -0
  466. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_mode_switch_preservation.py +0 -0
  467. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_post_install.py +0 -0
  468. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_ranker.py +0 -0
  469. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_topic_shift_hook.py +0 -0
  470. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_trust_full.py +0 -0
  471. {superlocalmemory-3.5.4 → superlocalmemory-3.5.6}/tests/test_v3_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.5.4
3
+ Version: 3.5.6
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.5.4"
3
+ version = "3.5.6"
4
4
  description = "Information-geometric agent memory with mathematical guarantees"
5
5
  readme = "README.md"
6
6
  license = {text = "AGPL-3.0-or-later"}
@@ -369,6 +369,91 @@ class MemoryEngine:
369
369
  vector_store=self._vector_store,
370
370
  )
371
371
 
372
+ def store_fast(self, content: str, metadata: dict[str, Any] | None = None) -> list[str]:
373
+ """v3.5.5 WRITE-THROUGH: synchronous verbatim insert for IMMEDIATE recall.
374
+
375
+ Full ``store()`` blocks 30-180s on LLM fact-extraction + Ollama embedding
376
+ + graph building. That created a recall window: a memory stored via the
377
+ async path sat in pending.db, unrecallable, until the background
378
+ materializer caught up. An agent storing a decision then immediately
379
+ recalling it (same session, or a parallel/next session) would miss it.
380
+
381
+ store_fast inserts a verbatim AtomicFact (+ memory row) synchronously.
382
+ The FTS5 ``atomic_facts_fts`` trigger auto-populates on INSERT, so the
383
+ memory is **keyword/BM25-recallable the instant this returns** (~ms, no
384
+ LLM, no embedding). Embedding + entities + graph are enriched async by
385
+ the materializer (which detects facts with NULL embedding).
386
+
387
+ Returns real fact_ids immediately. Quality gate rejects template junk.
388
+ """
389
+ self._require_full("store_fast")
390
+ self._ensure_init()
391
+ import re as _re
392
+ import uuid as _uuid
393
+ from datetime import datetime, timezone
394
+ from superlocalmemory.storage.models import (
395
+ AtomicFact, FactType, MemoryRecord,
396
+ )
397
+ if not content or not content.strip():
398
+ return []
399
+ try:
400
+ from superlocalmemory.core.injection import is_low_quality
401
+ if is_low_quality(content):
402
+ return []
403
+ except Exception:
404
+ pass
405
+ now = datetime.now(timezone.utc).isoformat()
406
+ record = MemoryRecord(
407
+ profile_id=self._profile_id, content=content,
408
+ session_date=now[:10], metadata=metadata or {},
409
+ )
410
+ self._db.store_memory(record)
411
+ # Lightweight regex entities (matches store_pipeline verbatim path) so
412
+ # the entity_graph channel has something to work with before enrichment.
413
+ ents = sorted(
414
+ {m.group(1) for m in _re.finditer(
415
+ r"\b([A-Z][a-z]+(?:\s[A-Z][a-z]+){0,3})\b", content)}
416
+ | {m.group(1) for m in _re.finditer(r"\b([A-Z]{2,})\b", content)}
417
+ )
418
+ # v3.5.5: compute the embedding SYNCHRONOUSLY. A single warm embed is
419
+ # ~22ms (the 30-180s of full store() was LLM fact-extraction + graph,
420
+ # NOT embedding). With the embedding present, the semantic channel
421
+ # scores this fact correctly so it ranks properly IMMEDIATELY — not
422
+ # just keyword-findable but top-ranked. Graph/entity enrichment stays
423
+ # async. Embed failure → fact still inserted (keyword-recallable).
424
+ emb = None
425
+ fmean = fvar = None
426
+ try:
427
+ emb = self._embedder.embed(content) if self._embedder else None
428
+ if emb:
429
+ fmean, fvar = self._embedder.compute_fisher_params(emb)
430
+ except Exception:
431
+ emb = None
432
+ fact = AtomicFact(
433
+ fact_id=_uuid.uuid4().hex[:16], memory_id=record.memory_id,
434
+ profile_id=self._profile_id, content=content,
435
+ fact_type=FactType.EPISODIC, entities=ents,
436
+ observation_date=now[:10], confidence=0.7, importance=0.5,
437
+ embedding=emb, fisher_mean=fmean, fisher_variance=fvar,
438
+ created_at=now,
439
+ )
440
+ self._db.store_fact(fact) # FTS5 trigger → immediately BM25-recallable
441
+ # Upsert to vector store so the semantic channel finds it now.
442
+ try:
443
+ vs = getattr(self, "_vector_store", None)
444
+ if emb and vs and getattr(vs, "available", False):
445
+ vs.upsert(fact.fact_id, self._profile_id, emb)
446
+ except Exception:
447
+ pass
448
+ # Persist BM25 tokens too (covers the in-memory rank_bm25 fallback path).
449
+ try:
450
+ bm25 = getattr(self._retrieval_engine, "_bm25", None)
451
+ if bm25:
452
+ bm25.add(fact.fact_id, content, self._profile_id)
453
+ except Exception:
454
+ pass
455
+ return [fact.fact_id]
456
+
372
457
  # -- Recall operations --------------------------------------------------
373
458
 
374
459
  def recall(
@@ -0,0 +1,236 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under AGPL-3.0-or-later - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """Isolated LightGBM work (retrain + consolidation) — OpenMP-crash guard.
6
+
7
+ **Why this exists** — the unified daemon serves the HTTP API in-process and,
8
+ by then, has already loaded PyTorch's OpenMP runtime (``torch/lib/libomp.dylib``)
9
+ with *warm* worker threads (the cross-encoder reranker + embedding warm-up at
10
+ startup). Any code path that imports ``lightgbm`` in that same process loads a
11
+ *second* OpenMP runtime — the Homebrew ``libomp.dylib`` that
12
+ ``lib_lightgbm.dylib`` links against — which corrupts the shared ``__kmp``
13
+ global state and SIGSEGVs a pre-existing torch OMP worker thread. That
14
+ hard-crashes the whole daemon (observed on macOS / Apple Silicon;
15
+ ``DiagnosticReports/Python-*.ips`` shows ``libomp.dylib __kmp_launch_worker``).
16
+
17
+ Two in-daemon entry points reach LightGBM training:
18
+ * ``POST /api/learning/retrain`` → legacy ``_retrain_ranker_impl``;
19
+ * ``POST /api/v3/learning/consolidate`` → ``ConsolidationWorker.run`` whose
20
+ step 5 trains via the online ``_run_shadow_cycle`` (active model) or the
21
+ legacy cold-start path.
22
+
23
+ Both are funnelled through this module so LightGBM only ever trains in a
24
+ **fresh subprocess** that never runs a torch tensor op — torch's OMP pool stays
25
+ dormant there and lightgbm's runtime is the only active one. The mechanism
26
+ mirrors the existing ``embedding_worker`` / ``reranker_worker`` isolation.
27
+
28
+ Spawned via :func:`run_retrain_isolated` / :func:`run_consolidation_isolated`,
29
+ which use a ``python -c`` bootstrap that imports lightgbm BEFORE the
30
+ ``superlocalmemory`` package. That ordering is load-bearing: importing the
31
+ package transitively pulls in torch, and torch-OMP-first-then-lightgbm is
32
+ exactly the sequence that segfaults. A plain ``python -m
33
+ superlocalmemory.learning.lightgbm_subprocess`` would run the package
34
+ ``__init__`` (torch) first and crash — do not invoke it that way.
35
+
36
+ The child emits a single JSON line on stdout — ``{"error": str|null, ...}`` —
37
+ plus a task payload (``trained`` for retrain, ``stats`` for consolidate).
38
+ Exit 0 = ran to completion; non-zero = handled failure. Either way the parent
39
+ (the daemon) keeps running.
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ import argparse
45
+ import json
46
+ import logging
47
+ import subprocess
48
+ import sys
49
+ from pathlib import Path
50
+
51
+ logger = logging.getLogger(__name__)
52
+
53
+ # Wall-clock ceilings. A retrain is 50 boosting rounds on ≤2000 rows (seconds);
54
+ # a full consolidation cycle also decays/dedups/mines/graph-analyses, so it
55
+ # gets more headroom.
56
+ RETRAIN_TIMEOUT_SEC = 300
57
+ CONSOLIDATE_TIMEOUT_SEC = 600
58
+
59
+
60
+ # ---------------------------------------------------------------------------
61
+ # Child-side task implementations (run in the isolated subprocess).
62
+ # ---------------------------------------------------------------------------
63
+
64
+ def _retrain(learning_db: str, profile_id: str, *, include_synthetic: bool) -> bool:
65
+ """Legacy ranker retrain in this (lightgbm-first) process. Returns trained."""
66
+ import lightgbm # noqa: F401 (import-order side effect is intentional)
67
+
68
+ from superlocalmemory.learning.ranker_retrain_legacy import (
69
+ _retrain_ranker_impl,
70
+ )
71
+
72
+ return bool(
73
+ _retrain_ranker_impl(
74
+ learning_db, profile_id, include_synthetic=include_synthetic,
75
+ )
76
+ )
77
+
78
+
79
+ def _consolidate(
80
+ memory_db: str, learning_db: str, profile_id: str, *, dry_run: bool,
81
+ ) -> dict:
82
+ """Full consolidation cycle (incl. step-5 LightGBM training). Returns stats."""
83
+ import lightgbm # noqa: F401 (import-order side effect is intentional)
84
+
85
+ from superlocalmemory.learning.consolidation_worker import (
86
+ ConsolidationWorker,
87
+ )
88
+
89
+ worker = ConsolidationWorker(memory_db, learning_db)
90
+ return worker.run(profile_id, dry_run=dry_run)
91
+
92
+
93
+ def _emit(obj: dict) -> None:
94
+ """Write the verdict as a single JSON line (default=str for safety)."""
95
+ sys.stdout.write(json.dumps(obj, default=str) + "\n")
96
+ sys.stdout.flush()
97
+
98
+
99
+ def main(argv: list[str] | None = None) -> int:
100
+ parser = argparse.ArgumentParser(prog="slm-lightgbm-subprocess")
101
+ parser.add_argument("--task", choices=["retrain", "consolidate"], default="retrain")
102
+ parser.add_argument("--learning-db", required=True)
103
+ parser.add_argument("--memory-db")
104
+ parser.add_argument("--profile", default="default")
105
+ parser.add_argument("--include-synthetic", action="store_true")
106
+ parser.add_argument("--dry-run", action="store_true")
107
+ args = parser.parse_args(argv)
108
+
109
+ result: dict = {"error": None}
110
+ try:
111
+ if args.task == "retrain":
112
+ result["trained"] = _retrain(
113
+ args.learning_db, args.profile,
114
+ include_synthetic=args.include_synthetic,
115
+ )
116
+ else:
117
+ if not args.memory_db:
118
+ raise ValueError("--memory-db is required for the consolidate task")
119
+ result["stats"] = _consolidate(
120
+ args.memory_db, args.learning_db, args.profile,
121
+ dry_run=args.dry_run,
122
+ )
123
+ except Exception as exc: # noqa: BLE001
124
+ result["error"] = f"{type(exc).__name__}: {exc}"
125
+ _emit(result)
126
+ return 1
127
+
128
+ _emit(result)
129
+ return 0
130
+
131
+
132
+ # ---------------------------------------------------------------------------
133
+ # Caller-side helpers — spawn the child in an isolated process.
134
+ # ---------------------------------------------------------------------------
135
+
136
+ def _run_isolated(task_args: list[str], *, timeout_sec: int) -> dict:
137
+ """Spawn the child with lightgbm imported first; return its JSON verdict.
138
+
139
+ Never raises for the expected failure modes (non-zero exit, timeout,
140
+ native crash with no JSON) — encodes them in an ``error`` key so the
141
+ calling daemon stays up no matter what.
142
+ """
143
+ # The leading ``import lightgbm`` is load-bearing: it must run BEFORE the
144
+ # superlocalmemory package (which transitively imports torch). ``-c`` is
145
+ # the only way to guarantee that ordering — ``-m superlocalmemory.…`` runs
146
+ # the package __init__ (torch) first and would reintroduce the crash.
147
+ bootstrap = (
148
+ "import lightgbm; "
149
+ "from superlocalmemory.learning.lightgbm_subprocess import main; "
150
+ "raise SystemExit(main())"
151
+ )
152
+ cmd = [sys.executable, "-c", bootstrap, *task_args]
153
+
154
+ try:
155
+ proc = subprocess.run(
156
+ cmd,
157
+ capture_output=True,
158
+ text=True,
159
+ timeout=timeout_sec,
160
+ check=False,
161
+ )
162
+ except subprocess.TimeoutExpired:
163
+ return {"error": f"timed out after {timeout_sec}s"}
164
+ except Exception as exc: # noqa: BLE001
165
+ return {"error": f"spawn failed: {exc}"}
166
+
167
+ # The verdict is the last JSON line on stdout. Parse defensively — a native
168
+ # crash in the child would leave no JSON, which we surface plainly.
169
+ for line in reversed((proc.stdout or "").splitlines()):
170
+ line = line.strip()
171
+ if not line:
172
+ continue
173
+ try:
174
+ return json.loads(line)
175
+ except ValueError:
176
+ continue
177
+
178
+ tail = (proc.stderr or "").strip()[-500:]
179
+ return {
180
+ "error": (
181
+ f"subprocess produced no verdict (exit={proc.returncode}). "
182
+ f"stderr tail: {tail}"
183
+ ),
184
+ }
185
+
186
+
187
+ def run_retrain_isolated(
188
+ learning_db: str | Path,
189
+ profile_id: str,
190
+ *,
191
+ include_synthetic: bool = False,
192
+ timeout_sec: int = RETRAIN_TIMEOUT_SEC,
193
+ ) -> dict:
194
+ """Train the ranker in a subprocess. Returns ``{"trained": bool, "error": ...}``."""
195
+ args = [
196
+ "--task", "retrain",
197
+ "--learning-db", str(learning_db),
198
+ "--profile", profile_id,
199
+ ]
200
+ if include_synthetic:
201
+ args.append("--include-synthetic")
202
+ verdict = _run_isolated(args, timeout_sec=timeout_sec)
203
+ verdict.setdefault("trained", False)
204
+ verdict.setdefault("error", None)
205
+ return verdict
206
+
207
+
208
+ def run_consolidation_isolated(
209
+ memory_db: str | Path,
210
+ learning_db: str | Path,
211
+ profile_id: str,
212
+ *,
213
+ dry_run: bool = False,
214
+ timeout_sec: int = CONSOLIDATE_TIMEOUT_SEC,
215
+ ) -> dict:
216
+ """Run the full consolidation cycle in a subprocess (its step-5 training
217
+ would otherwise crash the torch-warm daemon).
218
+
219
+ Returns ``{"stats": dict|None, "error": str|None}``.
220
+ """
221
+ args = [
222
+ "--task", "consolidate",
223
+ "--memory-db", str(memory_db),
224
+ "--learning-db", str(learning_db),
225
+ "--profile", profile_id,
226
+ ]
227
+ if dry_run:
228
+ args.append("--dry-run")
229
+ verdict = _run_isolated(args, timeout_sec=timeout_sec)
230
+ verdict.setdefault("stats", None)
231
+ verdict.setdefault("error", None)
232
+ return verdict
233
+
234
+
235
+ if __name__ == "__main__":
236
+ raise SystemExit(main())
@@ -110,27 +110,45 @@ def register_core_tools(server, get_engine: Callable) -> None:
110
110
  Extracts atomic facts, resolves entities, builds graph edges,
111
111
  and indexes for 4-channel retrieval.
112
112
  """
113
+ meta = {
114
+ "project": project,
115
+ "importance": importance,
116
+ "agent_id": agent_id,
117
+ "session_id": session_id,
118
+ }
119
+ # v3.5.5 WRITE-THROUGH: route through the daemon's /remember, which does
120
+ # a synchronous verbatim insert (memory is keyword/BM25-recallable the
121
+ # instant this returns) and enqueues async enrichment. This closes the
122
+ # recall window so a parallel/next agent finds memories saved seconds ago.
123
+ # Falls back to pending.db only if the daemon is unreachable.
113
124
  try:
114
- # v3.4.32: Store-first pattern. Write to pending.db and return
115
- # immediately. The daemon's pending-materializer thread drains
116
- # the queue with recall priority, so concurrent MCP remembers
117
- # no longer contend with /search on the shared embedder.
118
- from superlocalmemory.cli.pending_store import store_pending
119
-
120
- pending_id = store_pending(content, tags=tags, metadata={
121
- "project": project,
122
- "importance": importance,
123
- "agent_id": agent_id,
124
- "session_id": session_id,
125
- })
125
+ from superlocalmemory.cli.daemon import daemon_request, is_daemon_running
126
+ if is_daemon_running():
127
+ resp = daemon_request("POST", "/remember", {
128
+ "content": content, "tags": tags, "metadata": meta,
129
+ })
130
+ if resp and (resp.get("fact_ids") is not None or resp.get("ok")):
131
+ fids = resp.get("fact_ids") or []
132
+ return {
133
+ "success": True,
134
+ "fact_ids": fids or [f"pending:{resp.get('pending_id','')}"],
135
+ "count": len(fids) if fids else 1,
136
+ "pending": not fids,
137
+ "message": "Stored (recallable now; enriching async).",
138
+ }
139
+ except Exception as dexc:
140
+ logger.debug("MCP remember via daemon failed, pending fallback: %s", dexc)
126
141
 
142
+ try:
143
+ from superlocalmemory.cli.pending_store import store_pending
144
+ pending_id = store_pending(content, tags=tags, metadata=meta)
127
145
  return {
128
146
  "success": True,
129
147
  "fact_ids": [f"pending:{pending_id}"],
130
148
  "count": 1,
131
149
  "pending": True,
132
150
  "pending_id": pending_id,
133
- "message": "Stored — facts will appear in the dashboard shortly.",
151
+ "message": "Stored — facts will appear shortly (daemon offline).",
134
152
  }
135
153
  except Exception as exc:
136
154
  logger.exception("remember failed")
@@ -15,6 +15,7 @@ from datetime import datetime, timezone
15
15
  from pathlib import Path
16
16
 
17
17
  from fastapi import APIRouter
18
+ from fastapi.concurrency import run_in_threadpool
18
19
 
19
20
  from .helpers import get_active_profile, MEMORY_DIR
20
21
 
@@ -597,16 +598,31 @@ async def learning_retrain(data: dict | None = None):
597
598
  data and data.get("include_synthetic")
598
599
  ) if isinstance(data, dict) else False
599
600
  try:
600
- from superlocalmemory.learning.consolidation_worker import (
601
- _retrain_ranker_impl,
601
+ # Train OUT OF PROCESS. The daemon already has torch's OpenMP runtime
602
+ # loaded with warm worker threads; importing lightgbm in-process loads
603
+ # a second libomp and SIGSEGVs the whole daemon (see
604
+ # retrain_subprocess module docstring). Isolation is the fix.
605
+ from superlocalmemory.learning.lightgbm_subprocess import (
606
+ run_retrain_isolated,
602
607
  )
603
608
  profile_id = get_active_profile() or "default"
604
- trained = _retrain_ranker_impl(
609
+ result = await run_in_threadpool(
610
+ run_retrain_isolated,
605
611
  LEARNING_DB,
606
612
  profile_id,
607
613
  include_synthetic=include_synthetic,
608
614
  )
609
- if trained:
615
+ if result.get("error"):
616
+ logger.error("learning_retrain failed: %s", result["error"])
617
+ return {"success": False, "error": result["error"]}
618
+ if result.get("trained"):
619
+ # Drop the cached model so the next recall reloads the freshly
620
+ # trained one the subprocess just persisted to learning.db.
621
+ try:
622
+ from superlocalmemory.learning.model_cache import invalidate
623
+ invalidate(profile_id)
624
+ except Exception as exc: # pragma: no cover — defensive
625
+ logger.debug("model cache invalidate failed: %s", exc)
610
626
  return {
611
627
  "success": True,
612
628
  "trained": True,
@@ -806,15 +806,37 @@ async def run_consolidation(request: Request):
806
806
  try:
807
807
  body = await request.json()
808
808
  dry_run = body.get("dry_run", False)
809
- from superlocalmemory.learning.consolidation_worker import ConsolidationWorker
809
+ # Run the full cycle OUT OF PROCESS. Step 5 trains the LightGBM ranker
810
+ # (online _run_shadow_cycle or legacy cold-start); importing lightgbm
811
+ # in the torch-warm daemon loads a second libomp and SIGSEGVs it (see
812
+ # lightgbm_subprocess module docstring). Isolation is the fix.
813
+ from superlocalmemory.learning.lightgbm_subprocess import (
814
+ run_consolidation_isolated,
815
+ )
810
816
  from superlocalmemory.core.config import SLMConfig
811
817
  from superlocalmemory.server.routes.helpers import DB_PATH
812
- worker = ConsolidationWorker(
813
- memory_db=str(DB_PATH),
814
- learning_db=str(DB_PATH.parent / "learning.db"),
815
- )
818
+ from fastapi.concurrency import run_in_threadpool
819
+
816
820
  config = SLMConfig.load()
817
- stats = worker.run(config.active_profile, dry_run=dry_run)
821
+ learning_db = DB_PATH.parent / "learning.db"
822
+ result = await run_in_threadpool(
823
+ run_consolidation_isolated,
824
+ str(DB_PATH),
825
+ str(learning_db),
826
+ config.active_profile,
827
+ dry_run=dry_run,
828
+ )
829
+ if result.get("error"):
830
+ return {"success": False, "error": result["error"]}
831
+ # Step-5 training may have promoted a new model — drop the daemon's
832
+ # cached model so the next recall reloads it from learning.db.
833
+ if not dry_run:
834
+ try:
835
+ from superlocalmemory.learning.model_cache import invalidate
836
+ invalidate(config.active_profile)
837
+ except Exception:
838
+ pass
839
+ stats = result.get("stats") or {}
818
840
  return {"success": True, **stats}
819
841
  except Exception as exc:
820
842
  return {"success": False, "error": str(exc)}
@@ -1582,14 +1582,28 @@ def _register_daemon_routes(application: FastAPI) -> None:
1582
1582
  extra = getattr(req, "metadata", None)
1583
1583
  if isinstance(extra, dict):
1584
1584
  meta.update(extra)
1585
+ # v3.5.5 WRITE-THROUGH: synchronous verbatim insert → the memory is
1586
+ # keyword/BM25-recallable the instant this returns (~ms). Closes the
1587
+ # recall window so a parallel/next agent finds memories saved seconds
1588
+ # ago. Embedding/graph enrichment is deferred to the materializer.
1589
+ fact_ids: list[str] = []
1590
+ try:
1591
+ fact_ids = engine.store_fast(req.content, metadata=meta)
1592
+ except Exception as fexc:
1593
+ logger.warning("store_fast failed, falling back to pending-only: %s", fexc)
1594
+ # Enqueue for async enrichment (embedding + entities + graph). The
1595
+ # materializer detects the already-inserted verbatim fact and enriches
1596
+ # it in place rather than duplicating.
1585
1597
  pending_id = store_pending(
1586
1598
  req.content, tags=req.tags or "", metadata=meta,
1587
1599
  )
1588
1600
  return {
1589
1601
  "ok": True,
1602
+ "fact_ids": fact_ids,
1603
+ "count": len(fact_ids),
1590
1604
  "pending_id": pending_id,
1591
- "status": "queued",
1592
- "note": "materialized async; pass ?wait=true for legacy sync",
1605
+ "status": "stored" if fact_ids else "queued",
1606
+ "note": "write-through: recallable now; enriching async",
1593
1607
  }
1594
1608
  except Exception as exc:
1595
1609
  raise HTTPException(500, detail=str(exc))
@@ -1816,14 +1830,36 @@ def _start_pending_materializer() -> None:
1816
1830
  try:
1817
1831
  import hashlib
1818
1832
  content = item["content"]
1819
- # Dedup: skip if identical content already stored.
1820
1833
  content_hash = hashlib.md5(content.encode()).hexdigest()
1834
+ # v3.5.5: the write-through path already inserted a
1835
+ # verbatim fact (recallable via BM25). If it lacks an
1836
+ # embedding, ENRICH it in place (compute embedding +
1837
+ # upsert vector store) rather than skipping — otherwise
1838
+ # the fact would never be semantically searchable.
1821
1839
  dup = engine._db.execute(
1822
- "SELECT 1 FROM atomic_facts WHERE "
1823
- "content = ? LIMIT 1",
1840
+ "SELECT fact_id, embedding FROM atomic_facts "
1841
+ "WHERE content = ? LIMIT 1",
1824
1842
  (content,),
1825
1843
  )
1826
1844
  if dup:
1845
+ try:
1846
+ row = dict(dup[0])
1847
+ if not row.get("embedding") and engine._embedder:
1848
+ emb = engine._embedder.embed(content)
1849
+ if emb:
1850
+ upd = {"embedding": emb}
1851
+ try:
1852
+ fm, fv = engine._embedder.compute_fisher_params(emb)
1853
+ upd["fisher_mean"] = fm
1854
+ upd["fisher_variance"] = fv
1855
+ except Exception:
1856
+ pass
1857
+ engine._db.update_fact(row["fact_id"], upd)
1858
+ vs = getattr(engine, "_vector_store", None)
1859
+ if vs and getattr(vs, "available", False):
1860
+ vs.upsert(row["fact_id"], engine._profile_id, emb)
1861
+ except Exception as eexc:
1862
+ logger.debug("enrichment of write-through fact failed: %s", eexc)
1827
1863
  mark_done(item["id"])
1828
1864
  continue
1829
1865
  import json as _json
@@ -1914,10 +1950,19 @@ def start_server(port: int = _DEFAULT_PORT) -> None:
1914
1950
  log_dir = Path.home() / ".superlocalmemory" / "logs"
1915
1951
  log_dir.mkdir(parents=True, exist_ok=True)
1916
1952
 
1953
+ # Bind address. `SLM_DAEMON_HOST` is the canonical name; `SLM_HOST` is
1954
+ # accepted as a shorter alias (issue #23). Set either to 0.0.0.0 to serve
1955
+ # a shared instance over a trusted private network (e.g. WireGuard mesh).
1956
+ bind_host = (
1957
+ os.environ.get("SLM_DAEMON_HOST")
1958
+ or os.environ.get("SLM_HOST")
1959
+ or "127.0.0.1"
1960
+ )
1961
+
1917
1962
  config = uvicorn.Config(
1918
1963
  app="superlocalmemory.server.unified_daemon:create_app",
1919
1964
  factory=True,
1920
- host=os.environ.get("SLM_DAEMON_HOST", "127.0.0.1"),
1965
+ host=bind_host,
1921
1966
  port=port,
1922
1967
  log_level="warning",
1923
1968
  timeout_graceful_shutdown=10,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.5.4
3
+ Version: 3.5.6
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
@@ -221,6 +221,7 @@ src/superlocalmemory/learning/forgetting_scheduler.py
221
221
  src/superlocalmemory/learning/hnsw_dedup.py
222
222
  src/superlocalmemory/learning/labeler.py
223
223
  src/superlocalmemory/learning/legacy_migration.py
224
+ src/superlocalmemory/learning/lightgbm_subprocess.py
224
225
  src/superlocalmemory/learning/memory_merge.py
225
226
  src/superlocalmemory/learning/model_cache.py
226
227
  src/superlocalmemory/learning/model_rollback.py