superlocalmemory 3.4.30__tar.gz → 3.4.32__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 (451) hide show
  1. {superlocalmemory-3.4.30/src/superlocalmemory.egg-info → superlocalmemory-3.4.32}/PKG-INFO +1 -1
  2. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/pyproject.toml +1 -1
  3. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/__init__.py +1 -1
  4. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/pending_store.py +55 -3
  5. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/maintenance_scheduler.py +8 -0
  6. superlocalmemory-3.4.32/src/superlocalmemory/core/recall_gate.py +36 -0
  7. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/signals.py +7 -1
  8. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/_pool_adapter.py +16 -4
  9. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_core.py +7 -34
  10. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/data_io.py +21 -2
  11. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/memories.py +99 -1
  12. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/stats.py +16 -2
  13. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/unified_daemon.py +117 -5
  14. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/index.html +35 -25
  15. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/core.js +20 -4
  16. superlocalmemory-3.4.32/src/superlocalmemory/ui/js/fact-detail.js +81 -0
  17. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/memories.js +34 -2
  18. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/modal.js +41 -2
  19. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/search.js +27 -0
  20. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32/src/superlocalmemory.egg-info}/PKG-INFO +1 -1
  21. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory.egg-info/SOURCES.txt +1 -0
  22. superlocalmemory-3.4.30/src/superlocalmemory/ui/js/fact-detail.js +0 -92
  23. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/AUTHORS.md +0 -0
  24. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/LICENSE +0 -0
  25. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/NOTICE +0 -0
  26. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/README.md +0 -0
  27. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/setup.cfg +0 -0
  28. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/attribution/__init__.py +0 -0
  29. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  30. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/attribution/signer.py +0 -0
  31. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/attribution/watermark.py +0 -0
  32. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/__init__.py +0 -0
  33. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/commands.py +0 -0
  34. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/context_commands.py +0 -0
  35. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/daemon.py +0 -0
  36. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/db_migrate.py +0 -0
  37. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  38. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  39. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  40. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/json_output.py +0 -0
  41. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/main.py +0 -0
  42. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  43. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/post_install.py +0 -0
  44. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/service_installer.py +0 -0
  45. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  46. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/version_banner.py +0 -0
  47. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  48. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/__init__.py +0 -0
  49. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  50. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  51. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  52. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  53. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  54. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  55. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  56. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/changes.py +0 -0
  57. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/communities.py +0 -0
  58. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/config.py +0 -0
  59. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/database.py +0 -0
  60. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  61. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  62. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  63. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/flows.py +0 -0
  64. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  65. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  66. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  67. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/incremental.py +0 -0
  68. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/models.py +0 -0
  69. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/parser.py +0 -0
  70. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/resolver.py +0 -0
  71. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/search.py +0 -0
  72. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/service.py +0 -0
  73. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/code_graph/watcher.py +0 -0
  74. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/__init__.py +0 -0
  75. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/abac.py +0 -0
  76. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/audit.py +0 -0
  77. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  78. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/gdpr.py +0 -0
  79. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  80. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/retention.py +0 -0
  81. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/compliance/scheduler.py +0 -0
  82. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/__init__.py +0 -0
  83. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/clock_monitor.py +0 -0
  84. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/config.py +0 -0
  85. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/consolidation_engine.py +0 -0
  86. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/context_cache.py +0 -0
  87. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/db_pool.py +0 -0
  88. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/embedding_worker.py +0 -0
  89. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/embeddings.py +0 -0
  90. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/engine.py +0 -0
  91. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  92. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/engine_lock.py +0 -0
  93. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/engine_wiring.py +0 -0
  94. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/error_catalog.py +0 -0
  95. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/error_envelope.py +0 -0
  96. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  97. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/file_lock.py +0 -0
  98. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  99. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/graph_pruner.py +0 -0
  100. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/health_monitor.py +0 -0
  101. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/hooks.py +0 -0
  102. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  103. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/maintenance.py +0 -0
  104. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/modes.py +0 -0
  105. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  106. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/platform_utils.py +0 -0
  107. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/priority_queue.py +0 -0
  108. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/profiles.py +0 -0
  109. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  110. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/ram_lock.py +0 -0
  111. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/rate_limit.py +0 -0
  112. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/recall_pipeline.py +0 -0
  113. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/recall_queue.py +0 -0
  114. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/recall_worker.py +0 -0
  115. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/registry.py +0 -0
  116. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/reranker_worker.py +0 -0
  117. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/safe_fs.py +0 -0
  118. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/security_primitives.py +0 -0
  119. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/shadow_router.py +0 -0
  120. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/slm_disabled.py +0 -0
  121. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/slmignore.py +0 -0
  122. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/store_pipeline.py +0 -0
  123. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/summarizer.py +0 -0
  124. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/tier_manager.py +0 -0
  125. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/topic_signature.py +0 -0
  126. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/core/worker_pool.py +0 -0
  127. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/dynamics/__init__.py +0 -0
  128. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  129. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  130. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  131. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  132. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/__init__.py +0 -0
  133. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  134. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  135. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/consolidator.py +0 -0
  136. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/context_generator.py +0 -0
  137. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/emotional.py +0 -0
  138. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  139. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  140. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  141. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/foresight.py +0 -0
  142. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  143. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  144. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  145. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  146. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  147. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  148. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/encoding/type_router.py +0 -0
  149. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/__init__.py +0 -0
  150. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  151. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/budget.py +0 -0
  152. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  153. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  154. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  155. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  156. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/triggers.py +0 -0
  157. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/evolution/types.py +0 -0
  158. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/__init__.py +0 -0
  159. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  160. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  161. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  162. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  163. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  164. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  165. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  166. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  167. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/context_payload.py +0 -0
  168. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  169. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  170. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  171. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  172. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  173. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  174. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  175. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  176. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  177. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/session_registry.py +0 -0
  178. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  179. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  180. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  181. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  182. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/__init__.py +0 -0
  183. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  184. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/backup.py +0 -0
  185. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/cache_manager.py +0 -0
  186. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  187. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/event_bus.py +0 -0
  188. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  189. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/pid_manager.py +0 -0
  190. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/process_reaper.py +0 -0
  191. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  192. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  193. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/__init__.py +0 -0
  194. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  195. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  196. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  197. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/credentials.py +0 -0
  198. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  199. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/parsers.py +0 -0
  200. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  201. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/__init__.py +0 -0
  202. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/adaptive.py +0 -0
  203. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  204. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  205. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/bandit.py +0 -0
  206. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  207. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/behavioral.py +0 -0
  208. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  209. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/bootstrap.py +0 -0
  210. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  211. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  212. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  213. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/cross_project.py +0 -0
  214. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/database.py +0 -0
  215. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  216. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/engagement.py +0 -0
  217. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/ensemble.py +0 -0
  218. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  219. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  220. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/features.py +0 -0
  221. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/feedback.py +0 -0
  222. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  223. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  224. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/labeler.py +0 -0
  225. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  226. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/memory_merge.py +0 -0
  227. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/model_cache.py +0 -0
  228. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/model_rollback.py +0 -0
  229. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  230. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/outcomes.py +0 -0
  231. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  232. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  233. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/project_context.py +0 -0
  234. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  235. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/ranker.py +0 -0
  236. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/ranker_common.py +0 -0
  237. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  238. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  239. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/reward.py +0 -0
  240. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/reward_archive.py +0 -0
  241. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/reward_boost.py +0 -0
  242. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  243. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/shadow_test.py +0 -0
  244. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/signal_worker.py +0 -0
  245. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  246. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/source_quality.py +0 -0
  247. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/trigram_index.py +0 -0
  248. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/learning/workflows.py +0 -0
  249. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/llm/__init__.py +0 -0
  250. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/llm/backbone.py +0 -0
  251. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/__init__.py +0 -0
  252. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  253. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/fisher.py +0 -0
  254. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  255. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/hopfield.py +0 -0
  256. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/langevin.py +0 -0
  257. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/polar_quant.py +0 -0
  258. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/qjl.py +0 -0
  259. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/sheaf.py +0 -0
  260. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/math/turbo_quant.py +0 -0
  261. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/__init__.py +0 -0
  262. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  263. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/resources.py +0 -0
  264. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/server.py +0 -0
  265. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/shared.py +0 -0
  266. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools.py +0 -0
  267. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_active.py +0 -0
  268. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  269. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_context.py +0 -0
  270. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  271. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  272. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  273. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  274. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  275. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  276. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mesh/__init__.py +0 -0
  277. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/mesh/broker.py +0 -0
  278. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/migrations/__init__.py +0 -0
  279. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  280. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/__init__.py +0 -0
  281. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  282. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  283. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  284. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  285. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  286. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/__init__.py +0 -0
  287. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/agentic.py +0 -0
  288. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  289. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  290. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  291. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  292. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/engine.py +0 -0
  293. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  294. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  295. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/fusion.py +0 -0
  296. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  297. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  298. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  299. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/reranker.py +0 -0
  300. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  301. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  302. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/strategy.py +0 -0
  303. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  304. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  305. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/__init__.py +0 -0
  306. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/api.py +0 -0
  307. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/bandit_loops.py +0 -0
  308. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  309. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  310. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/__init__.py +0 -0
  311. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/adapters.py +0 -0
  312. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/agents.py +0 -0
  313. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/backup.py +0 -0
  314. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  315. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/brain.py +0 -0
  316. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/chat.py +0 -0
  317. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/compliance.py +0 -0
  318. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/entity.py +0 -0
  319. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/events.py +0 -0
  320. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/evolution.py +0 -0
  321. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/helpers.py +0 -0
  322. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/ingest.py +0 -0
  323. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/insights.py +0 -0
  324. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/learning.py +0 -0
  325. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  326. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/mesh.py +0 -0
  327. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  328. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/profiles.py +0 -0
  329. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/tiers.py +0 -0
  330. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/timeline.py +0 -0
  331. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/token.py +0 -0
  332. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/v3_api.py +0 -0
  333. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/routes/ws.py +0 -0
  334. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/security_middleware.py +0 -0
  335. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/server/ui.py +0 -0
  336. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  337. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  338. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  339. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  340. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  341. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  342. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  343. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/__init__.py +0 -0
  344. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/access_control.py +0 -0
  345. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/access_log.py +0 -0
  346. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/database.py +0 -0
  347. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  348. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migration_runner.py +0 -0
  349. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migration_v33.py +0 -0
  350. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  351. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  352. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  353. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  354. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  355. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  356. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  357. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  358. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  359. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  360. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  361. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  362. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  363. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/migrations.py +0 -0
  364. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/models.py +0 -0
  365. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/quantized_store.py +0 -0
  366. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema.py +0 -0
  367. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  368. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_v32.py +0 -0
  369. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  370. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  371. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_v343.py +0 -0
  372. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/schema_v347.py +0 -0
  373. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  374. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/trust/__init__.py +0 -0
  375. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/trust/gate.py +0 -0
  376. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/trust/provenance.py +0 -0
  377. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/trust/scorer.py +0 -0
  378. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/trust/signals.py +0 -0
  379. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/css/brain.css +0 -0
  380. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  381. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  382. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/agents.js +0 -0
  383. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  384. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/brain.js +0 -0
  385. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/clusters.js +0 -0
  386. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/compliance.js +0 -0
  387. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  388. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/events.js +0 -0
  389. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/feedback.js +0 -0
  390. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  391. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  392. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  393. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  394. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/init.js +0 -0
  395. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  396. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  397. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/math-health.js +0 -0
  398. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  399. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  400. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  401. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  402. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  403. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  404. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  405. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  406. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/profiles.js +0 -0
  407. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  408. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  409. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/settings.js +0 -0
  410. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/timeline.js +0 -0
  411. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  412. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  413. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  414. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  415. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  416. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  417. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  418. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  419. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  420. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  421. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  422. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  423. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  424. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  425. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  426. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory.egg-info/requires.txt +0 -0
  427. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  428. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_auto_hooks.py +0 -0
  429. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_behavioral_full.py +0 -0
  430. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_claude_hooks.py +0 -0
  431. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_cli.py +0 -0
  432. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_cli_json.py +0 -0
  433. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_cli_v33.py +0 -0
  434. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_compliance_full.py +0 -0
  435. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_config_system.py +0 -0
  436. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_engine_hooks.py +0 -0
  437. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_event_bus.py +0 -0
  438. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_features.py +0 -0
  439. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_final_locomo_mini.py +0 -0
  440. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_hook_handlers.py +0 -0
  441. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_ide_connector.py +0 -0
  442. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_infra.py +0 -0
  443. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_learning_advanced.py +0 -0
  444. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_learning_collectors.py +0 -0
  445. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_llm_provider.py +0 -0
  446. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_mcp_server.py +0 -0
  447. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_migration.py +0 -0
  448. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_post_install.py +0 -0
  449. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_ranker.py +0 -0
  450. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/tests/test_trust_full.py +0 -0
  451. {superlocalmemory-3.4.30 → superlocalmemory-3.4.32}/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.30
