superlocalmemory 3.6.3__tar.gz → 3.6.4__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 (524) hide show
  1. {superlocalmemory-3.6.3/src/superlocalmemory.egg-info → superlocalmemory-3.6.4}/PKG-INFO +1 -1
  2. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/pyproject.toml +1 -1
  3. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/consolidation_engine.py +8 -0
  4. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine.py +6 -1
  5. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/fact_consolidator.py +54 -13
  6. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/graph_pruner.py +55 -19
  7. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/maintenance.py +9 -0
  8. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/store_pipeline.py +120 -51
  9. superlocalmemory-3.6.4/src/superlocalmemory/mcp/_stdin_guard.py +60 -0
  10. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/server.py +34 -5
  11. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/engine.py +17 -6
  12. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/entity_channel.py +10 -1
  13. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/hopfield_channel.py +3 -1
  14. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/database.py +113 -9
  15. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4/src/superlocalmemory.egg-info}/PKG-INFO +1 -1
  16. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/SOURCES.txt +2 -0
  17. superlocalmemory-3.6.4/tests/test_graph_integrity.py +135 -0
  18. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_injection.py +10 -0
  19. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/AUTHORS.md +0 -0
  20. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/LICENSE +0 -0
  21. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/NOTICE +0 -0
  22. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/README.md +0 -0
  23. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/setup.cfg +0 -0
  24. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/__init__.py +0 -0
  25. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/__init__.py +0 -0
  26. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  27. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/signer.py +0 -0
  28. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/attribution/watermark.py +0 -0
  29. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/__init__.py +0 -0
  30. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/cache_cmd.py +0 -0
  31. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/commands.py +0 -0
  32. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/compress_cmd.py +0 -0
  33. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/context_commands.py +0 -0
  34. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/daemon.py +0 -0
  35. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/db_migrate.py +0 -0
  36. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  37. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  38. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/help_cmd.py +0 -0
  39. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  40. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/json_output.py +0 -0
  41. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/main.py +0 -0
  42. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  43. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
  44. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/optimize_constants.py +0 -0
  45. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/pending_store.py +0 -0
  46. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/post_install.py +0 -0
  47. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
  48. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/service_installer.py +0 -0
  49. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  50. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/version_banner.py +0 -0
  51. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  52. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/__init__.py +0 -0
  53. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  54. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  55. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  56. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  57. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  58. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  59. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  60. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/changes.py +0 -0
  61. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/communities.py +0 -0
  62. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/config.py +0 -0
  63. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/database.py +0 -0
  64. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  65. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  66. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  67. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/flows.py +0 -0
  68. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  69. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  70. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  71. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/incremental.py +0 -0
  72. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/models.py +0 -0
  73. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/parser.py +0 -0
  74. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/resolver.py +0 -0
  75. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/search.py +0 -0
  76. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/service.py +0 -0
  77. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/code_graph/watcher.py +0 -0
  78. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/__init__.py +0 -0
  79. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/abac.py +0 -0
  80. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/audit.py +0 -0
  81. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  82. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/gdpr.py +0 -0
  83. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  84. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/retention.py +0 -0
  85. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/compliance/scheduler.py +0 -0
  86. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/__init__.py +0 -0
  87. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
  88. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/clock_monitor.py +0 -0
  89. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/config.py +0 -0
  90. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/context_cache.py +0 -0
  91. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/db_pool.py +0 -0
  92. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/embedding_worker.py +0 -0
  93. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/embeddings.py +0 -0
  94. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  95. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_lock.py +0 -0
  96. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/engine_wiring.py +0 -0
  97. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/error_catalog.py +0 -0
  98. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/error_envelope.py +0 -0
  99. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/file_lock.py +0 -0
  100. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  101. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/health_monitor.py +0 -0
  102. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/hooks.py +0 -0
  103. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/injection.py +0 -0
  104. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  105. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
  106. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
  107. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/modes.py +0 -0
  108. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  109. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/platform_utils.py +0 -0
  110. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/priority_queue.py +0 -0
  111. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/profiles.py +0 -0
  112. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/pruning_engine.py +0 -0
  113. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/queue_consumer.py +0 -0
  114. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  115. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/ram_lock.py +0 -0
  116. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/rate_limit.py +0 -0
  117. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_gate.py +0 -0
  118. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_pipeline.py +0 -0
  119. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_queue.py +0 -0
  120. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/recall_worker.py +0 -0
  121. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/registry.py +0 -0
  122. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/reranker_worker.py +0 -0
  123. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/safe_fs.py +0 -0
  124. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/security_primitives.py +0 -0
  125. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/shadow_router.py +0 -0
  126. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/slm_disabled.py +0 -0
  127. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/slmignore.py +0 -0
  128. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/summarizer.py +0 -0
  129. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/tier_manager.py +0 -0
  130. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/topic_signature.py +0 -0
  131. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/core/worker_pool.py +0 -0
  132. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/__init__.py +0 -0
  133. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  134. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  135. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  136. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  137. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/__init__.py +0 -0
  138. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  139. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  140. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/consolidator.py +0 -0
  141. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/context_generator.py +0 -0
  142. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/emotional.py +0 -0
  143. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  144. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  145. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  146. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/foresight.py +0 -0
  147. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  148. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  149. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  150. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  151. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  152. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  153. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/encoding/type_router.py +0 -0
  154. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/__init__.py +0 -0
  155. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  156. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/budget.py +0 -0
  157. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  158. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  159. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  160. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  161. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/triggers.py +0 -0
  162. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/evolution/types.py +0 -0
  163. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/graph/__init__.py +0 -0
  164. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  165. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/__init__.py +0 -0
  166. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  167. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  168. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  169. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  170. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  171. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  172. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  173. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  174. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
  175. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  176. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/context_payload.py +0 -0
  177. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  178. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  179. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  180. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  181. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  182. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  183. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  184. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  185. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  186. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  187. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/session_registry.py +0 -0
  188. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  189. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  190. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  191. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  192. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  193. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/__init__.py +0 -0
  194. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  195. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/backup.py +0 -0
  196. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/cache_manager.py +0 -0
  197. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  198. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/event_bus.py +0 -0
  199. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  200. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/pid_manager.py +0 -0
  201. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/process_reaper.py +0 -0
  202. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  203. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  204. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/__init__.py +0 -0
  205. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  206. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  207. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  208. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/credentials.py +0 -0
  209. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  210. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/parsers.py +0 -0
  211. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  212. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/__init__.py +0 -0
  213. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/adaptive.py +0 -0
  214. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  215. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  216. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bandit.py +0 -0
  217. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  218. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/behavioral.py +0 -0
  219. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  220. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/bootstrap.py +0 -0
  221. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  222. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  223. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  224. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/cross_project.py +0 -0
  225. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/database.py +0 -0
  226. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  227. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/engagement.py +0 -0
  228. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ensemble.py +0 -0
  229. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  230. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  231. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/features.py +0 -0
  232. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/feedback.py +0 -0
  233. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  234. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  235. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/labeler.py +0 -0
  236. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  237. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
  238. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/memory_merge.py +0 -0
  239. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/model_cache.py +0 -0
  240. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/model_rollback.py +0 -0
  241. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  242. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/outcomes.py +0 -0
  243. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  244. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  245. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/project_context.py +0 -0
  246. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  247. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker.py +0 -0
  248. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_common.py +0 -0
  249. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  250. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  251. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward.py +0 -0
  252. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_archive.py +0 -0
  253. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_boost.py +0 -0
  254. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  255. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/shadow_test.py +0 -0
  256. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/signal_worker.py +0 -0
  257. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/signals.py +0 -0
  258. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  259. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/source_quality.py +0 -0
  260. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/trigram_index.py +0 -0
  261. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/learning/workflows.py +0 -0
  262. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/llm/__init__.py +0 -0
  263. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/llm/backbone.py +0 -0
  264. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/__init__.py +0 -0
  265. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  266. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/fisher.py +0 -0
  267. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  268. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/hopfield.py +0 -0
  269. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/langevin.py +0 -0
  270. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/polar_quant.py +0 -0
  271. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/qjl.py +0 -0
  272. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/sheaf.py +0 -0
  273. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/math/turbo_quant.py +0 -0
  274. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/__init__.py +0 -0
  275. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  276. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  277. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/resources.py +0 -0
  278. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/shared.py +0 -0
  279. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools.py +0 -0
  280. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_active.py +0 -0
  281. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  282. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_context.py +0 -0
  283. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_core.py +0 -0
  284. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  285. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  286. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  287. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  288. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  289. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  290. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/__init__.py +0 -0
  291. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/broker.py +0 -0
  292. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  293. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/migrations/__init__.py +0 -0
  294. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  295. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/__init__.py +0 -0
  296. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
  297. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
  298. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
  299. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
  300. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
  301. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
  302. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
  303. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
  304. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
  305. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/exact.py +0 -0
  306. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
  307. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
  308. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/manager.py +0 -0
  309. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
  310. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
  311. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
  312. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/align.py +0 -0
  313. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
  314. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/extractive_code.py +0 -0
  315. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/extractive_json.py +0 -0
  316. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
  317. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/compress/router.py +0 -0
  318. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/__init__.py +0 -0
  319. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/defaults.py +0 -0
  320. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/schema.py +0 -0
  321. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/config/store.py +0 -0
  322. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
  323. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
  324. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
  325. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
  326. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
  327. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
  328. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
  329. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
  330. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
  331. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
  332. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
  333. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/proxy/server.py +0 -0
  334. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
  335. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/db.py +0 -0
  336. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/optimize/storage/schema.py +0 -0
  337. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/__init__.py +0 -0
  338. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  339. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  340. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  341. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  342. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  343. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/__init__.py +0 -0
  344. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/agentic.py +0 -0
  345. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  346. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  347. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  348. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  349. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  350. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/fusion.py +0 -0
  351. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  352. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  353. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/reranker.py +0 -0
  354. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  355. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  356. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/strategy.py +0 -0
  357. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  358. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  359. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/__init__.py +0 -0
  360. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/api.py +0 -0
  361. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/bandit_loops.py +0 -0
  362. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  363. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  364. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/__init__.py +0 -0
  365. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/adapters.py +0 -0
  366. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/agents.py +0 -0
  367. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/backup.py +0 -0
  368. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  369. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/brain.py +0 -0
  370. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/chat.py +0 -0
  371. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/compliance.py +0 -0
  372. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/data_io.py +0 -0
  373. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/entity.py +0 -0
  374. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/events.py +0 -0
  375. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/evolution.py +0 -0
  376. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/helpers.py +0 -0
  377. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/ingest.py +0 -0
  378. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/insights.py +0 -0
  379. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/learning.py +0 -0
  380. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  381. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/memories.py +0 -0
  382. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/mesh.py +0 -0
  383. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/optimize.py +0 -0
  384. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  385. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/profiles.py +0 -0
  386. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/stats.py +0 -0
  387. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/tiers.py +0 -0
  388. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/timeline.py +0 -0
  389. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/token.py +0 -0
  390. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/v3_api.py +0 -0
  391. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/routes/ws.py +0 -0
  392. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/security_middleware.py +0 -0
  393. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/ui.py +0 -0
  394. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/server/unified_daemon.py +0 -0
  395. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  396. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  397. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  398. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  399. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  400. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  401. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  402. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/__init__.py +0 -0
  403. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/access_control.py +0 -0
  404. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/access_log.py +0 -0
  405. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  406. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migration_runner.py +0 -0
  407. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migration_v33.py +0 -0
  408. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  409. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  410. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  411. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  412. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  413. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  414. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  415. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  416. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  417. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  418. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  419. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  420. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  421. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
  422. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  423. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/migrations.py +0 -0
  424. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/models.py +0 -0
  425. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/quantized_store.py +0 -0
  426. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema.py +0 -0
  427. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  428. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v32.py +0 -0
  429. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  430. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  431. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v343.py +0 -0
  432. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v345.py +0 -0
  433. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/schema_v347.py +0 -0
  434. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  435. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/__init__.py +0 -0
  436. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/gate.py +0 -0
  437. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/provenance.py +0 -0
  438. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/scorer.py +0 -0
  439. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/trust/signals.py +0 -0
  440. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/brain.css +0 -0
  441. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  442. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  443. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/index.html +0 -0
  444. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/agents.js +0 -0
  445. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  446. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/brain.js +0 -0
  447. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/clusters.js +0 -0
  448. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/compliance.js +0 -0
  449. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/core.js +0 -0
  450. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  451. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/events.js +0 -0
  452. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  453. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/feedback.js +0 -0
  454. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  455. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  456. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  457. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  458. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/init.js +0 -0
  459. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  460. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  461. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/math-health.js +0 -0
  462. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memories.js +0 -0
  463. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  464. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  465. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/modal.js +0 -0
  466. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  467. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  468. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  469. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  470. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  471. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  472. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/optimize.js +0 -0
  473. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/profiles.js +0 -0
  474. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  475. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  476. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/search.js +0 -0
  477. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/settings.js +0 -0
  478. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/timeline.js +0 -0
  479. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  480. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  481. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  482. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  483. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  484. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  485. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  486. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  487. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  488. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  489. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  490. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  491. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  492. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/vector/__init__.py +0 -0
  493. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  494. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  495. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  496. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/requires.txt +0 -0
  497. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  498. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_auto_hooks.py +0 -0
  499. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_before_web_hook.py +0 -0
  500. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_behavioral_full.py +0 -0
  501. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_claude_hooks.py +0 -0
  502. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_core.py +0 -0
  503. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_json.py +0 -0
  504. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_cli_v33.py +0 -0
  505. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_compliance_full.py +0 -0
  506. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_config_system.py +0 -0
  507. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_engine_hooks.py +0 -0
  508. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_event_bus.py +0 -0
  509. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_features.py +0 -0
  510. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_final_locomo_mini.py +0 -0
  511. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_hook_handlers.py +0 -0
  512. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_ide_connector.py +0 -0
  513. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_infra.py +0 -0
  514. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_learning_advanced.py +0 -0
  515. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_learning_collectors.py +0 -0
  516. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_llm_provider.py +0 -0
  517. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_mcp_server.py +0 -0
  518. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_migration.py +0 -0
  519. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_mode_switch_preservation.py +0 -0
  520. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_post_install.py +0 -0
  521. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_ranker.py +0 -0
  522. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_topic_shift_hook.py +0 -0
  523. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_trust_full.py +0 -0
  524. {superlocalmemory-3.6.3 → superlocalmemory-3.6.4}/tests/test_v3_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.6.3
