superlocalmemory 3.6.4__tar.gz → 3.6.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. {superlocalmemory-3.6.4/src/superlocalmemory.egg-info → superlocalmemory-3.6.6}/PKG-INFO +1 -1
  2. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/pyproject.toml +1 -1
  3. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/__init__.py +26 -13
  4. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/commands.py +30 -10
  5. superlocalmemory-3.6.6/src/superlocalmemory/core/block_hygiene.py +147 -0
  6. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/config.py +36 -0
  7. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/consolidation_engine.py +13 -10
  8. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/engine.py +24 -5
  9. superlocalmemory-3.6.6/src/superlocalmemory/core/ingest_gate.py +133 -0
  10. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/injection.py +27 -0
  11. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/maintenance_scheduler.py +9 -0
  12. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/recall_pipeline.py +9 -0
  13. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/recall_worker.py +12 -20
  14. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_core.py +2 -0
  15. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/engine.py +58 -0
  16. superlocalmemory-3.6.6/src/superlocalmemory/server/recall_serializer.py +225 -0
  17. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/unified_daemon.py +35 -53
  18. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/models.py +3 -0
  19. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6/src/superlocalmemory.egg-info}/PKG-INFO +1 -1
  20. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory.egg-info/SOURCES.txt +3 -0
  21. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/AUTHORS.md +0 -0
  22. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/LICENSE +0 -0
  23. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/NOTICE +0 -0
  24. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/README.md +0 -0
  25. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/setup.cfg +0 -0
  26. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/attribution/__init__.py +0 -0
  27. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  28. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/attribution/signer.py +0 -0
  29. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/attribution/watermark.py +0 -0
  30. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/__init__.py +0 -0
  31. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/cache_cmd.py +0 -0
  32. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/compress_cmd.py +0 -0
  33. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/context_commands.py +0 -0
  34. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/daemon.py +0 -0
  35. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/db_migrate.py +0 -0
  36. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/doctor_cmd.py +0 -0
  37. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  38. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/help_cmd.py +0 -0
  39. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  40. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/json_output.py +0 -0
  41. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/main.py +0 -0
  42. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  43. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
  44. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/optimize_constants.py +0 -0
  45. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/pending_store.py +0 -0
  46. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/post_install.py +0 -0
  47. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
  48. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/service_installer.py +0 -0
  49. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  50. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/version_banner.py +0 -0
  51. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  52. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/__init__.py +0 -0
  53. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  54. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  55. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  56. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  57. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  58. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  59. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  60. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/changes.py +0 -0
  61. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/communities.py +0 -0
  62. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/config.py +0 -0
  63. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/database.py +0 -0
  64. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  65. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  66. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  67. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/flows.py +0 -0
  68. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  69. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  70. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  71. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/incremental.py +0 -0
  72. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/models.py +0 -0
  73. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/parser.py +0 -0
  74. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/resolver.py +0 -0
  75. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/search.py +0 -0
  76. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/service.py +0 -0
  77. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/code_graph/watcher.py +0 -0
  78. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/__init__.py +0 -0
  79. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/abac.py +0 -0
  80. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/audit.py +0 -0
  81. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  82. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/gdpr.py +0 -0
  83. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  84. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/retention.py +0 -0
  85. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/compliance/scheduler.py +0 -0
  86. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/__init__.py +0 -0
  87. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
  88. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/clock_monitor.py +0 -0
  89. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/context_cache.py +0 -0
  90. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/db_pool.py +0 -0
  91. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/embedding_worker.py +0 -0
  92. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/embeddings.py +0 -0
  93. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  94. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/engine_lock.py +0 -0
  95. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/engine_wiring.py +0 -0
  96. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/error_catalog.py +0 -0
  97. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/error_envelope.py +0 -0
  98. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  99. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/file_lock.py +0 -0
  100. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  101. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/graph_pruner.py +0 -0
  102. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/health_monitor.py +0 -0
  103. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/hooks.py +0 -0
  104. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  105. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/maintenance.py +0 -0
  106. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
  107. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/modes.py +0 -0
  108. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  109. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/platform_utils.py +0 -0
  110. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/priority_queue.py +0 -0
  111. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/profiles.py +0 -0
  112. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/pruning_engine.py +0 -0
  113. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/queue_consumer.py +0 -0
  114. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  115. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/ram_lock.py +0 -0
  116. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/rate_limit.py +0 -0
  117. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/recall_gate.py +0 -0
  118. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/recall_queue.py +0 -0
  119. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/registry.py +0 -0
  120. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/reranker_worker.py +0 -0
  121. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/safe_fs.py +0 -0
  122. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/security_primitives.py +0 -0
  123. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/shadow_router.py +0 -0
  124. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/slm_disabled.py +0 -0
  125. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/slmignore.py +0 -0
  126. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/store_pipeline.py +0 -0
  127. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/summarizer.py +0 -0
  128. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/tier_manager.py +0 -0
  129. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/topic_signature.py +0 -0
  130. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/core/worker_pool.py +0 -0
  131. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/dynamics/__init__.py +0 -0
  132. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  133. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  134. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  135. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  136. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/__init__.py +0 -0
  137. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  138. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  139. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/consolidator.py +0 -0
  140. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/context_generator.py +0 -0
  141. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/emotional.py +0 -0
  142. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  143. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  144. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  145. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/foresight.py +0 -0
  146. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  147. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  148. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  149. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  150. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  151. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  152. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/encoding/type_router.py +0 -0
  153. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/__init__.py +0 -0
  154. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  155. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/budget.py +0 -0
  156. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  157. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  158. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  159. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  160. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/triggers.py +0 -0
  161. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/evolution/types.py +0 -0
  162. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/graph/__init__.py +0 -0
  163. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  164. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/__init__.py +0 -0
  165. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  166. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  167. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  168. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  169. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  170. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  171. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  172. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  173. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
  174. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  175. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/context_payload.py +0 -0
  176. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  177. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  178. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  179. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  180. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  181. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  182. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  183. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  184. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  185. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  186. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/session_registry.py +0 -0
  187. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  188. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  189. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  190. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  191. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  192. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/__init__.py +0 -0
  193. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/auth_middleware.py +0 -0
  194. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/backup.py +0 -0
  195. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/cache_manager.py +0 -0
  196. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  197. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/event_bus.py +0 -0
  198. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  199. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/pid_manager.py +0 -0
  200. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/process_reaper.py +0 -0
  201. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  202. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  203. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/__init__.py +0 -0
  204. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  205. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  206. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  207. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/credentials.py +0 -0
  208. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  209. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/parsers.py +0 -0
  210. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  211. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/__init__.py +0 -0
  212. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/adaptive.py +0 -0
  213. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  214. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  215. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/bandit.py +0 -0
  216. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  217. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/behavioral.py +0 -0
  218. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  219. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/bootstrap.py +0 -0
  220. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  221. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  222. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  223. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/cross_project.py +0 -0
  224. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/database.py +0 -0
  225. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  226. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/engagement.py +0 -0
  227. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/ensemble.py +0 -0
  228. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  229. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  230. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/features.py +0 -0
  231. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/feedback.py +0 -0
  232. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  233. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  234. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/labeler.py +0 -0
  235. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  236. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
  237. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/memory_merge.py +0 -0
  238. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/model_cache.py +0 -0
  239. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/model_rollback.py +0 -0
  240. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  241. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/outcomes.py +0 -0
  242. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  243. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  244. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/project_context.py +0 -0
  245. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  246. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/ranker.py +0 -0
  247. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/ranker_common.py +0 -0
  248. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  249. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  250. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/reward.py +0 -0
  251. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/reward_archive.py +0 -0
  252. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/reward_boost.py +0 -0
  253. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  254. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/shadow_test.py +0 -0
  255. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/signal_worker.py +0 -0
  256. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/signals.py +0 -0
  257. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  258. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/source_quality.py +0 -0
  259. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/trigram_index.py +0 -0
  260. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/learning/workflows.py +0 -0
  261. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/llm/__init__.py +0 -0
  262. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/llm/backbone.py +0 -0
  263. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/__init__.py +0 -0
  264. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  265. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/fisher.py +0 -0
  266. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  267. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/hopfield.py +0 -0
  268. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/langevin.py +0 -0
  269. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/polar_quant.py +0 -0
  270. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/qjl.py +0 -0
  271. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/sheaf.py +0 -0
  272. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/math/turbo_quant.py +0 -0
  273. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/__init__.py +0 -0
  274. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  275. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  276. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/_stdin_guard.py +0 -0
  277. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/resources.py +0 -0
  278. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/server.py +0 -0
  279. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/shared.py +0 -0
  280. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools.py +0 -0
  281. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_active.py +0 -0
  282. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  283. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_context.py +0 -0
  284. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  285. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  286. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  287. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  288. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  289. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  290. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mesh/__init__.py +0 -0
  291. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mesh/broker.py +0 -0
  292. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  293. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/migrations/__init__.py +0 -0
  294. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  295. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/__init__.py +0 -0
  296. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
  297. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
  298. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
  299. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
  300. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
  301. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
  302. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
  303. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
  304. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
  305. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/exact.py +0 -0
  306. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
  307. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
  308. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/manager.py +0 -0
  309. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
  310. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
  311. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
  312. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/align.py +0 -0
  313. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
  314. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/extractive_code.py +0 -0
  315. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/extractive_json.py +0 -0
  316. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
  317. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/compress/router.py +0 -0
  318. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/config/__init__.py +0 -0
  319. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/config/defaults.py +0 -0
  320. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/config/schema.py +0 -0
  321. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/config/store.py +0 -0
  322. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
  323. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
  324. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
  325. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
  326. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
  327. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
  328. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
  329. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
  330. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
  331. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
  332. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
  333. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/proxy/server.py +0 -0
  334. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
  335. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/storage/db.py +0 -0
  336. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/optimize/storage/schema.py +0 -0
  337. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/__init__.py +0 -0
  338. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  339. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  340. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  341. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  342. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  343. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/__init__.py +0 -0
  344. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/agentic.py +0 -0
  345. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  346. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  347. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  348. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  349. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  350. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  351. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/fusion.py +0 -0
  352. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  353. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  354. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  355. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/reranker.py +0 -0
  356. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  357. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  358. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/strategy.py +0 -0
  359. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  360. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  361. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/__init__.py +0 -0
  362. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/api.py +0 -0
  363. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/bandit_loops.py +0 -0
  364. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  365. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  366. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/__init__.py +0 -0
  367. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/adapters.py +0 -0
  368. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/agents.py +0 -0
  369. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/backup.py +0 -0
  370. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  371. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/brain.py +0 -0
  372. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/chat.py +0 -0
  373. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/compliance.py +0 -0
  374. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/data_io.py +0 -0
  375. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/entity.py +0 -0
  376. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/events.py +0 -0
  377. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/evolution.py +0 -0
  378. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/helpers.py +0 -0
  379. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/ingest.py +0 -0
  380. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/insights.py +0 -0
  381. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/learning.py +0 -0
  382. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  383. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/memories.py +0 -0
  384. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/mesh.py +0 -0
  385. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/optimize.py +0 -0
  386. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  387. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/profiles.py +0 -0
  388. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/stats.py +0 -0
  389. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/tiers.py +0 -0
  390. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/timeline.py +0 -0
  391. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/token.py +0 -0
  392. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/v3_api.py +0 -0
  393. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/routes/ws.py +0 -0
  394. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/security_middleware.py +0 -0
  395. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/server/ui.py +0 -0
  396. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -0
  397. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -0
  398. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -0
  399. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -0
  400. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -0
  401. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-status/SKILL.md +0 -0
  402. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -0
  403. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/__init__.py +0 -0
  404. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/access_control.py +0 -0
  405. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/access_log.py +0 -0
  406. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/database.py +0 -0
  407. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  408. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migration_runner.py +0 -0
  409. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migration_v33.py +0 -0
  410. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  411. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  412. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  413. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  414. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  415. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  416. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  417. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  418. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  419. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  420. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  421. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  422. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  423. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
  424. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  425. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/migrations.py +0 -0
  426. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/quantized_store.py +0 -0
  427. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema.py +0 -0
  428. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  429. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v32.py +0 -0
  430. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  431. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  432. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v343.py +0 -0
  433. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v345.py +0 -0
  434. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/schema_v347.py +0 -0
  435. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  436. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/trust/__init__.py +0 -0
  437. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/trust/gate.py +0 -0
  438. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/trust/provenance.py +0 -0
  439. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/trust/scorer.py +0 -0
  440. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/trust/signals.py +0 -0
  441. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/css/brain.css +0 -0
  442. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  443. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  444. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/index.html +0 -0
  445. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/agents.js +0 -0
  446. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  447. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/brain.js +0 -0
  448. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/clusters.js +0 -0
  449. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/compliance.js +0 -0
  450. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/core.js +0 -0
  451. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  452. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/events.js +0 -0
  453. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  454. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/feedback.js +0 -0
  455. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  456. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  457. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  458. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  459. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/init.js +0 -0
  460. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  461. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  462. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/math-health.js +0 -0
  463. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/memories.js +0 -0
  464. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  465. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  466. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/modal.js +0 -0
  467. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  468. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  469. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  470. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  471. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  472. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  473. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/optimize.js +0 -0
  474. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/profiles.js +0 -0
  475. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  476. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  477. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/search.js +0 -0
  478. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/settings.js +0 -0
  479. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/timeline.js +0 -0
  480. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  481. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  482. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  483. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  484. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  485. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  486. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  487. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  488. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  489. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  490. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  491. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  492. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  493. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/vector/__init__.py +0 -0
  494. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  495. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  496. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  497. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory.egg-info/requires.txt +0 -0
  498. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  499. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_auto_hooks.py +0 -0
  500. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_before_web_hook.py +0 -0
  501. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_behavioral_full.py +0 -0
  502. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_claude_hooks.py +0 -0
  503. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_cli_core.py +0 -0
  504. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_cli_json.py +0 -0
  505. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_cli_v33.py +0 -0
  506. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_compliance_full.py +0 -0
  507. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_config_system.py +0 -0
  508. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_engine_hooks.py +0 -0
  509. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_event_bus.py +0 -0
  510. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_features.py +0 -0
  511. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_final_locomo_mini.py +0 -0
  512. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_graph_integrity.py +0 -0
  513. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_hook_handlers.py +0 -0
  514. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_ide_connector.py +0 -0
  515. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_infra.py +0 -0
  516. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_injection.py +0 -0
  517. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_learning_advanced.py +0 -0
  518. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_learning_collectors.py +0 -0
  519. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_llm_provider.py +0 -0
  520. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_mcp_server.py +0 -0
  521. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_migration.py +0 -0
  522. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_mode_switch_preservation.py +0 -0
  523. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_post_install.py +0 -0
  524. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_ranker.py +0 -0
  525. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_topic_shift_hook.py +0 -0
  526. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_trust_full.py +0 -0
  527. {superlocalmemory-3.6.4 → superlocalmemory-3.6.6}/tests/test_v3_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.6.4