3
+ Version: 3.4.32
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.4.30"
3
+ version = "3.4.32"
4
4
  description = "Information-geometric agent memory with mathematical guarantees"
5
5
  readme = "README.md"
6
6
  license = {text = "AGPL-3.0-or-later"}
@@ -1,3 +1,3 @@
1
1
  """SuperLocalMemory — information-geometric agent memory."""
2
2
 
3
- __version__ = "3.4.30"
3
+ __version__ = "3.4.32"
@@ -24,12 +24,21 @@ License: Elastic-2.0
24
24
  from __future__ import annotations
25
25
 
26
26
  import json
27
+ import os
27
28
  import sqlite3
28
29
  import time
29
30
  from pathlib import Path
30
31
 
31
- _DEFAULT_DIR = Path.home() / ".superlocalmemory"
32
+
33
+ def _default_dir() -> Path:
34
+ """Honor SLM_DATA_DIR so tests can isolate via tmp_path."""
35
+ return Path(os.environ.get("SLM_DATA_DIR") or Path.home() / ".superlocalmemory")
36
+
37
+
32
38
  _PENDING_DB = "pending.db"
39
+ _MAX_RETRIES = 3
40
+ _STUCK_DAYS = 7
41
+ _DEAD_LETTER_DAYS = 30
33
42
 