3
+ Version: 3.6.4
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.6.3"
3
+ version = "3.6.4"
4
4
  description = "Information-geometric agent memory with mathematical guarantees"
5
5
  readme = "README.md"
6
6
  license = {text = "AGPL-3.0-or-later"}
@@ -745,6 +745,14 @@ class ConsolidationEngine:
745
745
  """
746
746
  from superlocalmemory.storage.models import _new_id
747
747
 
748
+ # NOTE (core-promotion-02, intentionally NOT changed): the audit
749
+ # flagged placeholder core blocks ("No data available.") + version
750
+ # churn. Investigation showed BOTH the "always 5 blocks" layout and the
751
+ # monotonic version-on-recompile counter are intentional, tested design
752
+ # (see test_consolidation_engine), and the read-side injection filter
753
+ # already hides placeholders from agents. Suppressing or de-churning
754
+ # here breaks that design for a cosmetic gain — so it is left as-is.
755
+
748
756
  # Get existing version for increment
749
757
  existing = self._db.get_core_block(profile_id, block_type)
750
758
  version = (existing["version"] + 1) if existing else 1
@@ -281,13 +281,18 @@ class MemoryEngine:
281
281
  # V3.2: ConsolidationEngine (Phase 5) -- sleep-time consolidation
282
282
  from superlocalmemory.core.summarizer import Summarizer
283
283
  summarizer = Summarizer(self._config)
284
+ # P1-5 (core-promotion-01): wire a real behavioral store. Previously
285
+ # hardcoded None → _compile_behavioral_block always returned the
286
+ # "No behavioral patterns detected yet." placeholder, so behavioral
287
+ # patterns never reached the always-injected core block (dead feature).
288
+ from superlocalmemory.core.recall_pipeline import _get_behavioral_tracker
284
289
  self._consolidation_engine = _init_consolidation(
285
290
  self._config, self._db,
286
291
  auto_linker=self._auto_linker,
287
292
  graph_analyzer=self._graph_analyzer,
288
293
  temporal_validator=self._temporal_validator,
289
294
  summarizer=summarizer,
290
- behavioral_store=None,
295
+ behavioral_store=_get_behavioral_tracker(self._db),
291
296
  embedder=self._embedder, # v3.4.7: for CCQ worker
292
297
  llm=getattr(self, "_llm", None), # v3.4.7: for CCQ worker
293
298
  )
@@ -226,19 +226,41 @@ def _consolidate_cluster(
226
226
  except (json.JSONDecodeError, TypeError):
227
227
  pass
228
228
 
229
- c.execute("""
230
- INSERT INTO atomic_facts
231
- (fact_id, memory_id, profile_id, content, fact_type,
232
- entities_json, canonical_entities_json,
233
- confidence, importance, evidence_count, access_count,
234
- created_at, lifecycle)
235
- VALUES (?, '', ?, ?, 'semantic', ?, ?, ?, 0.8, ?, 0, ?, 'active')
236
- """, (
237
- new_fact_id, profile_id, summary,
238
- json.dumps(list(all_entities)),
239
- json.dumps(list(all_entities)),
240
- round(avg_confidence, 3), len(facts), now,
241
- ))
229
+ # P0-3 (dedup-complete-01): apply the SAME content-idempotency invariant
230
+ # as storage.database.store_fact — but on THIS cursor so it stays inside
231
+ # the cluster SAVEPOINT. Previously this raw INSERT bypassed dedup, so a
232
+ # consolidated summary identical to an existing live fact created a
233
+ # duplicate row and never reinforced evidence. Now: reinforce-or-insert.
234
+ # (Excludes 'archived' = soft-deleted, mirroring store_fact.)
235
+ _existing = c.execute(
236
+ "SELECT fact_id FROM atomic_facts "
237
+ "WHERE profile_id = ? AND content = ? "
238
+ "AND lifecycle IN ('active', 'warm', 'cold') "
239
+ "ORDER BY created_at LIMIT 1",
240
+ (profile_id, summary),
241
+ ).fetchone()
242
+ if _existing:
243
+ new_fact_id = _existing["fact_id"]
244
+ c.execute(
245
+ "UPDATE atomic_facts "
246
+ "SET evidence_count = evidence_count + ?, access_count = access_count + 1 "
247
+ "WHERE fact_id = ?",
248
+ (len(facts), new_fact_id),
249
+ )
250
+ else:
251
+ c.execute("""
252
+ INSERT INTO atomic_facts
253
+ (fact_id, memory_id, profile_id, content, fact_type,
254
+ entities_json, canonical_entities_json,
255
+ confidence, importance, evidence_count, access_count,
256
+ created_at, lifecycle)
257
+ VALUES (?, '', ?, ?, 'semantic', ?, ?, ?, 0.8, ?, 0, ?, 'active')
258
+ """, (
259
+ new_fact_id, profile_id, summary,
260
+ json.dumps(list(all_entities)),
261
+ json.dumps(list(all_entities)),
262
+ round(avg_confidence, 3), len(facts), now,
263
+ ))
242
264
 
243
265
  # Record the consolidation
244
266
  consolidation_id = uuid.uuid4().hex[:16]
@@ -257,6 +279,25 @@ def _consolidate_cluster(
257
279
  (*fact_ids, profile_id),
258
280
  )
259
281
 
282
+ # P1-4 (graph-integrity-01): archived facts must stop influencing
283
+ # graph-based ranking. The association_edges FK is ON DELETE CASCADE
284
+ # only (no ON UPDATE), so archiving via UPDATE leaves orphaned edges
285
+ # that spreading_activation still reads. Remove edges touching the
286
+ # archived facts, and set their retention zone so ForgettingFilter
287
+ # excludes them. Inside the SAVEPOINT for atomicity.
288
+ c.execute(
289
+ f"DELETE FROM association_edges "
290
+ f"WHERE profile_id = ? "
291
+ f"AND (source_fact_id IN ({placeholders}) "
292
+ f" OR target_fact_id IN ({placeholders}))",
293
+ (profile_id, *fact_ids, *fact_ids),
294
+ )
295
+ c.execute(
296
+ f"UPDATE fact_retention SET lifecycle_zone = 'archive' "
297
+ f"WHERE profile_id = ? AND fact_id IN ({placeholders})",
298
+ (profile_id, *fact_ids),
299
+ )
300
+
260
301
  c.execute(f"RELEASE SAVEPOINT {savepoint_name}")
261
302
 
262
303
  except Exception:
@@ -56,6 +56,7 @@ def prune_graph(
56
56
  "self_loops_removed": 0,
57
57
  "duplicates_removed": 0,
58
58
  "hub_edges_removed": 0,
59
+ "association_orphans_removed": 0, # gi-04
59
60
  "total_before": 0,
60
61
  "total_after": 0,
61
62
  }
@@ -83,6 +84,9 @@ def prune_graph(
83
84
  stats["hub_edges_removed"] = _cap_node_degree(
84
85
  c, profile_id, _MAX_DEGREE_PER_NODE, dry_run,
85
86
  )
87
+ stats["association_orphans_removed"] = _remove_orphan_association_edges(
88
+ c, profile_id, dry_run,
89
+ )
86
90
 
87
91
  if dry_run:
88
92
  c.execute("ROLLBACK")
@@ -122,6 +126,34 @@ def prune_graph(
122
126
  return stats
123
127
 
124
128
 
129
+ def _remove_orphan_association_edges(
130
+ c: sqlite3.Cursor,
131
+ profile_id: str,
132
+ dry_run: bool,
133
+ ) -> int:
134
+ """gi-04: remove association_edges whose source/target fact no longer
135
+ exists in atomic_facts.
136
+
137
+ prune_graph historically only touched graph_edges despite its docstring
138
+ claiming "all graph pruning". Hard-deleted facts leave orphaned
139
+ association_edges (the FK cascade only fires under FK-on connections),
140
+ which spreading_activation then has to scan. Returns rows removed.
141
+ """
142
+ where = (
143
+ "profile_id = ? AND ("
144
+ "source_fact_id NOT IN (SELECT fact_id FROM atomic_facts WHERE profile_id = ?) "
145
+ "OR target_fact_id NOT IN (SELECT fact_id FROM atomic_facts WHERE profile_id = ?))"
146
+ )
147
+ c.execute(f"SELECT COUNT(*) AS cnt FROM association_edges WHERE {where}",
148
+ (profile_id, profile_id, profile_id))
149
+ n = c.fetchone()["cnt"]
150
+ if dry_run or not n:
151
+ return n
152
+ c.execute(f"DELETE FROM association_edges WHERE {where}",
153
+ (profile_id, profile_id, profile_id))
154
+ return c.rowcount
155
+
156
+
125
157
  def _remove_orphan_edges(
126
158
  c: sqlite3.Cursor,
127
159
  profile_id: str,
@@ -321,60 +353,64 @@ def _cap_node_degree(
321
353
  2. Edges with rn > max_degree are deleted in a single DELETE statement.
322
354
  Requires SQLite 3.25+ (window functions). System is on 3.53.1.
323
355
  """