3
+ Version: 3.6.6
4
4
  Summary: Information-geometric agent memory with mathematical guarantees
5
5
  Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
6
6
  License: AGPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.6.4"
3
+ version = "3.6.6"
4
4
  description = "Information-geometric agent memory with mathematical guarantees"
5
5
  readme = "README.md"
6
6
  license = {text = "AGPL-3.0-or-later"}
@@ -28,7 +28,7 @@ if "OMP_NUM_THREADS" not in os.environ:
28
28
  os.environ["OMP_NUM_THREADS"] = "2"
29
29
  # ---------------------------------------------------------------------------
30
30
 
31
- __version__ = "3.6.3"
31
+ __version__ = "3.6.6"
32
32
 
33
33
  _REQUIRED_VERSIONS = {
34
34
  "sentence_transformers": "5.3.0",
@@ -36,22 +36,35 @@ _REQUIRED_VERSIONS = {
36
36
  }
37
37
 
38
38
 
39
+ # Module name -> distribution name for metadata lookup.
40
+ _DIST_NAMES = {
41
+ "sentence_transformers": "sentence-transformers",
42
+ "onnxruntime": "onnxruntime",
43
+ }
44
+
45
+
39
46
  def _check_critical_deps() -> None:
40
- """Warn if embedding-critical packages have wrong versions."""
47
+ """Warn if embedding-critical packages have wrong versions.
48
+
49
+ Reads installed versions from package metadata — does NOT import the
50
+ packages. Importing sentence_transformers here would eagerly load torch
51
+ (native) into every process: a memory blow-up on Apple Silicon and, on
52
+ some interpreters, a source of native-heap instability at teardown.
53
+ """
41
54
  import warnings
55
+ from importlib import metadata
42
56
  for mod_name, expected in _REQUIRED_VERSIONS.items():
43
57
  try:
44
- mod = __import__(mod_name)
45
- actual = getattr(mod, "__version__", None)
46
- if actual and actual != expected:
47
- warnings.warn(
48
- f"SuperLocalMemory requires {mod_name}=={expected} but "
49
- f"{actual} is installed. This causes memory blow-up on "
50
- f"Apple Silicon. Fix: pip install {mod_name}=={expected}",
51
- stacklevel=2,
52
- )
53
- except ImportError:
54
- pass
58
+ actual = metadata.version(_DIST_NAMES[mod_name])
59
+ except metadata.PackageNotFoundError:
60
+ continue
61
+ if actual != expected:
62
+ warnings.warn(
63
+ f"SuperLocalMemory requires {mod_name}=={expected} but "
64
+ f"{actual} is installed. This causes memory blow-up on "
65
+ f"Apple Silicon. Fix: pip install {mod_name}=={expected}",
66
+ stacklevel=2,
67
+ )
55
68
 
56
69
 
57
70
  # Only run the dep check when a full (non-LIGHT) engine is in use.
@@ -1001,7 +1001,9 @@ def cmd_recall(args: Namespace) -> None:
1001
1001
  ])