34
43
  _SCHEMA = """
35
44
  CREATE TABLE IF NOT EXISTS pending_memories (
@@ -47,7 +56,7 @@ CREATE TABLE IF NOT EXISTS pending_memories (
47
56
 
48
57
  def _get_db(base_dir: Path | None = None) -> sqlite3.Connection:
49
58
  """Open pending.db with WAL mode. Creates if needed."""
50
- d = base_dir or _DEFAULT_DIR
59
+ d = base_dir or _default_dir()
51
60
  d.mkdir(parents=True, exist_ok=True)
52
61
  db_path = d / _PENDING_DB
53
62
  conn = sqlite3.connect(str(db_path), timeout=5)
@@ -128,7 +137,7 @@ def mark_failed(row_id: int, error: str, base_dir: Path | None = None) -> None:
128
137
 
129
138
  def pending_count(base_dir: Path | None = None) -> int:
130
139
  """Count unprocessed pending memories."""
131
- d = base_dir or _DEFAULT_DIR
140
+ d = base_dir or _default_dir()
132
141
  db_path = d / _PENDING_DB
133
142
  if not db_path.exists():
134
143
  return 0
@@ -156,3 +165,46 @@ def cleanup_done(days: int = 7, base_dir: Path | None = None) -> int:
156
165
  return cur.rowcount
157
166
  finally:
158
167
  conn.close()
168
+
169
+
170
+ def cleanup_stale(base_dir: Path | None = None) -> dict[str, int]:
171
+ """Sweep stale rows from pending.db. Runs periodically from the daemon.
172
+
173
+ Removes:
174
+ - `done` rows older than 7 days (already processed)
175
+ - `failed` rows that exceeded max retries (moved to dead-letter via deletion)
176
+ - `pending` rows stuck more than 7 days (test pollution, crashed workers)
177
+ - Everything older than 30 days regardless of status (hard cap)
178
+ """
179
+ conn = _get_db(base_dir)
180
+ try:
181
+ done = conn.execute(
182
+ "DELETE FROM pending_memories WHERE status = 'done' "
183
+ "AND created_at < datetime('now', ?)",
184
+ (f"-{_STUCK_DAYS} days",),
185
+ ).rowcount
186
+ failed = conn.execute(
187
+ "DELETE FROM pending_memories WHERE status = 'failed' "
188
+ "AND retry_count >= ?",
189
+ (_MAX_RETRIES,),
190
+ ).rowcount
191
+ stuck = conn.execute(
192
+ "DELETE FROM pending_memories WHERE status = 'pending' "
193
+ "AND created_at < datetime('now', ?)",
194
+ (f"-{_STUCK_DAYS} days",),
195
+ ).rowcount
196
+ hard_cap = conn.execute(
197
+ "DELETE FROM pending_memories "
198
+ "WHERE created_at < datetime('now', ?)",
199
+ (f"-{_DEAD_LETTER_DAYS} days",),
200
+ ).rowcount
201
+ conn.commit()
202
+ return {
203
+ "done": done,
204
+ "failed_over_retries": failed,
205
+ "stuck_pending": stuck,
206
+ "hard_cap_expired": hard_cap,
207
+ "total": done + failed + stuck + hard_cap,
208
+ }
209
+ finally:
210
+ conn.close()
@@ -116,6 +116,14 @@ class MaintenanceScheduler:
116
116
  except Exception as exc:
117
117
  logger.debug("Auto-backup check skipped: %s", exc)
118
118
 
119
+ try:
120
+ from superlocalmemory.cli.pending_store import cleanup_stale
121
+ stats = cleanup_stale()
122
+ if stats["total"] > 0:
123
+ logger.info("Pending cleanup: %s", stats)
124
+ except Exception as exc:
125
+ logger.debug("Pending cleanup skipped: %s", exc)
126
+
119
127
  self._schedule_next()
120
128
 
121
129
  def _sync_cloud_destinations(self, manager: object) -> None:
@@ -0,0 +1,36 @@
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
+ """v3.4.32: Recall-in-flight counter used to give /search priority over the
6
+ pending materializer.
7
+
8
+ Every recall handler calls ``begin_recall()`` on entry and ``end_recall()``
9
+ in a finally block. The pending-memory materializer thread polls
10
+ ``in_flight()`` and sleeps while any recall is active, so the shared
11
+ embedder worker never serves a materialization ahead of a user-initiated
12
+ recall.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ import threading
17
+
18
+ _lock = threading.Lock()
19
+ _active = 0
20
+
21
+
22
+ def begin_recall() -> None:
23
+ global _active
24
+ with _lock:
25
+ _active += 1
26
+
27
+
28
+ def end_recall() -> None:
29
+ global _active
30
+ with _lock:
31
+ _active = max(0, _active - 1)
32
+
33
+
34
+ def in_flight() -> int:
35
+ with _lock:
36
+ return _active
@@ -141,12 +141,18 @@ def reset_counters() -> None:
141
141
 