356
+ # gi-03: cap BOTH out-degree (PARTITION BY source_id) AND in-degree
357
+ # (PARTITION BY target_id). Previously only out-degree was capped, so hub
358
+ # nodes accumulated unbounded in-degree (observed up to 1457), inflating
359
+ # entity-channel fan-in cost. An edge is removed if it exceeds max_degree
360
+ # in EITHER direction (low-weight to both its endpoints). Computed in one
361
+ # window-function pass, no Python loops.
324
362
  if dry_run:
325
363
  c.execute(
326
364
  """
327
365
  SELECT COUNT(*) as cnt FROM (
328
366
  SELECT edge_id,
329
- ROW_NUMBER() OVER (
330
- PARTITION BY source_id ORDER BY weight DESC
331
- ) as rn
367
+ ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY weight DESC) as out_rn,
368
+ ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY weight DESC) as in_rn
332
369
  FROM graph_edges
333
370
  WHERE profile_id = ?
334
- ) WHERE rn > ?
371
+ ) WHERE out_rn > ? OR in_rn > ?
335
372
  """,
336
- (profile_id, max_degree),
373
+ (profile_id, max_degree, max_degree),
337
374
  )
338
375
  excess = c.fetchone()["cnt"]
339
376
  logger.info(
340
- "(dry-run) _cap_node_degree: ~%d edges would be removed (max_degree=%d)",
377
+ "(dry-run) _cap_node_degree: ~%d edges would be removed (max_degree=%d, in+out)",
341
378
  excess, max_degree,
342
379
  )