1002
1002
  return
1003
1003
  if not result["results"]:
1004
- print("No matching memories found.")
1004
+ print("No confident match."
1005
+ if result.get("no_confident_match")
1006
+ else "No matching memories found.")
1005
1007
  return
1006
1008
  # Text output
1007
1009
  print(f"SpreadingActivation.search completed via daemon ({result.get('retrieval_time_ms', 0):.0f}ms)")
@@ -1030,20 +1032,38 @@ def cmd_recall(args: Namespace) -> None:
1030
1032
  sys.exit(1)
1031
1033
  raise
1032
1034
 
1035
+ # v3.6.6: route the direct-fallback path through the SAME shared
1036
+ # serializer the daemon uses, so CLI-without-daemon output is identical
1037
+ # to CLI/MCP-with-daemon (budget + source discipline + no_confident_match).
1038
+ from superlocalmemory.server.recall_serializer import serialize_recall_response
1039
+ _rc = getattr(config, "retrieval", None)
1040
+ _ser, _no_match = serialize_recall_response(
1041
+ response,
1042
+ limit=args.limit,
1043
+ per_fact_max=getattr(_rc, "recall_per_fact_max_chars", 2400),
1044
+ total_max=getattr(_rc, "recall_total_max_chars", 12000),
1045
+ full=getattr(args, "full", False),
1046
+ )
1047
+
1033
1048
  if use_json:
1034
1049
  from superlocalmemory.cli.json_output import json_print
1035
1050
  items = []
1036
- for r in response.results:
1051
+ for d in _ser:
1037
1052
  item = {
1038
- "fact_id": r.fact.fact_id, "content": r.fact.content,
1039
- "score": round(r.score, 3),
1053
+ "fact_id": d["fact_id"], "content": d["content"],
1054
+ "score": round(d["score"], 3),
1040
1055
  }
1041
- if hasattr(r, "channel_scores") and r.channel_scores:
1042
- item["channel_scores"] = {k: round(v, 3) for k, v in r.channel_scores.items()}
1056
+ if d.get("channel_scores"):
1057
+ item["channel_scores"] = {k: round(v, 3) for k, v in d["channel_scores"].items()}
1058
+ if d.get("truncated"):
1059
+ item["truncated"] = True
1060
+ if d.get("stub"):
1061
+ item["stub"] = True
1043
1062
  items.append(item)
1044
1063
  json_print("recall", data={
1045
1064
  "results": items, "count": len(items),
1046
1065
  "query_type": getattr(response, "query_type", "unknown"),
1066
+ "no_confident_match": _no_match,
1047
1067
  }, next_actions=[
1048
1068
  {"command": "slm list --json", "description": "List recent memories"},
1049
1069
  ])
@@ -1055,11 +1075,11 @@ def cmd_recall(args: Namespace) -> None:
1055
1075
  except Exception:
1056
1076
  pass
1057
1077
 
1058
- if not response.results:
1059
- print("No memories found.")
1078
+ if not _ser:
1079
+ print("No confident match." if _no_match else "No memories found.")
1060
1080
  return
1061
- for i, r in enumerate(response.results, 1):
1062
- print(f" {i}. [{r.score:.2f}] {r.fact.content[:120]}")
1081
+ for i, d in enumerate(_ser, 1):
1082
+ print(f" {i}. [{d['score']:.2f}] {d['content']}")
1063
1083
 
1064
1084
 
1065
1085
  def _cli_record_signals(config, query, results):