142
142
 
143
143
  def _drain_queue_for_tests() -> None:
144
- """Drain the module queue — TEST-ONLY."""
144
+ """Drain the module queue — TEST-ONLY.
145
+
146
+ Swallows AttributeError so test harnesses that swap in a minimal
147
+ stub queue (e.g. exploding-queue fixtures) can still clean up.
148
+ """
145
149
  while True:
146
150
  try:
147
151
  _Q.get_nowait()
148
152
  except queue.Empty:
149
153
  return
154
+ except AttributeError:
155
+ return
150
156
 
151
157
 
152
158
  def queue_size() -> int:
@@ -110,12 +110,24 @@ def pool_recall(query: str, limit: int = 10, **_: Any) -> PoolRecallResponse:
110
110
 
111
111
 
112
112
  def pool_store(content: str, metadata: dict | None = None) -> list[str]:
113
- """Call pool.store and return the fact id list.
113
+ """Call pool.store and return fact id list (or pending tracker).
114
114
 
115
- Raises :class:`PoolError` on worker death or any non-ok envelope.
115
+ v3.4.32: the daemon /remember endpoint is async by default — it
116
+ returns ``pending_id`` and queues the write. We surface this to
117
+ callers as ``["pending:<id>"]`` so they have a stable identifier
118
+ without blocking the remember on the embedder worker.
119
+
120
+ Legacy synchronous path (``?wait=true``) still returns real
121
+ ``fact_ids``. Worker death raises :class:`PoolError`.
116
122
  """
117
123
  raw = _pool().store(content=content, metadata=metadata or {})
118
124
  _unwrap_error(raw, "store")
119
- if isinstance(raw, dict):
120
- return list(raw.get("fact_ids", []))
125
+ if not isinstance(raw, dict):
126
+ return []
127
+ fact_ids = raw.get("fact_ids")
128
+ if fact_ids:
129
+ return list(fact_ids)
130
+ pending_id = raw.get("pending_id")
131
+ if pending_id is not None:
132
+ return [f"pending:{pending_id}"]
121
133
  return []
@@ -113,12 +113,11 @@ def register_core_tools(server, get_engine: Callable) -> None:
113
113
  """