343
380
  return excess
344
381
 
345
- # Step 1: build temp keep-list in one pass (ROW_NUMBER ranks by weight DESC)
346
- c.execute("CREATE TEMP TABLE IF NOT EXISTS _slm_keep_edges (edge_id TEXT PRIMARY KEY)")
347
- c.execute("DELETE FROM _slm_keep_edges") # idempotent if called twice
382
+ # Step 1: collect edges exceeding the cap in either direction (one pass).
383
+ c.execute("DROP TABLE IF EXISTS _slm_cap_del")
384
+ c.execute("CREATE TEMP TABLE _slm_cap_del (edge_id TEXT PRIMARY KEY)")
348
385
  c.execute(
349
386
  """
350
- INSERT INTO _slm_keep_edges (edge_id)
387
+ INSERT OR IGNORE INTO _slm_cap_del (edge_id)
351
388
  SELECT edge_id FROM (
352
389
  SELECT edge_id,
353
- ROW_NUMBER() OVER (
354
- PARTITION BY source_id ORDER BY weight DESC
355
- ) as rn
390
+ ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY weight DESC) as out_rn,
391
+ ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY weight DESC) as in_rn
356
392
  FROM graph_edges
357
393
  WHERE profile_id = ?
358
- ) WHERE rn <= ?
394
+ ) WHERE out_rn > ? OR in_rn > ?
359
395
  """,
360
- (profile_id, max_degree),
396
+ (profile_id, max_degree, max_degree),
361
397
  )