@@ -0,0 +1,147 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under AGPL-3.0-or-later - see LICENSE file
3
+ # Part of SuperLocalMemory V3 — Core Block Hygiene (v3.6.6)
4
+
5
+ """Core Memory Block hygiene helpers (v3.6.6 F-5).
6
+
7
+ Three pure functions used by the block compiler:
8
+ - dedupe_block_content: normalized-line dedup within a block
9
+ - filter_low_quality_block_facts: drop is_low_quality facts
10
+ - compile_block_content: full compile pipeline (filter + dedup + cap)
11
+
12
+ Also exports: _recompile_core_blocks — the hook called by MaintenanceScheduler.
13
+
14
+ These are pure functions (no I/O). All I/O lives in the scheduler / consolidation
15
+ engine that calls them.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import logging
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ _BLOCK_SEPARATOR = "\n---\n"
25
+ _PLACEHOLDER = "No data available."
26
+
27
+
28
+ # ---------------------------------------------------------------------------
29
+ # dedupe_block_content
30
+ # ---------------------------------------------------------------------------
31
+
32
+ def dedupe_block_content(lines: list[str]) -> list[str]:
33
+ """Remove duplicate and empty lines from a block content line-list.
34
+
35
+ Normalization: lowercased, whitespace-collapsed.
36
+ Order is preserved; only the FIRST occurrence is kept.
37
+
38
+ Returns a new list — never mutates input.
39
+ """
40
+ seen: set[str] = set()
41
+ result: list[str] = []
42
+ for line in lines:
43
+ stripped = line.strip()
44
+ if not stripped:
45
+ continue
46
+ key = " ".join(stripped.lower().split())
47
+ if key in seen:
48
+ continue
49
+ seen.add(key)
50
+ result.append(line)
51
+ return result
52
+
53
+
54
+ # ---------------------------------------------------------------------------
55
+ # filter_low_quality_block_facts
56
+ # ---------------------------------------------------------------------------
57
+
58
+ def filter_low_quality_block_facts(facts: list[dict]) -> list[dict]:
59
+ """Filter fact dicts whose content is low-quality or prompt-template.
60
+
61
+ Delegates to injection.is_low_quality and injection.is_prompt_template.
62
+ Returns a new list — never mutates input.
63
+ """
64
+ try:
65
+ from superlocalmemory.core.injection import is_low_quality, is_prompt_template
66
+ except Exception:
67
+ return list(facts)
68
+
69
+ result: list[dict] = []
70
+ for f in facts:
71
+ content = f.get("content", "") or ""
72
+ if is_low_quality(content):
73
+ continue
74
+ if is_prompt_template(content):
75
+ continue
76
+ result.append(f)
77
+ return result
78
+
79
+
80
+ # ---------------------------------------------------------------------------
81
+ # compile_block_content
82
+ # ---------------------------------------------------------------------------
83
+
84
+ def compile_block_content(
85
+ facts: list[dict],
86
+ max_chars: int = 2000,
87
+ ) -> str:
88
+ """Compile facts into block content with hygiene and char cap.
89
+
90
+ Pipeline:
91
+ 1. filter_low_quality_block_facts
92
+ 2. Extract content lines from each fact (split by newline / separator)
93
+ 3. dedupe_block_content across all lines
94
+ 4. Join with separator, truncate to max_chars
95
+
96
+ Returns a string ≤ max_chars. Returns empty string if all facts filtered.
97
+ """
98
+ clean_facts = filter_low_quality_block_facts(facts)
99
+ if not clean_facts:
100
+ return ""
101
+
102
+ all_lines: list[str] = []
103
+ for f in clean_facts:
104
+ content = (f.get("content") or "").strip()
105
+ if not content:
106
+ continue
107
+ # Split by separator or newline to treat each line independently
108
+ for line in content.replace(_BLOCK_SEPARATOR, "\n").split("\n"):
109
+ all_lines.append(line)
110
+
111
+ deduped = dedupe_block_content(all_lines)
112
+ if not deduped:
113
+ return ""
114
+
115
+ joined = _BLOCK_SEPARATOR.join(deduped)
116
+ return joined[:max_chars]
117
+
118
+
119
+ # ---------------------------------------------------------------------------
120
+ # _recompile_core_blocks — scheduler hook (F-5 daily recompile)
121
+ # ---------------------------------------------------------------------------
122
+
123
+ def _recompile_core_blocks(
124
+ db,
125
+ config,
126
+ profile_id: str,
127
+ ) -> dict:
128
+ """Recompile core memory blocks with hygiene applied.
129
+
130
+ Called by MaintenanceScheduler._run() on the daily cycle.
131
+ Delegates to ConsolidationEngine.compile_core_blocks_mode_a() with
132
+ the hygiene improvements applied at the _facts_to_content step.
133
+
134
+ Returns a dict with stats: {blocks_compiled, profile_id}.
135
+ """
136
+ try:
137
+ from superlocalmemory.core.consolidation_engine import ConsolidationEngine
138
+ engine = ConsolidationEngine(db=db, config=config.consolidation)
139
+ result = engine.compile_core_blocks_mode_a(profile_id)
140
+ logger.info(
141
+ "Daily core-block recompile: profile=%s blocks=%s",
142
+ profile_id, result.get("blocks_compiled", 0),
143
+ )
144
+ return {**result, "profile_id": profile_id}
145
+ except Exception as exc:
146
+ logger.warning("Core-block recompile failed: %s", exc)
147
+ return {"blocks_compiled": 0, "profile_id": profile_id, "error": str(exc)}
@@ -197,6 +197,17 @@ class RetrievalConfig:
197
197
  # Used by s19_runner for ablation experiments. Empty = all channels active.
198
198
  disabled_channels: list[str] = field(default_factory=list)
199
199
 
200
+ # v3.6.6: Evidence floor — gate on per-channel scores, not fused/RRF score.
201
+ # Nonsense queries earn 0.0 on every primary channel; real matches earn
202
+ # semantic >= 0.85 or bm25 > 0. The discriminator is earned channel evidence.
203
+ # Env kill-switch: SLM_RECALL_NO_FLOOR=1 disables without release.
204
+ evidence_floor_enabled: bool = True
205
+ min_semantic_evidence: float = 0.60 # Minimum cosine similarity to keep a result
206
+
207
+ # v3.6.6: Recall output budget — protect consuming agents from 585KB responses.
208
+ recall_per_fact_max_chars: int = 2400 # ~600 tokens; head 70% + tail 30%
209
+ recall_total_max_chars: int = 12000 # ~3K tokens; stubs beyond this
210
+
200
211
 
201
212
  # ---------------------------------------------------------------------------
202
213
  # Math Config
@@ -233,6 +244,30 @@ class MathConfig:
233
244
  # Rate-Distortion (production only, disabled for benchmarks)
234
245
 
235
246
 
247
+ # ---------------------------------------------------------------------------
248
+ # Store Config (v3.6.6)
249
+ # ---------------------------------------------------------------------------
250
+
251
+ @dataclass(frozen=True)
252
+ class StoreConfig:
253
+ """Configuration for the remember/store write path (v3.6.6).
254
+
255
+ Ingest gate: protect the DB from oversized facts and prompt-template
256
+ pollution. Defaults ON; env kill-switch SLM_INGEST_NO_GATE=1.
257
+ """
258
+
259
+ # Max chars for the FACT content stored in atomic_facts.content.
260
+ # Content above this is clamped to head 70% + tail 30% + truncation marker.
261
+ # The FULL original is preserved in the memories table row. Set high (24K
262
+ # ≈ 6K tokens) so only pathological pastes are touched; normal dense
263
+ # session-handoff memories (6-15K chars) are stored 100% intact.
264
+ max_verbatim_chars: int = 24000
265
+
266
+ # Hard upper bound in bytes. Content above this is rejected outright.
267
+ # Nobody's "memory" is a megabyte (MCP: success=False, HTTP: 413).
268
+ max_ingest_bytes: int = 1_048_576 # 1 MB
269
+
270
+
236
271
  # ---------------------------------------------------------------------------
237
272
  # Context Injection (v3.4.65)
238
273
  # ---------------------------------------------------------------------------
@@ -658,6 +693,7 @@ class SLMConfig:
658
693
  default_factory=ParameterizationConfig,
659
694
  )
660
695
  injection: InjectionConfig = field(default_factory=InjectionConfig)
696
+ store: StoreConfig = field(default_factory=StoreConfig)
661
697
  # v3.5.0: scaling backends — "sqlite" / "cozo" / "auto" / "lancedb" / "sqlite-vec" / "auto".
662
698
  graph_backend: str = "auto" # "auto" = cozo if pycozo installed, else sqlite
663
699
  vector_backend: str = "auto" # "auto" = lancedb if installed, else sqlite-vec
@@ -808,22 +808,25 @@ class ConsolidationEngine:
808
808
  def _facts_to_content(
809
809
  self, facts: list[dict], char_limit: int,
810
810
  ) -> str:
811
- """Join fact contents with separators, capped at char_limit."""
812
- parts = [f.get("content", "") for f in facts if f.get("content")]
813
- joined = "\n---\n".join(parts)
814
- return joined[:char_limit] if joined else "No data available."
811
+ """Compile fact contents into a block with hygiene (v3.6.6 F-5).
812
+
813
+ Filters low-quality/template facts, dedupes lines WITHIN the block
814
+ (fixes the "same fixture ×5" core-block bug), caps at char_limit.
815
+ """
816
+ from superlocalmemory.core.block_hygiene import compile_block_content
817
+ compiled = compile_block_content(facts, max_chars=char_limit)
818
+ return compiled if compiled else "No data available."
815
819
 
816
820
  def _rows_to_content(
817
821
  self, rows: list | None, char_limit: int,
818
822
  ) -> str:
819
- """Convert DB rows to content string."""
823
+ """Convert DB rows to a hygienic block content string (v3.6.6 F-5)."""
820
824
  if not rows:
821
825
  return "No data available."
822
- parts = [
823
- dict(r).get("content", "") for r in rows if dict(r).get("content")
824
- ]
825
- joined = "\n---\n".join(parts)
826
- return joined[:char_limit] if joined else "No data available."
826
+ from superlocalmemory.core.block_hygiene import compile_block_content
827
+ facts = [dict(r) for r in rows]
828
+ compiled = compile_block_content(facts, max_chars=char_limit)
829
+ return compiled if compiled else "No data available."
827
830
 
828
831
  def _compile_behavioral_block(
829
832
  self, profile_id: str, char_limit: int,
@@ -430,6 +430,25 @@ class MemoryEngine:
430
430
  return []
431
431
  except Exception:
432
432
  pass
433
+ # v3.6.6 ingest gate: reject 1MB monsters + prompt-template pollution;
434
+ # clamp the searchable FACT copy (head+tail) while the memories row keeps
435
+ # the FULL original. Embedding/BM25 use the clamped copy so a 167KB paste
436
+ # never produces a garbage vector. Env kill-switch: SLM_INGEST_NO_GATE=1.
437
+ fact_text = content
438
+ try:
439
+ from superlocalmemory.core.ingest_gate import apply_ingest_gate
440
+ _sc = getattr(self._config, "store", None)
441
+ gate = apply_ingest_gate(
442
+ content,
443
+ max_verbatim_chars=getattr(_sc, "max_verbatim_chars", 24000),
444
+ max_ingest_bytes=getattr(_sc, "max_ingest_bytes", 1_048_576),
445
+ )
446
+ if gate.rejected:
447
+ logger.debug("store_fast ingest gate rejected: %s", gate.rejection_reason)
448
+ return []
449
+ fact_text = gate.fact_content
450
+ except ImportError:
451
+ pass # gate module missing → store verbatim (never block a write)
433
452
  now = datetime.now(timezone.utc).isoformat()
434
453
  record = MemoryRecord(
435
454
  profile_id=self._profile_id, content=content,
@@ -440,8 +459,8 @@ class MemoryEngine:
440
459
  # the entity_graph channel has something to work with before enrichment.
441
460
  ents = sorted(
442
461
  {m.group(1) for m in _re.finditer(
443
- r"\b([A-Z][a-z]+(?:\s[A-Z][a-z]+){0,3})\b", content)}
444
- | {m.group(1) for m in _re.finditer(r"\b([A-Z]{2,})\b", content)}
462
+ r"\b([A-Z][a-z]+(?:\s[A-Z][a-z]+){0,3})\b", fact_text)}
463
+ | {m.group(1) for m in _re.finditer(r"\b([A-Z]{2,})\b", fact_text)}
445
464
  )
446
465
  # v3.5.5: compute the embedding SYNCHRONOUSLY. A single warm embed is
447
466
  # ~22ms (the 30-180s of full store() was LLM fact-extraction + graph,
@@ -452,14 +471,14 @@ class MemoryEngine:
452
471
  emb = None
453
472
  fmean = fvar = None
454
473
  try:
455
- emb = self._embedder.embed(content) if self._embedder else None
474
+ emb = self._embedder.embed(fact_text) if self._embedder else None
456
475
  if emb:
457
476
  fmean, fvar = self._embedder.compute_fisher_params(emb)
458
477
  except Exception:
459
478
  emb = None
460
479
  fact = AtomicFact(
461
480
  fact_id=_uuid.uuid4().hex[:16], memory_id=record.memory_id,
462
- profile_id=self._profile_id, content=content,
481
+ profile_id=self._profile_id, content=fact_text,
463
482
  fact_type=FactType.EPISODIC, entities=ents,
464
483
  observation_date=now[:10], confidence=0.7, importance=0.5,
465
484
  embedding=emb, fisher_mean=fmean, fisher_variance=fvar,
@@ -477,7 +496,7 @@ class MemoryEngine:
477
496
  try:
478
497
  bm25 = getattr(self._retrieval_engine, "_bm25", None)
479
498
  if bm25:
480
- bm25.add(fact.fact_id, content, self._profile_id)
499
+ bm25.add(fact.fact_id, fact_text, self._profile_id)
481
500
  except Exception:
482
501
  pass
483
502
  return [fact.fact_id]
@@ -0,0 +1,133 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under AGPL-3.0-or-later - see LICENSE file
3
+ # Part of SuperLocalMemory V3 — Ingest Gate (v3.6.6)
4
+
5
+ """Ingest gate for the remember/store write path (v3.6.6 F-4).
6
+
7
+ Responsibilities:
8
+ 1. Hard reject content > 1MB (nobody's memory is a megabyte).
9
+ 2. Clamp content > 24000 chars to head 70% + tail 30% + truncation marker.
10
+ Head+tail (not head-only) preserves OPEN ITEMS that session-close facts put
11
+ at the END. Only pathological pastes (167KB JSON, 50KB logs) are touched;
12
+ normal dense memories (6-15K session handoffs) pass through intact.
13
+ Full original preserved in result.full_content for storage in memories table.
14
+ 3. Prompt-template firewall: reject content matching _PROMPT_TEMPLATE_PATTERNS
15
+ (extends v3.6.4 remember-write-02 quality gate).
16
+
17
+ Kill-switch: SLM_INGEST_NO_GATE=1 bypasses rules 2 and 3 (but NOT the 1MB hard cap).
18
+
19
+ Usage::
20
+ from superlocalmemory.core.ingest_gate import apply_ingest_gate
21
+ result = apply_ingest_gate(content)
22
+ if result.rejected:
23
+ return {"success": False, "error": result.rejection_reason}
24
+ store(result.fact_content, full_content=result.full_content)
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import os
30
+ from dataclasses import dataclass, field
31
+
32
+ # v3.6.6: clamp only pathological monsters; preserve normal dense memories.
33
+ # 24K chars ≈ 6K tokens — well beyond any legitimate single memory.
34
+ _MAX_VERBATIM_CHARS = 24000
35
+ _HEAD_FRACTION = 0.70 # head 70% + tail 30% so OPEN ITEMS at the end survive
36
+ _MAX_INGEST_BYTES = 1_048_576 # 1MB — hard cap, NOT bypassed by kill-switch
37
+ _TRUNCATION_MARKER = "\n…[content truncated at ingest; full text in source memory]…\n"
38
+
39
+
40
+ @dataclass
41
+ class IngestGateResult:
42
+ """Result of applying the ingest gate to content.
43
+
44
+ fact_content: Content to store in atomic_facts.content (may be truncated).
45
+ full_content: Original unmodified content (for memories table storage).
46
+ rejected: True if content should be rejected outright.
47
+ rejection_reason: Human-readable reason for rejection (when rejected=True).
48
+ truncated: True if fact_content was head-sliced.
49
+ """
50
+ fact_content: str
51
+ full_content: str
52
+ rejected: bool = False
53
+ rejection_reason: str = ""
54
+ truncated: bool = False
55
+
56
+
57
+ def apply_ingest_gate(
58
+ content: str,
59
+ max_verbatim_chars: int = _MAX_VERBATIM_CHARS,
60
+ max_ingest_bytes: int = _MAX_INGEST_BYTES,
61
+ ) -> IngestGateResult:
62
+ """Apply the ingest quality gate to content before storing.
63
+
64
+ Returns IngestGateResult. Callers MUST check result.rejected before
65
+ proceeding with storage.
66
+
67
+ Kill-switch SLM_INGEST_NO_GATE=1 bypasses the verbatim size clamp and
68
+ template firewall but NOT the 1MB hard cap (safety boundary).
69
+ """
70
+ gate_active = os.environ.get("SLM_INGEST_NO_GATE", "0") != "1"
71
+
72
+ # --- Hard cap: 1MB regardless of kill-switch ---
73
+ try:
74
+ byte_len = len(content.encode("utf-8", errors="replace"))
75
+ except Exception:
76
+ byte_len = len(content)
77
+ if byte_len > max_ingest_bytes:
78
+ return IngestGateResult(
79
+ fact_content=content,
80
+ full_content=content,
81
+ rejected=True,
82
+ rejection_reason=(
83
+ f"Content size {byte_len} bytes exceeds maximum "
84
+ f"{max_ingest_bytes} bytes (1MB). "
85
+ "Nobody's memory is a megabyte."
86
+ ),
87
+ )
88
+
89
+ # --- Gate bypassed ---
90
+ if not gate_active:
91
+ return IngestGateResult(
92
+ fact_content=content,
93
+ full_content=content,
94
+ rejected=False,
95
+ truncated=False,
96
+ )
97
+
98
+ # --- Prompt-template firewall ---
99
+ # Extends the v3.6.4 remember-write-02 quality gate.
100
+ try:
101
+ from superlocalmemory.core.injection import is_prompt_template
102
+ if is_prompt_template(content):
103
+ return IngestGateResult(
104
+ fact_content=content,
105
+ full_content=content,
106
+ rejected=True,
107
+ rejection_reason=(
108
+ "Content matches internal prompt-template patterns "
109
+ "(low-quality gate). Prompt machinery must not be stored as memory."
110
+ ),
111
+ )
112
+ except Exception:
113
+ pass # Defensive: gate failure must never block a store
114
+
115
+ # --- Verbatim size clamp (head 70% + tail 30%) ---
116
+ if len(content) > max_verbatim_chars:
117
+ budget = max_verbatim_chars - len(_TRUNCATION_MARKER)
118
+ head_len = int(budget * _HEAD_FRACTION)
119
+ tail_len = budget - head_len
120
+ fact_content = content[:head_len] + _TRUNCATION_MARKER + content[-tail_len:]
121
+ return IngestGateResult(
122
+ fact_content=fact_content,
123
+ full_content=content,
124
+ rejected=False,
125
+ truncated=True,
126
+ )
127
+
128
+ return IngestGateResult(
129
+ fact_content=content,
130
+ full_content=content,
131
+ rejected=False,
132
+ truncated=False,
133
+ )
@@ -35,6 +35,33 @@ _LOW_QUALITY_PATTERNS = (
35
35
  re.compile(r"the first line must be exactly", re.IGNORECASE),
36
36
  )
37
37
 
38
+ # v3.6.6: Prompt-template firewall patterns (F-3, F-4).
39
+ # These patterns identify content that is internal LLM prompt machinery,
40
+ # not genuine user memories. Used at ingest (F-4) and recall serialization (F-3).
41
+ # Stdlib-only (re module) so hooks import chain stays light.
42
+ _PROMPT_TEMPLATE_PATTERNS = (
43
+ re.compile(r"you are summarizing a claude code session", re.IGNORECASE),
44
+ re.compile(r"you are a memory consolidation agent", re.IGNORECASE),
45
+ re.compile(r"apply maximum non-destructive compression", re.IGNORECASE),
46
+ re.compile(r"<task-notification\b", re.IGNORECASE),
47
+ )
48
+
49
+
50
+ def is_prompt_template(content: str) -> bool:
51
+ """True if *content* matches internal prompt-template patterns.
52
+
53
+ Used by:
54
+ - F-3: drop source_content that is prompt machinery
55
+ - F-4: reject template content at ingest (extends v3.6.4 quality gate)
56
+
57
+ Separate from is_low_quality() so the firewall can be applied without
58
+ the full quality-check heuristics (e.g. at raw ingest before any
59
+ other processing).
60
+ """
61
+ if not content:
62
+ return False
63
+ return any(pat.search(content) for pat in _PROMPT_TEMPLATE_PATTERNS)
64
+
38
65
  # Leading category tag like "[active_decisions] " / "[learned_preferences] ".
39
66
  _CATEGORY_TAG_RE = re.compile(r"^\s*\[[a-z0-9_]+\]\s*", re.IGNORECASE)
40
67
 
@@ -124,6 +124,15 @@ class MaintenanceScheduler:
124
124
  except Exception as exc:
125
125
  logger.debug("Pending cleanup skipped: %s", exc)
126
126
 
127
+ # v3.6.6 F-5: Daily core-block recompile with hygiene (dedup + char cap).
128
+ # Ensures blocks stay clean even when purge or new facts arrive between
129
+ # session-init recompiles.
130
+ try:
131
+ from superlocalmemory.core.block_hygiene import _recompile_core_blocks
132
+ _recompile_core_blocks(self._db, self._config, self._profile_id)
133
+ except Exception as exc:
134
+ logger.debug("Core-block recompile skipped: %s", exc)
135
+
127
136
  self._schedule_next()
128
137
 
129
138
  def _sync_cloud_destinations(self, manager: object) -> None:
@@ -324,6 +324,8 @@ def apply_adaptive_ranking(
324
324
  channel_weights=response.channel_weights,
325
325
  total_candidates=response.total_candidates,
326
326
  retrieval_time_ms=response.retrieval_time_ms,
327
+ # v3.6.6: preserve evidence-floor signal across reranking rebuilds.
328
+ no_confident_match=(len(new_results) == 0) and response.no_confident_match,
327
329
  )
328
330
 
329
331
 
@@ -426,6 +428,8 @@ def apply_v2_adaptive_ranking(
426
428
  channel_weights=response.channel_weights,
427
429
  total_candidates=response.total_candidates,
428
430
  retrieval_time_ms=response.retrieval_time_ms,
431
+ # v3.6.6: preserve evidence-floor signal across reranking rebuilds.
432
+ no_confident_match=(len(new_results) == 0) and response.no_confident_match,
429
433
  )
430
434
  except Exception as exc: # pragma: no cover — defensive
431
435
  logger.debug("apply_v2_adaptive_ranking skipped: %s", exc)
@@ -554,6 +558,8 @@ def apply_v2_bandit_ensemble(
554
558
  channel_weights=response.channel_weights,
555
559
  total_candidates=response.total_candidates,
556
560
  retrieval_time_ms=response.retrieval_time_ms,
561
+ # v3.6.6: preserve evidence-floor signal across ensemble rebuilds.
562
+ no_confident_match=(len(final_results) == 0) and response.no_confident_match,
557
563
  )
558
564
  except Exception as exc: # pragma: no cover — defensive top-level
559
565
  logger.debug("apply_v2_bandit_ensemble skipped: %s", exc)
@@ -675,6 +681,9 @@ def run_recall(
675
681
  channel_weights=response.channel_weights,
676
682
  total_candidates=response.total_candidates + len(enhanced_facts),
677
683
  retrieval_time_ms=response.retrieval_time_ms,
684
+ # v3.6.6: agentic round-2 may add facts; recompute flag.
685
+ no_confident_match=(len(enhanced_results[:limit]) == 0)
686
+ and response.no_confident_match,
678
687
  )
679
688
  except Exception as exc:
680
689
  logger.debug("Agentic sufficiency skipped: %s", exc)