114
114
  import asyncio
115
115
  try:
116
- # V3.3.27: Store-first pattern write to pending.db immediately
117
- # (<100ms), then process through full pipeline in background.
118
- # This eliminates the 30-40s blocking that Mode B users experience.
119
- # Pending memories are auto-processed on next engine.initialize()
120
- # or by the daemon's background loop.
121
- from superlocalmemory.cli.pending_store import store_pending, mark_done
116
+ # v3.4.32: Store-first pattern. Write to pending.db and return
117
+ # immediately. The daemon's pending-materializer thread drains
118
+ # the queue with recall priority, so concurrent MCP remembers
119
+ # no longer contend with /search on the shared embedder.
120
+ from superlocalmemory.cli.pending_store import store_pending
122
121
 
123
122
  pending_id = store_pending(content, tags=tags, metadata={
124
123
  "project": project,
@@ -127,39 +126,13 @@ def register_core_tools(server, get_engine: Callable) -> None:
127
126
  "session_id": session_id,
128
127
  })
129
128
 
130
- # Fire-and-forget: process in background thread
131
- async def _process_in_background():
132
- try:
133
- from superlocalmemory.core.worker_pool import WorkerPool
134
- pool = WorkerPool.shared()
135
- result = await asyncio.to_thread(
136
- pool.store, content, metadata={
137
- "tags": tags, "project": project,
138
- "importance": importance, "agent_id": agent_id,
139
- "session_id": session_id,
140
- },
141
- )
142
- if result.get("ok"):
143
- mark_done(pending_id)
144
- _emit_event("memory.created", {
145
- "content_preview": content[:80],
146
- "agent_id": agent_id,
147
- "fact_count": result.get("count", 0),
148
- }, source_agent=agent_id)
149
- except Exception as _bg_exc:
150
- logger.warning(
151
- "Background store failed (pending_id=%s): %s",
152
- pending_id, _bg_exc,
153
- )
154
-
155
- asyncio.create_task(_process_in_background())
156
-
157
129
  return {
158
130
  "success": True,
159
131
  "fact_ids": [f"pending:{pending_id}"],
160
132
  "count": 1,
161
133
  "pending": True,
162
- "message": "Stored to pending — processing in background.",
134
+ "pending_id": pending_id,
135
+ "message": "Stored — facts will appear in the dashboard shortly.",
163
136
  }
164
137
  except Exception as exc:
165
138
  logger.exception("remember failed")
@@ -28,11 +28,11 @@ router = APIRouter()
28
28
 
29
29
  @router.get("/api/export")
30
30
  async def export_memories(
31
- format: str = Query("json", pattern="^(json|jsonl)$"),
31
+ format: str = Query("json", pattern="^(json|jsonl|csv)$"),
32
32
  category: Optional[str] = None,
33
33
  project_name: Optional[str] = None,
34
34
  ):
35
- """Export memories as JSON or JSONL."""
35
+ """Export memories as JSON, JSONL, or CSV."""
36
36
  try:
37
37
  conn = get_db_connection()
38
38
  conn.row_factory = dict_factory