362
398
 
363
- # Step 2: delete everything not in keep-list (single DELETE)
399
+ # Step 2: delete the over-cap edges (single DELETE).
364
400
  c.execute(
365
401
  """
366
402
  DELETE FROM graph_edges
367
403
  WHERE profile_id = ?
368
- AND edge_id NOT IN (SELECT edge_id FROM _slm_keep_edges)
404
+ AND edge_id IN (SELECT edge_id FROM _slm_cap_del)
369
405
  """,
370
406
  (profile_id,),
371
407
  )
372
408
  deleted = c.rowcount
373
409
 
374
- c.execute("DROP TABLE IF EXISTS _slm_keep_edges")
410
+ c.execute("DROP TABLE IF EXISTS _slm_cap_del")
375
411
 
376
412
  logger.info(
377
- "_cap_node_degree: deleted %d low-weight edges (max_degree=%d)",
413
+ "_cap_node_degree: deleted %d low-weight edges (max_degree=%d, in+out capped)",
378
414
  deleted, max_degree,
379
415
  )
380
416
  return deleted
@@ -107,8 +107,17 @@ def run_maintenance(
107
107
  "fisher_coupled": 0,
108
108
  "sheaf_checked": 0,
109
109
  "entity_summaries_consolidated": 0, # V3.4.40
110
+ "orphan_metadata_gc": 0, # v3.6.4 (P1-3)
110
111
  }