@@ -76,6 +76,25 @@ async def export_memories(
76
76
  if format == "jsonl":
77
77
  content = "\n".join(json.dumps(m) for m in memories)
78
78
  media_type = "application/x-ndjson"
79
+ elif format == "csv":
80
+ import csv
81
+ import io as _io
82
+ if memories:
83
+ buf = _io.StringIO()
84
+ fieldnames = list(memories[0].keys())
85
+ writer = csv.DictWriter(
86
+ buf, fieldnames=fieldnames, extrasaction="ignore",
87
+ )
88
+ writer.writeheader()
89
+ for m in memories:
90
+ writer.writerow({
91
+ k: (json.dumps(v) if isinstance(v, (dict, list)) else v)
92
+ for k, v in m.items()
93
+ })
94
+ content = buf.getvalue()
95
+ else:
96
+ content = ""
97
+ media_type = "text/csv"
79
98
  else:
80
99
  content = json.dumps({
81
100
  "version": "3.0.0",
@@ -398,7 +398,12 @@ async def get_graph(
398
398
 
399
399
  @router.post("/api/search")
400
400
  async def search_memories(request: Request, body: SearchRequest):
401
- """Semantic search via subprocess worker pool (memory-isolated)."""
401
+ """Semantic search via subprocess worker pool (memory-isolated).
402
+
403
+ v3.4.32: marks recall in-flight so the pending materializer yields.
404
+ """
405
+ from superlocalmemory.core.recall_gate import begin_recall, end_recall
406
+ begin_recall()
402
407
  try:
403
408
  from superlocalmemory.core.worker_pool import WorkerPool
404
409
  pool = WorkerPool.shared()
@@ -435,6 +440,8 @@ async def search_memories(request: Request, body: SearchRequest):
435
440
 
436
441
  except Exception as e:
437
442
  raise HTTPException(status_code=500, detail=f"Search error: {str(e)}")
443
+ finally:
444
+ end_recall()
438
445
 
439
446
 
440
447
  @router.get("/api/clusters")
@@ -607,6 +614,97 @@ async def get_memory_facts(request: Request, memory_id: str):
607
614
  raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
608
615
 
609
616
 
617
+ @router.get("/api/memories/{memory_id}/detail")
618
+ async def get_memory_detail(request: Request, memory_id: str):
619
+ """Full memory row + all child atomic facts (for dashboard modal)."""
620
+ try:
621
+ conn = get_db_connection()
622
+ conn.row_factory = dict_factory
623
+ cursor = conn.cursor()
624
+ active_profile = get_active_profile()
625
+
626
+ cursor.execute(
627
+ "SELECT memory_id, content, session_id, speaker, role, "
628
+ "session_date, created_at, metadata_json "
629
+ "FROM memories WHERE memory_id = ? AND profile_id = ?",
630
+ (memory_id, active_profile),
631
+ )
632
+ mem = cursor.fetchone()
633
+ if not mem:
634
+ conn.close()
635
+ raise HTTPException(status_code=404, detail="Memory not found")
636
+
637
+ cursor.execute(
638
+ "SELECT fact_id, content, fact_type, confidence, importance, "
639
+ "access_count, created_at, entities_json "
640
+ "FROM atomic_facts WHERE memory_id = ? AND profile_id = ? "
641
+ "ORDER BY created_at ASC",
642
+ (memory_id, active_profile),
643
+ )
644
+ facts = cursor.fetchall()
645
+ conn.close()
646
+
647
+ try:
648
+ mem["metadata"] = json.loads(mem.pop("metadata_json") or "{}")
649
+ except Exception:
650
+ mem["metadata"] = {}
651
+ for f in facts:
652
+ try:
653
+ f["entities"] = json.loads(f.pop("entities_json") or "[]")
654
+ except Exception:
655
+ f["entities"] = []
656
+
657
+ return {
658
+ "memory": mem,
659
+ "facts": facts,
660
+ "fact_count": len(facts),
661
+ }
662
+ except HTTPException:
663
+ raise
664
+ except Exception as e:
665
+ raise HTTPException(status_code=500, detail=f"Detail error: {str(e)}")
666
+
667
+
668
+ @router.get("/api/facts/{fact_id}")
669
+ async def get_fact_detail(request: Request, fact_id: str):
670
+ """Single atomic fact detail (for fact popup)."""
671
+ try:
672
+ conn = get_db_connection()
673
+ conn.row_factory = dict_factory
674
+ cursor = conn.cursor()
675
+ active_profile = get_active_profile()
676
+
677
+ cursor.execute(
678
+ "SELECT f.fact_id, f.memory_id, f.content, f.fact_type, "
679
+ "f.confidence, f.importance, f.access_count, f.created_at, "
680
+ "f.entities_json, f.canonical_entities_json, f.session_id, "
681
+ "m.content AS source_memory_content "
682
+ "FROM atomic_facts f "
683
+ "LEFT JOIN memories m ON f.memory_id = m.memory_id "
684
+ "WHERE f.fact_id = ? AND f.profile_id = ?",
685
+ (fact_id, active_profile),
686
+ )
687
+ row = cursor.fetchone()
688
+ conn.close()
689
+ if not row:
690
+ raise HTTPException(status_code=404, detail="Fact not found")
691
+ try:
692
+ row["entities"] = json.loads(row.pop("entities_json") or "[]")
693
+ except Exception:
694
+ row["entities"] = []
695
+ try:
696
+ row["canonical_entities"] = json.loads(
697
+ row.pop("canonical_entities_json") or "[]"
698
+ )
699
+ except Exception:
700
+ row["canonical_entities"] = []
701
+ return row
702
+ except HTTPException:
703
+ raise
704
+ except Exception as e:
705
+ raise HTTPException(status_code=500, detail=f"Fact detail error: {str(e)}")
706
+
707
+
610
708
  @router.delete("/api/memories/{fact_id}")
611
709
  async def delete_memory(request: Request, fact_id: str):
612
710
  """Delete a specific memory (atomic fact) by ID."""
@@ -40,6 +40,12 @@ async def get_stats():
40
40
  "SELECT COUNT(*) as total FROM atomic_facts WHERE profile_id = ?",
41
41
  (active_profile,),
42
42
  )
43
+ total_facts = cursor.fetchone()['total']
44
+
45
+ cursor.execute(
46
+ "SELECT COUNT(*) as total FROM memories WHERE profile_id = ?",
47
+ (active_profile,),
48
+ )
43
49
  total_memories = cursor.fetchone()['total']
44
50
 
45
51
  total_sessions = 0
@@ -52,7 +58,7 @@ async def get_stats():
52
58
  except Exception:
53
59
  pass
54
60
 
55
- total_graph_nodes = total_memories
61
+ total_graph_nodes = total_facts
56
62
  total_graph_edges = 0
57
63
  try:
58
64
  cursor.execute(
@@ -121,12 +127,13 @@ async def get_stats():
121
127
  importance_dist = []
122
128
 
123
129
  else:
124
- # V2 fallback
130
+ # V2 fallback — no atomic_facts; facts == memories
125
131
  cursor.execute(
126
132
  "SELECT COUNT(*) as total FROM memories WHERE profile = ?",
127
133
  (active_profile,),
128
134
  )
129
135
  total_memories = cursor.fetchone()['total']
136
+ total_facts = total_memories
130
137
 
131
138
  try:
132
139
  cursor.execute("SELECT COUNT(*) as total FROM sessions")
@@ -201,9 +208,16 @@ async def get_stats():
201
208
 
202
209
  conn.close()
203
210
 
211
+ facts_per_memory = (
212
+ round(total_facts / total_memories, 1)
213
+ if total_memories > 0 else 0.0
214
+ )
215
+
204
216
  return {
205
217
  "overview": {
206
218
  "total_memories": total_memories,
219
+ "total_facts": total_facts,
220
+ "facts_per_memory": facts_per_memory,
207
221
  "total_sessions": total_sessions,
208
222
  "total_clusters": total_clusters,
209
223
  "graph_nodes": total_graph_nodes,
@@ -66,6 +66,20 @@ class ObserveRequest(BaseModel):
66
66
  content: str
67
67
 
68
68
 
69
+ # ---------------------------------------------------------------------------
70
+ # v3.4.32: Recall-priority gate for the pending materializer.
71
+ # All /remember writes go to pending.db and return fast; a background
72
+ # thread drains pending while yielding to any in-flight /search.
73
+ # See ``superlocalmemory.core.recall_gate``.
74
+ # ---------------------------------------------------------------------------
75
+
76
+ from superlocalmemory.core.recall_gate import (
77
+ begin_recall as _begin_recall,
78
+ end_recall as _end_recall,
79
+ in_flight as _recalls_in_flight,
80
+ )
81
+
82
+
69
83
  # ---------------------------------------------------------------------------
70
84
  # Observation debounce buffer (migrated from daemon.py)
71
85
  # ---------------------------------------------------------------------------
@@ -949,6 +963,8 @@ def _register_daemon_routes(application: FastAPI) -> None:
949
963
  if not effective_sid:
950
964
  import time as _t
951
965
  effective_sid = f"http:{int(_t.time() * 1000)}"
966
+ # v3.4.32: mark recall in-flight so the pending materializer pauses
967
+ _begin_recall()
952
968
  try:
953
969
  response = engine.recall(
954
970
  search_query, limit=limit, session_id=effective_sid,
@@ -1006,18 +1022,47 @@ def _register_daemon_routes(application: FastAPI) -> None:
1006
1022
  }
1007
1023
  except Exception as exc:
1008
1024
  raise HTTPException(500, detail=str(exc))
1025
+ finally:
1026
+ _end_recall()
1009
1027
 
1010
1028
  @application.post("/remember")
1011
- async def remember(req: RememberRequest):
1029
+ async def remember(req: RememberRequest, wait: bool = False):
1030
+ """v3.4.32: Async by default — writes to pending.db, returns pending_id
1031
+ in <100ms. Materializer thread drains at low priority, yielding to
1032
+ /search. Pass ``?wait=true`` for legacy synchronous behavior (blocks
1033
+ on the embedder until facts are written).
1034
+ """
1012
1035
  _update_activity()
1013
1036
  engine = _get_engine_or_503()
1037
+
1038
+ if wait:
1039
+ try:
1040
+ metadata = {"tags": req.tags} if req.tags else {}
1041
+ extra = getattr(req, "metadata", None)
1042
+ if isinstance(extra, dict):
1043
+ metadata.update(extra)
1044
+ fact_ids = engine.store(req.content, metadata=metadata)
1045
+ return {"ok": True, "fact_ids": fact_ids, "count": len(fact_ids)}
1046
+ except Exception as exc:
1047
+ raise HTTPException(500, detail=str(exc))
1048
+
1014
1049
  try:
1015
- metadata = {"tags": req.tags} if req.tags else {}
1050
+ from superlocalmemory.cli.pending_store import store_pending
1051
+ meta = {}
1052
+ if req.tags:
1053
+ meta["tags"] = req.tags
1016
1054
  extra = getattr(req, "metadata", None)
1017
1055
  if isinstance(extra, dict):
1018
- metadata.update(extra)
1019
- fact_ids = engine.store(req.content, metadata=metadata)
1020
- return {"ok": True, "fact_ids": fact_ids, "count": len(fact_ids)}
1056
+ meta.update(extra)
1057
+ pending_id = store_pending(
1058
+ req.content, tags=req.tags or "", metadata=meta,
1059
+ )
1060
+ return {
1061
+ "ok": True,
1062
+ "pending_id": pending_id,
1063
+ "status": "queued",
1064
+ "note": "materialized async; pass ?wait=true for legacy sync",
1065
+ }
1021
1066
  except Exception as exc:
1022
1067
  raise HTTPException(500, detail=str(exc))
1023
1068
 
@@ -1189,6 +1234,70 @@ def _start_memory_watchdog() -> None:
1189
1234
  logger.info("Memory watchdog started (limit: %d MB per worker)", MAX_WORKER_MB)
1190
1235
 
1191
1236
 
1237
+ _materializer_stop = threading.Event()
1238
+ _materializer_thread: threading.Thread | None = None
1239
+
1240
+
1241
+ def _start_pending_materializer() -> None:
1242
+ """Background thread: drains pending.db, yields to active /search calls.
1243
+
1244
+ Poll loop:
1245
+ 1. Fetch up to 5 pending rows.
1246
+ 2. For each row: if any /search is in flight, sleep 500ms (yield priority).
1247
+ 3. Call engine.store(), mark_done or mark_failed.
1248
+ 4. Sleep 2s between polls when idle (empty queue).
1249
+ """
1250
+ global _materializer_thread
1251
+
1252
+ def _loop():
1253
+ from superlocalmemory.cli.pending_store import (
1254
+ get_pending, mark_done, mark_failed,
1255
+ )
1256
+ while not _materializer_stop.is_set():
1257
+ try:
1258
+ engine = _engine # may be None briefly at startup
1259
+ if engine is None:
1260
+ time.sleep(2.0)
1261
+ continue
1262
+ pending = get_pending(limit=5)
1263
+ if not pending:
1264
+ time.sleep(2.0)
1265
+ continue
1266
+ for item in pending:
1267
+ if _materializer_stop.is_set():
1268
+ break
1269
+ # Yield to recalls: wait until none in flight
1270
+ waits = 0
1271
+ while _recalls_in_flight() > 0 and waits < 60:
1272
+ time.sleep(0.5)
1273
+ waits += 1
1274
+ try:
1275
+ import json as _json
1276
+ md_str = item.get("metadata") or "{}"
1277
+ try:
1278
+ md = _json.loads(md_str)
1279
+ except Exception:
1280
+ md = {}
1281
+ if item.get("tags"):
1282
+ md.setdefault("tags", item["tags"])
1283
+ engine.store(item["content"], metadata=md)
1284
+ mark_done(item["id"])
1285
+ except Exception as exc:
1286
+ logger.warning(
1287
+ "Pending %d failed: %s", item["id"], exc,
1288
+ )
1289
+ mark_failed(item["id"], str(exc))
1290
+ except Exception as exc:
1291
+ logger.warning("materializer loop error: %s", exc)
1292
+ time.sleep(5.0)
1293
+
1294
+ _materializer_thread = threading.Thread(
1295
+ target=_loop, daemon=True, name="pending-materializer",
1296
+ )
1297
+ _materializer_thread.start()
1298
+ logger.info("Pending materializer started (recall-priority)")
1299
+
1300
+
1192
1301
  def start_server(port: int = _DEFAULT_PORT) -> None:
1193
1302
  """Start the unified daemon. Blocks until stopped."""
1194
1303
  global _start_time
@@ -1223,6 +1332,9 @@ def start_server(port: int = _DEFAULT_PORT) -> None:
1223
1332
  # v3.4.7: Start memory watchdog to prevent runaway workers
1224
1333
  _start_memory_watchdog()
1225
1334
 
1335
+ # v3.4.32: Continuous pending-queue materializer with recall priority.
1336
+ _start_pending_materializer()
1337
+
1226
1338
  log_dir = Path.home() / ".superlocalmemory" / "logs"
1227
1339
  log_dir.mkdir(parents=True, exist_ok=True)
1228
1340