111
112
 
113
+ # P1-3 (embeddings-vector-02): sweep orphaned embedding_metadata left by
114
+ # any FK-off delete path, so the semantic channel never maps to dead facts.
115
+ # Runs before the early-return so it sweeps even for empty profiles.
116
+ try:
117
+ counts["orphan_metadata_gc"] = db.gc_orphaned_embedding_metadata()
118
+ except Exception as exc: # pragma: no cover - defensive
119
+ logger.debug("orphan metadata GC skipped: %s", exc)
120
+
112
121
  facts = db.get_all_facts(profile_id)
113
122
  if not facts:
114
123
  return counts
@@ -102,6 +102,37 @@ def enrich_fact(
102
102
  )
103
103
 
104
104
 
105
+ # ---------------------------------------------------------------------------
106
+ # Vector dual-write helper (P1-2 / embeddings-vector-01)
107
+ # ---------------------------------------------------------------------------
108
+
109
+ def _upsert_fact_vectors(fact, profile_id, ann_index, vector_store, embedder=None):
110
+ """Dual-write a fact's embedding to the ANN index + sqlite-vec store.
111
+
112
+ Embeds on-demand when the fact has no embedding (e.g. consolidated
113
+ summary facts created without one), so UPDATE/SUPERSEDE and consolidated
114
+ facts remain visible to the semantic channel instead of having a row in
115
+ ``atomic_facts`` but none in the vector store.
116
+ """
117
+ if not getattr(fact, "embedding", None) and embedder is not None and fact.content:
118
+ try:
119
+ fact.embedding = embedder.embed(fact.content)
120
+ except Exception as _emb_exc: # pragma: no cover - defensive
121
+ logger.debug("on-demand embed failed for %s: %s", fact.fact_id, _emb_exc)
122
+ return
123
+ if not getattr(fact, "embedding", None):
124
+ return
125
+ if ann_index:
126
+ ann_index.add(fact.fact_id, fact.embedding)
127
+ # V3.2: VectorStore upsert (sqlite-vec) -- dual-write (Rule 12)
128
+ if vector_store and getattr(vector_store, "available", False):
129
+ vector_store.upsert(
130
+ fact_id=fact.fact_id,
131
+ profile_id=profile_id,
132
+ embedding=fact.embedding,
133
+ )
134
+
135
+
105
136
  # ---------------------------------------------------------------------------
106
137
  # run_store (was MemoryEngine.store)
107
138
  # ---------------------------------------------------------------------------
@@ -175,10 +206,20 @@ def run_store(
175
206
  )
176
207
  db.store_memory(record)
177
208
 
178
- facts = fact_extractor.extract_facts(
179
- turns=[content], session_id=session_id,
180
- session_date=parsed_date, speaker_a=speaker,
181
- )
209
+ try:
210
+ facts = fact_extractor.extract_facts(
211
+ turns=[content], session_id=session_id,
212
+ session_date=parsed_date, speaker_a=speaker,
213
+ )
214
+ except Exception as _extract_exc:
215
+ # P0-1 (remember-write-04): an extractor EXCEPTION (transient LLM/embed
216
+ # backend error) must NOT orphan the already-committed memory. The None
217
+ # guard below only handled a None *return*, not a raise. Treat a raise
218
+ # as "no facts" so the verbatim/raw fallback persists the content.
219
+ logger.warning(
220
+ "extract_facts() raised — falling back to raw fact: %s", _extract_exc,
221
+ )
222
+ facts = None
182
223
 
183
224
  # v3.4.38: Defensive None guard. extract_facts() returns None on transient
184
225
  # failures (embedding worker timeout, LLM call fail). Without this guard,
@@ -257,58 +298,77 @@ def run_store(
257
298
  )
258
299
 
259
300
  if consolidator:
260
- action = consolidator.consolidate(fact, profile_id)
261
- if action.action_type.value == "noop":
262
- continue
263
-
264
- # Opinion confidence tracking: reinforce or decay
265
- if fact.fact_type == FactType.OPINION and action.action_type.value == "update":
266
- try:
267
- existing = db.get_fact(action.new_fact_id)
268
- if existing and existing.fact_type == FactType.OPINION:
269
- new_conf = min(1.0, existing.confidence + 0.1)
270
- db.update_fact(action.new_fact_id, {"confidence": new_conf})
271
- except Exception:
272
- pass
273
- elif fact.fact_type == FactType.OPINION and action.action_type.value == "supersede":
274
- try:
275
- old_id = getattr(action, "old_fact_id", None)
276
- if old_id:
277
- old_fact = db.get_fact(old_id)
278
- if old_fact:
279
- new_conf = max(0.0, old_fact.confidence - 0.2)
280
- db.update_fact(old_id, {"confidence": new_conf})
281
- except Exception:
282
- pass
283
-
284
- if action.action_type.value in ("update", "supersede"):
285
- updated_fact = db.get_fact(action.new_fact_id)
286
- if updated_fact:
287
- if graph_builder:
288
- graph_builder.build_edges(updated_fact, profile_id)
289
- if observation_builder:
290
- for eid in updated_fact.canonical_entities:
291
- observation_builder.update_profile(
292
- eid, updated_fact, profile_id,
293
- )
294
- stored_ids.append(action.new_fact_id)
295
- continue
296
- # ADD case: consolidator already stored the fact (F8 fix)
297
- # Fall through to post-processing below
301
+ try:
302
+ action = consolidator.consolidate(fact, profile_id)
303
+ except Exception as _consolidate_exc:
304
+ # P0-1 (remember-write-03): a consolidate failure (e.g. LLM
305
+ # timeout) must NOT orphan the already-committed memory. Fall
306
+ # back to storing the raw enriched fact so the content stays
307
+ # retrievable across all channels.
308
+ logger.warning(
309
+ "consolidate() failed for fact %s — storing raw fact as "
310
+ "fallback: %s", fact.fact_id, _consolidate_exc,
311
+ )
312
+ action = None
313
+
314
+ if action is not None:
315
+ if action.action_type.value == "noop":
316
+ continue
317
+
318
+ # Opinion confidence tracking: reinforce or decay
319
+ if fact.fact_type == FactType.OPINION and action.action_type.value == "update":
320
+ try:
321
+ existing = db.get_fact(action.new_fact_id)
322
+ if existing and existing.fact_type == FactType.OPINION:
323
+ new_conf = min(1.0, existing.confidence + 0.1)
324
+ db.update_fact(action.new_fact_id, {"confidence": new_conf})
325
+ except Exception:
326
+ pass
327
+ elif fact.fact_type == FactType.OPINION and action.action_type.value == "supersede":
328
+ try:
329
+ old_id = getattr(action, "old_fact_id", None)
330
+ if old_id:
331
+ old_fact = db.get_fact(old_id)
332
+ if old_fact:
333
+ new_conf = max(0.0, old_fact.confidence - 0.2)
334
+ db.update_fact(old_id, {"confidence": new_conf})
335
+ except Exception:
336
+ pass
337
+
338
+ if action.action_type.value in ("update", "supersede"):
339
+ updated_fact = db.get_fact(action.new_fact_id)
340
+ if updated_fact:
341
+ # P1-2 (embeddings-vector-01): the merged/superseding
342
+ # fact must reach the vector store (embed on-demand if
343
+ # it has none) — otherwise it is invisible to the
344
+ # semantic channel despite living in atomic_facts.
345
+ _upsert_fact_vectors(
346
+ updated_fact, profile_id, ann_index, vector_store, embedder,
347
+ )
348
+ if graph_builder:
349
+ graph_builder.build_edges(updated_fact, profile_id)
350
+ if observation_builder:
351
+ for eid in updated_fact.canonical_entities:
352
+ observation_builder.update_profile(
353
+ eid, updated_fact, profile_id,
354
+ )
355
+ stored_ids.append(action.new_fact_id)
356
+ continue
357
+ # ADD case: consolidator already stored the fact (F8 fix)
358
+ # Fall through to post-processing below
359
+ else:
360
+ # Consolidate failed → store the raw fact ourselves so the
361
+ # memory is never left without a retrievable fact, then fall
362
+ # through to post-processing (embeddings, graph, context).
363
+ db.store_fact(fact)
298
364
  else:
299
365
  db.store_fact(fact)
300
366
 
301
367
  stored_ids.append(fact.fact_id)
302
368
 
303
- if fact.embedding and ann_index:
304
- ann_index.add(fact.fact_id, fact.embedding)
305
- # V3.2: VectorStore upsert (sqlite-vec) -- dual-write (Rule 12)
306
- if fact.embedding and vector_store and vector_store.available:
307
- vector_store.upsert(
308
- fact_id=fact.fact_id,
309
- profile_id=profile_id,
310
- embedding=fact.embedding,
311
- )
369
+ # Dual-write embedding to ANN index + vector store (embed on-demand if
370
+ # a consolidated ADD fact arrived without one). See _upsert_fact_vectors.
371
+ _upsert_fact_vectors(fact, profile_id, ann_index, vector_store, embedder)
312
372
  # Phase 2: Generate contextual description (after consolidator, before graph_builder)
313
373
  if context_generator:
314
374
  try:
@@ -489,6 +549,15 @@ def run_store_fact_direct(
489
549
  and graph edges are all populated — even for auxiliary data.
490
550
  Creates a parent memory record to satisfy FK constraint.
491
551
  """
552
+ # remember-write-02: gate low-quality content (empty, bare category tags,
553
+ # placeholder/template leakage) at the WRITE boundary, matching run_store's
554
+ # gate. Previously this direct path had no filter, so junk entered the KB
555
+ # and polluted evidence/stats/embeddings (the read-side filter only hid it).
556
+ from superlocalmemory.core.injection import is_low_quality
557
+ if is_low_quality(fact.content):
558
+ logger.debug("run_store_fact_direct: skipping low-quality content")
559
+ return fact.fact_id
560
+
492
561
  # Create parent memory record (FK: atomic_facts.memory_id → memories.memory_id)
493
562
  if not fact.memory_id:
494
563
  record = MemoryRecord(
@@ -0,0 +1,60 @@
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
+ """Pure decision logic for the MCP stdin-EOF self-termination monitor.
6
+
7
+ Isolated here (no imports, no side effects) so the kqueue ``EV_EOF``
8
+ handling contract is unit-testable without importing the FastMCP server
9
+ module, which starts daemon threads and auto-starts the SLM daemon at
10
+ import time.
11
+
12
+ Background (v3.6.4 fix)
13
+ -----------------------
14
+ The stdin-EOF monitor (``superlocalmemory.mcp.server._stdin_eof_monitor``)
15
+ exists to reap orphaned ``slm mcp`` processes when an IDE/agent abandons the
16
+ stdio pipe without quitting. It registers ``EVFILT_READ | EV_EOF`` on stdin
17
+ and terminates the process when the write-end closes.
18
+
19
+ On macOS, ``EVFILT_READ`` reports ``EV_EOF`` *together with* still-readable
20
+ bytes (``ev.data > 0``) when the write-end is closed while a final request
21
+ is still buffered in the pipe. The original monitor exited on the EOF flag
22
+ alone — dropping that buffered request and tearing down a session that
23
+ still had a pending in-flight call. Under strict MCP hosts whose transport
24
+ half-closes stdin around reconnect/teardown, this surfaced as the server
25
+ self-terminating mid-request, which the host then logged as a keepalive
26
+ failure and respawned (observed against the Hermes agent).
27
+
28
+ The guard defers termination until the buffer is genuinely drained
29
+ (``ev.data <= 0``), letting the FastMCP reader consume the last request
30
+ first. Genuine disconnects (EOF with an empty buffer) still terminate
31
+ immediately — behaviour identical to before for the common case.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ __all__ = ["eof_action"]
37
+
38
+
39
+ def eof_action(flags: int, data: int, eof_flag: int) -> str:
40
+ """Decide how the stdin-EOF monitor should react to one kqueue event.
41
+
42
+ Args:
43
+ flags: ``kevent.flags`` bitmask returned by ``kqueue.control``.
44
+ data: ``kevent.data`` — for ``EVFILT_READ`` this is the number of
45
+ bytes still readable on the descriptor.
46
+ eof_flag: the platform ``select.KQ_EV_EOF`` constant (injected so
47
+ this function stays import-free and trivially testable).
48
+
49
+ Returns:
50
+ - ``"exit"`` — genuine end-of-stream: write-end closed and the
51
+ buffer is drained (``data <= 0``). Safe to self-terminate.
52
+ - ``"drain"`` — write-end closed but unread bytes remain
53
+ (``data > 0``). Must NOT terminate yet; let the reader consume
54
+ the buffered request first, otherwise it is silently dropped.
55
+ - ``"ignore"`` — no EOF on this event (ordinary readability or a
56
+ spurious wake); nothing to do.
57
+ """
58
+ if not (flags & eof_flag):
59
+ return "ignore"
60
+ return "drain" if data > 0 else "exit"
@@ -288,11 +288,26 @@ _watchdog_thread.start()
288
288
  # closes WITHOUT consuming any bytes, so it cannot race with FastMCP's asyncio
289
289
  # stdin reader. On Linux (no kqueue), the watchdog alone provides coverage.
290
290
  def _stdin_eof_monitor() -> None:
291
- """Exit when the IDE closes our stdin pipe (kqueue — macOS only)."""
292
- import select as _sel, os as _os_eof
291
+ """Exit when the IDE closes our stdin pipe (kqueue — macOS only).
292
+
293
+ V3.6.4: kqueue ``EVFILT_READ`` reports ``EV_EOF`` *together with*
294
+ still-readable bytes (``ev.data > 0``) when the write-end closes while a
295
+ final request is buffered. Exiting on the EOF flag alone (pre-3.6.4)
296
+ dropped that in-flight request and self-terminated a session that still
297
+ had work to deliver — strict MCP hosts (e.g. the Hermes agent) then
298
+ logged a keepalive failure and respawned the process. We now defer
299
+ termination until the buffer is genuinely drained (see ``_stdin_guard``).
300
+ """
301
+ import select as _sel, os as _os_eof, time as _time
302
+ from superlocalmemory.mcp._stdin_guard import eof_action
293
303
  _mlog = logging.getLogger(__name__ + ".stdin_monitor")
294
304
  if not hasattr(_sel, "kqueue"):
295
305
  return # Linux / non-macOS: watchdog covers process death
306
+ # Bounded grace for the FastMCP reader to drain a buffered final request
307
+ # before we tear down. ~2 s ceiling (40 × 50 ms): a genuine EOF means the
308
+ # session is ending regardless, so we never wait indefinitely.
309
+ _DRAIN_POLL_S = 0.05
310
+ _DRAIN_MAX_POLLS = 40
296
311
  try:
297
312
  fd = sys.stdin.fileno()
298
313
  kq = _sel.kqueue()
@@ -301,9 +316,23 @@ def _stdin_eof_monitor() -> None:
301
316
  while True:
302
317
  evs = kq.control(None, 4, 30.0) # 30 s poll — low cost
303
318
  for ev in evs:
304
- if ev.flags & _sel.KQ_EV_EOF:
305
- _mlog.info("stdin write-end closed (kqueue EOF), self-terminating")
306
- _os_eof._exit(0)
319
+ action = eof_action(ev.flags, ev.data, _sel.KQ_EV_EOF)
320
+ if action == "ignore":
321
+ continue
322
+ if action == "drain":
323
+ # Write-end closed but unread bytes remain. Let the
324
+ # FastMCP reader consume the final request(s); poll until
325
+ # drained or the grace ceiling elapses.
326
+ for _ in range(_DRAIN_MAX_POLLS):
327
+ _time.sleep(_DRAIN_POLL_S)
328
+ recheck = kq.control(None, 4, 0) # non-blocking
329
+ if not recheck:
330
+ break
331
+ ev = recheck[0]
332
+ if eof_action(ev.flags, ev.data, _sel.KQ_EV_EOF) != "drain":
333
+ break
334
+ _mlog.info("stdin write-end closed (kqueue EOF, drained), self-terminating")
335
+ _os_eof._exit(0)
307
336
  except Exception as exc:
308
337
  _mlog.debug("stdin EOF monitor error: %s — watchdog will cover", exc)
309
338