superlocalmemory 3.7.7__tar.gz → 3.7.8__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 (569) hide show
  1. {superlocalmemory-3.7.7/src/superlocalmemory.egg-info → superlocalmemory-3.7.8}/PKG-INFO +3 -4
  2. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/README.md +2 -2
  3. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/pyproject.toml +1 -2
  4. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/__init__.py +1 -1
  5. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/commands.py +2 -2
  6. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/auth_middleware.py +28 -0
  7. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_core.py +42 -4
  8. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/api.py +17 -0
  9. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/chat.py +63 -12
  10. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/memories.py +58 -11
  11. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/v3_api.py +31 -32
  12. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/ui.py +10 -0
  13. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/unified_daemon.py +47 -19
  14. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v32.py +0 -9
  15. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8/src/superlocalmemory.egg-info}/PKG-INFO +3 -4
  16. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory.egg-info/requires.txt +0 -1
  17. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/AUTHORS.md +0 -0
  18. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/LICENSE +0 -0
  19. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/NOTICE +0 -0
  20. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-cache/SKILL.md +0 -0
  21. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-compress/SKILL.md +0 -0
  22. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-graph/SKILL.md +0 -0
  23. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-recall/SKILL.md +0 -0
  24. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-remember/SKILL.md +0 -0
  25. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-session/SKILL.md +0 -0
  26. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/plugin-src/skills/slm-status/SKILL.md +0 -0
  27. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/setup.cfg +0 -0
  28. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/attribution/__init__.py +0 -0
  29. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
  30. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/attribution/signer.py +0 -0
  31. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/attribution/watermark.py +0 -0
  32. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/__init__.py +0 -0
  33. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/_lazy_init.py +0 -0
  34. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/cache_cmd.py +0 -0
  35. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/compress_cmd.py +0 -0
  36. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/context_commands.py +0 -0
  37. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/daemon.py +0 -0
  38. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/db_migrate.py +0 -0
  39. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/diagnostics_cmd.py +0 -0
  40. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/escape_hatch.py +0 -0
  41. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/evidence_cmd.py +0 -0
  42. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/help_cmd.py +0 -0
  43. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/ingest_cmd.py +0 -0
  44. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/json_output.py +0 -0
  45. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/main.py +0 -0
  46. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
  47. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
  48. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/optimize_constants.py +0 -0
  49. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/pending_store.py +0 -0
  50. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/post_install.py +0 -0
  51. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
  52. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/scale_engine_cmd.py +0 -0
  53. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/service_installer.py +0 -0
  54. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/setup_wizard.py +0 -0
  55. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/version_banner.py +0 -0
  56. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
  57. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/__init__.py +0 -0
  58. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
  59. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
  60. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
  61. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
  62. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
  63. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
  64. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
  65. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/changes.py +0 -0
  66. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/communities.py +0 -0
  67. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/config.py +0 -0
  68. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/database.py +0 -0
  69. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
  70. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
  71. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
  72. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/flows.py +0 -0
  73. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
  74. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
  75. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/graph_store.py +0 -0
  76. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/incremental.py +0 -0
  77. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/models.py +0 -0
  78. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/parser.py +0 -0
  79. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/resolver.py +0 -0
  80. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/search.py +0 -0
  81. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/service.py +0 -0
  82. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/code_graph/watcher.py +0 -0
  83. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/__init__.py +0 -0
  84. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/abac.py +0 -0
  85. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/audit.py +0 -0
  86. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
  87. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/gdpr.py +0 -0
  88. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/lifecycle.py +0 -0
  89. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/retention.py +0 -0
  90. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/compliance/scheduler.py +0 -0
  91. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/__init__.py +0 -0
  92. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
  93. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/block_hygiene.py +0 -0
  94. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/clock_monitor.py +0 -0
  95. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/config.py +0 -0
  96. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/consolidation_engine.py +0 -0
  97. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/context_cache.py +0 -0
  98. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/db_pool.py +0 -0
  99. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/derivation_lineage.py +0 -0
  100. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/embedding_worker.py +0 -0
  101. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/embeddings.py +0 -0
  102. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/engine.py +0 -0
  103. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/engine_capabilities.py +0 -0
  104. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/engine_ingestion.py +0 -0
  105. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/engine_lock.py +0 -0
  106. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/engine_wiring.py +0 -0
  107. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/error_catalog.py +0 -0
  108. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/error_envelope.py +0 -0
  109. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/evidence_bundle.py +0 -0
  110. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/fact_consolidator.py +0 -0
  111. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/file_lock.py +0 -0
  112. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/graph_analyzer.py +0 -0
  113. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/graph_pruner.py +0 -0
  114. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/health_monitor.py +0 -0
  115. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/hooks.py +0 -0
  116. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/ingest_gate.py +0 -0
  117. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/ingestion_command.py +0 -0
  118. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/injection.py +0 -0
  119. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/lifecycle_state.py +0 -0
  120. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/loop_watchdog.py +0 -0
  121. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/maintenance.py +0 -0
  122. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/maintenance_scheduler.py +0 -0
  123. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
  124. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/modes.py +0 -0
  125. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/mutations.py +0 -0
  126. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/ollama_embedder.py +0 -0
  127. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/platform_utils.py +0 -0
  128. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/priority_queue.py +0 -0
  129. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/profiles.py +0 -0
  130. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/pruning_engine.py +0 -0
  131. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/queue_consumer.py +0 -0
  132. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
  133. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/ram_lock.py +0 -0
  134. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/rate_limit.py +0 -0
  135. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/recall_gate.py +0 -0
  136. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/recall_pipeline.py +0 -0
  137. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/recall_queue.py +0 -0
  138. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/recall_worker.py +0 -0
  139. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/registry.py +0 -0
  140. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/remote_mode.py +0 -0
  141. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/reranker_worker.py +0 -0
  142. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/safe_fs.py +0 -0
  143. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/scale_engine.py +0 -0
  144. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/score_contract.py +0 -0
  145. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/security_primitives.py +0 -0
  146. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/shadow_router.py +0 -0
  147. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/slm_disabled.py +0 -0
  148. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/slmignore.py +0 -0
  149. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/store_pipeline.py +0 -0
  150. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/summarizer.py +0 -0
  151. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/tier_manager.py +0 -0
  152. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/topic_signature.py +0 -0
  153. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/core/worker_pool.py +0 -0
  154. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/dynamics/__init__.py +0 -0
  155. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
  156. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
  157. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
  158. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
  159. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/__init__.py +0 -0
  160. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/auto_linker.py +0 -0
  161. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
  162. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/consolidator.py +0 -0
  163. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/context_generator.py +0 -0
  164. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/emotional.py +0 -0
  165. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/entity_resolver.py +0 -0
  166. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
  167. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
  168. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/foresight.py +0 -0
  169. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/graph_builder.py +0 -0
  170. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/observation_builder.py +0 -0
  171. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/scene_builder.py +0 -0
  172. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/signal_inference.py +0 -0
  173. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
  174. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
  175. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/encoding/type_router.py +0 -0
  176. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evaluation/__init__.py +0 -0
  177. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evaluation/calibration.py +0 -0
  178. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/__init__.py +0 -0
  179. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
  180. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/budget.py +0 -0
  181. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/evolution_store.py +0 -0
  182. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
  183. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
  184. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
  185. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/triggers.py +0 -0
  186. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/evolution/types.py +0 -0
  187. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/graph/__init__.py +0 -0
  188. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/graph/cozo_backend.py +0 -0
  189. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/__init__.py +0 -0
  190. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/_outcome_common.py +0 -0
  191. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/adapter_base.py +0 -0
  192. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
  193. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/auto_capture.py +0 -0
  194. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
  195. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
  196. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/auto_recall.py +0 -0
  197. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
  198. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
  199. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
  200. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/codex_assets.py +0 -0
  201. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/codex_hooks.py +0 -0
  202. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/context_payload.py +0 -0
  203. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
  204. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
  205. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
  206. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
  207. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
  208. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/ide_connector.py +0 -0
  209. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/memory_protocol.py +0 -0
  210. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/portable_kit.py +0 -0
  211. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
  212. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
  213. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/prewarm_auth.py +0 -0
  214. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/rules_engine.py +0 -0
  215. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/session_registry.py +0 -0
  216. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
  217. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/sync_loop.py +0 -0
  218. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
  219. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
  220. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
  221. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/__init__.py +0 -0
  222. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/backup.py +0 -0
  223. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/cache_manager.py +0 -0
  224. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/cloud_backup.py +0 -0
  225. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/daemon_identity.py +0 -0
  226. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/data_root.py +0 -0
  227. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/event_bus.py +0 -0
  228. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
  229. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/local_diagnostics.py +0 -0
  230. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/pid_manager.py +0 -0
  231. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/process_reaper.py +0 -0
  232. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/rate_limiter.py +0 -0
  233. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
  234. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/__init__.py +0 -0
  235. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
  236. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
  237. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
  238. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/credentials.py +0 -0
  239. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
  240. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/parsers.py +0 -0
  241. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
  242. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/__init__.py +0 -0
  243. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/adaptive.py +0 -0
  244. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/arm_catalog.py +0 -0
  245. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/assertion_miner.py +0 -0
  246. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/bandit.py +0 -0
  247. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/bandit_cache.py +0 -0
  248. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/behavioral.py +0 -0
  249. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/behavioral_listener.py +0 -0
  250. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/bootstrap.py +0 -0
  251. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/consolidation_cycle.py +0 -0
  252. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
  253. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
  254. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/cross_project.py +0 -0
  255. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/database.py +0 -0
  256. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
  257. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/engagement.py +0 -0
  258. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/ensemble.py +0 -0
  259. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/entity_compiler.py +0 -0
  260. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
  261. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/features.py +0 -0
  262. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/feedback.py +0 -0
  263. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
  264. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
  265. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/labeler.py +0 -0
  266. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/legacy_migration.py +0 -0
  267. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
  268. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/memory_merge.py +0 -0
  269. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/model_cache.py +0 -0
  270. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/model_rollback.py +0 -0
  271. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/outcome_queue.py +0 -0
  272. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/outcomes.py +0 -0
  273. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/pattern_miner.py +0 -0
  274. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
  275. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/project_context.py +0 -0
  276. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
  277. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/ranker.py +0 -0
  278. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/ranker_common.py +0 -0
  279. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
  280. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
  281. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/reward.py +0 -0
  282. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/reward_archive.py +0 -0
  283. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/reward_boost.py +0 -0
  284. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/reward_proxy.py +0 -0
  285. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/shadow_test.py +0 -0
  286. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/signal_worker.py +0 -0
  287. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/signals.py +0 -0
  288. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
  289. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/source_quality.py +0 -0
  290. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/trigram_index.py +0 -0
  291. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/learning/workflows.py +0 -0
  292. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/llm/__init__.py +0 -0
  293. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/llm/backbone.py +0 -0
  294. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/__init__.py +0 -0
  295. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/ebbinghaus.py +0 -0
  296. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/fisher.py +0 -0
  297. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/fisher_quantized.py +0 -0
  298. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/hopfield.py +0 -0
  299. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/langevin.py +0 -0
  300. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/polar_quant.py +0 -0
  301. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/qjl.py +0 -0
  302. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/sheaf.py +0 -0
  303. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/math/turbo_quant.py +0 -0
  304. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/__init__.py +0 -0
  305. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
  306. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
  307. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/_stdin_guard.py +0 -0
  308. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/agent_context.py +0 -0
  309. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/cli_fallback.py +0 -0
  310. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/http_transport.py +0 -0
  311. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/resources.py +0 -0
  312. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/server.py +0 -0
  313. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/shared.py +0 -0
  314. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools.py +0 -0
  315. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_active.py +0 -0
  316. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
  317. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_context.py +0 -0
  318. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
  319. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_learning.py +0 -0
  320. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
  321. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_optimize.py +0 -0
  322. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_v28.py +0 -0
  323. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_v3.py +0 -0
  324. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mcp/tools_v33.py +0 -0
  325. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mesh/__init__.py +0 -0
  326. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mesh/broker.py +0 -0
  327. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/mesh/remote_sync.py +0 -0
  328. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/migrations/__init__.py +0 -0
  329. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
  330. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/NOTICE +0 -0
  331. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/__init__.py +0 -0
  332. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
  333. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
  334. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
  335. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
  336. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
  337. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
  338. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
  339. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
  340. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
  341. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/exact.py +0 -0
  342. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
  343. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
  344. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/manager.py +0 -0
  345. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
  346. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
  347. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
  348. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/compress/align.py +0 -0
  349. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
  350. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
  351. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/compress/router.py +0 -0
  352. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/config/__init__.py +0 -0
  353. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/config/defaults.py +0 -0
  354. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/config/schema.py +0 -0
  355. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/config/store.py +0 -0
  356. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
  357. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
  358. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
  359. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
  360. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
  361. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
  362. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
  363. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
  364. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/capture.py +0 -0
  365. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
  366. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
  367. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
  368. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/server.py +0 -0
  369. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -0
  370. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
  371. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/storage/db.py +0 -0
  372. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/optimize/storage/schema.py +0 -0
  373. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/__init__.py +0 -0
  374. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
  375. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
  376. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
  377. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
  378. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
  379. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/__init__.py +0 -0
  380. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/agentic.py +0 -0
  381. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/ann_index.py +0 -0
  382. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
  383. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
  384. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
  385. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/engine.py +0 -0
  386. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
  387. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
  388. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/fusion.py +0 -0
  389. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
  390. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
  391. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
  392. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/reranker.py +0 -0
  393. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/scope_policy.py +0 -0
  394. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
  395. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/spreading_activation.py +0 -0
  396. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/strategy.py +0 -0
  397. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
  398. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/retrieval/vector_store.py +0 -0
  399. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/__init__.py +0 -0
  400. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/bandit_loops.py +0 -0
  401. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/middleware/__init__.py +0 -0
  402. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
  403. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/profile_runtime.py +0 -0
  404. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/recall_health.py +0 -0
  405. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/recall_serializer.py +0 -0
  406. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/route_mutations.py +0 -0
  407. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/__init__.py +0 -0
  408. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/adapters.py +0 -0
  409. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/agents.py +0 -0
  410. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/backup.py +0 -0
  411. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/behavioral.py +0 -0
  412. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/brain.py +0 -0
  413. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/compliance.py +0 -0
  414. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/data_io.py +0 -0
  415. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/entity.py +0 -0
  416. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/events.py +0 -0
  417. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/evolution.py +0 -0
  418. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/helpers.py +0 -0
  419. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/ingest.py +0 -0
  420. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/insights.py +0 -0
  421. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/learning.py +0 -0
  422. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
  423. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/mesh.py +0 -0
  424. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/optimize.py +0 -0
  425. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/prewarm.py +0 -0
  426. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/profiles.py +0 -0
  427. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/stats.py +0 -0
  428. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/tiers.py +0 -0
  429. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/timeline.py +0 -0
  430. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/token.py +0 -0
  431. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/routes/ws.py +0 -0
  432. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/security_middleware.py +0 -0
  433. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/server/write_identity.py +0 -0
  434. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/__init__.py +0 -0
  435. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/access_control.py +0 -0
  436. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/access_log.py +0 -0
  437. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/database.py +0 -0
  438. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/embedding_migrator.py +0 -0
  439. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/logical_edges.py +0 -0
  440. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migration_runner.py +0 -0
  441. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migration_v33.py +0 -0
  442. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
  443. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
  444. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
  445. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
  446. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
  447. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
  448. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
  449. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
  450. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
  451. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
  452. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
  453. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
  454. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
  455. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
  456. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -0
  457. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -0
  458. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -0
  459. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -0
  460. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -0
  461. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
  462. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/migrations.py +0 -0
  463. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/models.py +0 -0
  464. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/quantized_store.py +0 -0
  465. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema.py +0 -0
  466. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
  467. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v3410.py +0 -0
  468. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v3411.py +0 -0
  469. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v343.py +0 -0
  470. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v345.py +0 -0
  471. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/schema_v347.py +0 -0
  472. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/sqlite_vectors.py +0 -0
  473. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/storage/v2_migrator.py +0 -0
  474. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/trust/__init__.py +0 -0
  475. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/trust/gate.py +0 -0
  476. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/trust/provenance.py +0 -0
  477. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/trust/scorer.py +0 -0
  478. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/trust/signals.py +0 -0
  479. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/css/brain.css +0 -0
  480. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
  481. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
  482. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/favicon.svg +0 -0
  483. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/index.html +0 -0
  484. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/agents.js +0 -0
  485. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
  486. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/brain.js +0 -0
  487. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/clusters.js +0 -0
  488. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/compliance.js +0 -0
  489. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/core.js +0 -0
  490. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/dashboard.js +0 -0
  491. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/events.js +0 -0
  492. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
  493. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/feedback.js +0 -0
  494. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
  495. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
  496. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
  497. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ide-status.js +0 -0
  498. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/init.js +0 -0
  499. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
  500. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
  501. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/math-health.js +0 -0
  502. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/memories.js +0 -0
  503. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
  504. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
  505. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/modal.js +0 -0
  506. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
  507. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-health.js +0 -0
  508. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
  509. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
  510. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
  511. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
  512. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/optimize.js +0 -0
  513. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/profiles.js +0 -0
  514. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
  515. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
  516. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/search.js +0 -0
  517. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/settings.js +0 -0
  518. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/timeline.js +0 -0
  519. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
  520. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  521. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  522. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  523. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
  524. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
  525. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
  526. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
  527. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
  528. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
  529. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  530. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  531. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
  532. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/vector/__init__.py +0 -0
  533. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
  534. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory.egg-info/SOURCES.txt +0 -0
  535. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
  536. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
  537. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/src/superlocalmemory.egg-info/top_level.txt +0 -0
  538. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_auto_hooks.py +0 -0
  539. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_before_web_hook.py +0 -0
  540. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_behavioral_full.py +0 -0
  541. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_claude_hooks.py +0 -0
  542. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_cli_core.py +0 -0
  543. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_cli_json.py +0 -0
  544. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_cli_v33.py +0 -0
  545. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_compliance_full.py +0 -0
  546. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_config_system.py +0 -0
  547. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_dashboard_preserve_embedding.py +0 -0
  548. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_engine_hooks.py +0 -0
  549. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_event_bus.py +0 -0
  550. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_features.py +0 -0
  551. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_final_locomo_mini.py +0 -0
  552. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_graph_integrity.py +0 -0
  553. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_hook_handlers.py +0 -0
  554. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_ide_connector.py +0 -0
  555. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_infra.py +0 -0
  556. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_injection.py +0 -0
  557. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_learning_advanced.py +0 -0
  558. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_learning_collectors.py +0 -0
  559. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_llm_provider.py +0 -0
  560. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_mcp_server.py +0 -0
  561. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_migration.py +0 -0
  562. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_mode_switch_preservation.py +0 -0
  563. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_post_install.py +0 -0
  564. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_ranker.py +0 -0
  565. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_resource_lifecycle.py +0 -0
  566. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_topic_shift_hook.py +0 -0
  567. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_trust_full.py +0 -0
  568. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_v3_api.py +0 -0
  569. {superlocalmemory-3.7.7 → superlocalmemory-3.7.8}/tests/test_version_consistency.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superlocalmemory
3
- Version: 3.7.7
3
+ Version: 3.7.8
4
4
  Summary: Local-first agent memory with auditable hybrid retrieval
5
5
  Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -66,7 +66,6 @@ Requires-Dist: optimum==2.1.0; extra == "search"
66
66
  Requires-Dist: einops==0.8.2; extra == "search"
67
67
  Requires-Dist: torch==2.11.0; extra == "search"
68
68
  Requires-Dist: scikit-learn==1.8.0; extra == "search"
69
- Requires-Dist: geoopt>=0.5.0; extra == "search"
70
69
  Requires-Dist: onnxruntime==1.24.4; extra == "search"
71
70
  Provides-Extra: ui
72
71
  Requires-Dist: fastapi[all]>=0.135.1; extra == "ui"
@@ -107,10 +106,10 @@ Dynamic: license-file
107
106
  </picture>
108
107
  </p>
109
108
 
110
- <h1 align="center">SuperLocalMemory V3.7.7</h1>
109
+ <h1 align="center">SuperLocalMemory V3.7.8</h1>
111
110
  <p align="center"><strong>Cache. Compress. Remember. Three surfaces — proxy, MCP tools, or skill. Every setup covered.</strong><br/>
112
111
  <em>Local-first agent memory with explicit operating modes, auditable retrieval, and optional Optimize tools.</em></p>
113
- <p align="center"><code>v3.7.7</code> — <strong>Daemon-aware profile isolation, atomic runtime configuration, and verified migration integrity.</strong><br/>
112
+ <p align="center"><code>v3.7.8</code> — <strong>Profile-isolation leak fix, opt-in loopback write auth, and fresh-install acceptance verification.</strong><br/>
114
113
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
115
114
  <p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
116
115
 
@@ -5,10 +5,10 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V3.7.7</h1>
8
+ <h1 align="center">SuperLocalMemory V3.7.8</h1>
9
9
  <p align="center"><strong>Cache. Compress. Remember. Three surfaces — proxy, MCP tools, or skill. Every setup covered.</strong><br/>
10
10
  <em>Local-first agent memory with explicit operating modes, auditable retrieval, and optional Optimize tools.</em></p>
11
- <p align="center"><code>v3.7.7</code> — <strong>Daemon-aware profile isolation, atomic runtime configuration, and verified migration integrity.</strong><br/>
11
+ <p align="center"><code>v3.7.8</code> — <strong>Profile-isolation leak fix, opt-in loopback write auth, and fresh-install acceptance verification.</strong><br/>
12
12
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
13
13
  <p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
14
14
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "3.7.7"
3
+ version = "3.7.8"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -97,7 +97,6 @@ search = [
97
97
  "einops==0.8.2",
98
98
  "torch==2.11.0",
99
99
  "scikit-learn==1.8.0",
100
- "geoopt>=0.5.0",
101
100
  "onnxruntime==1.24.4",
102
101
  ]
103
102
  ui = [
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "3.7.7"
35
+ __version__ = "3.7.8"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -1999,7 +1999,7 @@ def cmd_doctor(args: Namespace) -> None:
1999
1999
 
2000
2000
  # 3. Search deps
2001
2001
  search_mods = {"sentence_transformers": "sentence-transformers", "torch": "torch",
2002
- "sklearn": "scikit-learn", "geoopt": "geoopt"}
2002
+ "sklearn": "scikit-learn"}
2003
2003
  search_ok = []
2004
2004
  for mod, pkg in search_mods.items():
2005
2005
  try:
@@ -2008,7 +2008,7 @@ def cmd_doctor(args: Namespace) -> None:
2008
2008
  except Exception: # dependency import may fail after module discovery
2009
2009
  pass
2010
2010
  if len(search_ok) == len(search_mods):
2011
- _check("Search deps", "PASS", "sentence-transformers, torch, sklearn, geoopt")
2011
+ _check("Search deps", "PASS", "sentence-transformers, torch, sklearn")
2012
2012
  else:
2013
2013
  missing = set(search_mods) - set(search_ok)
2014
2014
  _check("Search deps", "WARN", f"Missing: {', '.join(missing)}",
@@ -15,6 +15,7 @@ V3 change: base directory moved from ``~/.claude-memory/`` to
15
15
  import hashlib
16
16
  import hmac
17
17
  import logging
18
+ import os
18
19
  from pathlib import Path
19
20
  from typing import Optional
20
21
 
@@ -26,6 +27,13 @@ logger = logging.getLogger("superlocalmemory.auth")
26
27
  MEMORY_DIR = DynamicStatePath()
27
28
  API_KEY_FILE = DynamicStatePath("api_key")
28
29
 
30
+ # v3.7.8 (F1): opt-in env flag that restores the pre-v3.7.6 shared-host
31
+ # posture -- when set AND an api_key file is configured, uncredentialed
32
+ # loopback writes must also present a matching X-SLM-API-Key. Default OFF
33
+ # preserves the v3.7.6 local-first fix (#71/#73/#74): loopback callers are
34
+ # trusted as the local OS-user boundary without needing any credential.
35
+ SLM_REQUIRE_API_KEY_LOOPBACK_ENV = "SLM_REQUIRE_API_KEY_LOOPBACK"
36
+
29
37
 
30
38
  def _load_api_key_hash(key_file: Optional[Path] = None) -> Optional[str]:
31
39
  """Load and hash the API key from disk.
@@ -96,6 +104,26 @@ def verify_api_key(
96
104
  return hmac.compare_digest(actual, expected)
97
105
 
98
106
 
107
+ def loopback_strict_mode_enabled(key_file: Optional[Path] = None) -> bool:
108
+ """Whether uncredentialed loopback writes must present the API key.
109
+
110
+ v3.7.8 (F1/F2): opt-in via ``SLM_REQUIRE_API_KEY_LOOPBACK`` (any of
111
+ "1"/"true"/"yes"/"on", case-insensitive). This is the sole enforcement
112
+ point for the strict shared-host posture -- it is checked ONLY for the
113
+ uncredentialed-loopback case (a caller presenting none of
114
+ X-SLM-Daemon-Capability / X-Install-Token / X-SLM-API-Key). Callers who
115
+ already present a valid capability or install token are unaffected: those
116
+ are stronger, explicit credentials and this flag never re-litigates them.
117
+
118
+ Returns ``False`` (no-op) when the flag is unset/false, OR when no
119
+ api_key file is configured -- there is nothing to require in that case.
120
+ """
121
+ raw = os.environ.get(SLM_REQUIRE_API_KEY_LOOPBACK_ENV, "")
122
+ if raw.strip().lower() not in ("1", "true", "yes", "on"):
123
+ return False
124
+ return _load_api_key_hash(key_file) is not None
125
+
126
+
99
127
  def authorize_http_mcp_request(
100
128
  request_headers: dict,
101
129
  *,
@@ -587,6 +587,10 @@ def register_core_tools(server, get_engine: Callable) -> None:
587
587
  )
588
588
 
589
589
  generation = 0
590
+ # Only the profile_id explicitly confirmed by this process
591
+ # (daemon-acknowledged + locally-validated, or locally
592
+ # validated directly) is ever synced into engine state.
593
+ confirmed_profile_id = None
590
594
  if await asyncio.to_thread(is_daemon_running):
591
595
  result = await asyncio.to_thread(
592
596
  daemon_request,
@@ -599,12 +603,35 @@ def register_core_tools(server, get_engine: Callable) -> None:
599
603
  "error": "resident daemon rejected the profile switch",
600
604
  }
601
605
  acknowledged = str(result.get("active_profile", ""))
602
- if acknowledged != profile_id:
606
+ if not acknowledged or acknowledged != profile_id:
603
607
  return {
604
608
  "success": False,
605
609
  "error": "resident daemon acknowledged a different profile",
606
610
  }
611
+ # Local consistency guard (SEC-H-01): the daemon's HTTP
612
+ # acknowledgement alone is not sufficient — this MCP
613
+ # process must also confirm the profile exists in its
614
+ # own local DB handle before syncing local state to it.
615
+ # Mirrors the existence check the no-daemon branch already
616
+ # performs below.
617
+ local_rows = engine._db.execute(
618
+ "SELECT 1 FROM profiles WHERE profile_id = ?",
619
+ (profile_id,),
620
+ )
621
+ if not local_rows:
622
+ return {
623
+ "success": False,
624
+ "error": (
625
+ f"resident daemon acknowledged profile "
626
+ f"'{acknowledged}' but it does not exist in "
627
+ f"this process's local profile store"
628
+ ),
629
+ }
607
630
  generation = int(result.get("generation", 0))
631
+ # Sync target is the DAEMON-CONFIRMED value, never the raw
632
+ # caller-supplied profile_id, even though they are equal
633
+ # here by construction (checked above).
634
+ confirmed_profile_id = acknowledged
608
635
  else:
609
636
  rows = engine._db.execute(
610
637
  "SELECT 1 FROM profiles WHERE profile_id = ?",
@@ -628,10 +655,21 @@ def register_core_tools(server, get_engine: Callable) -> None:
628
655
  engine._config.active_profile = old
629
656
  persistence.rollback()
630
657
  raise
658
+ confirmed_profile_id = profile_id
659
+
660
+ if not confirmed_profile_id:
661
+ # Defensive: should be unreachable — every path above
662
+ # either returns an error or sets confirmed_profile_id.
663
+ return {
664
+ "success": False,
665
+ "error": "profile switch could not be confirmed",
666
+ }
631
667
 
632
- # Synchronize this MCP process only after daemon acknowledgement.
633
- engine.profile_id = profile_id
634
- engine._config.active_profile = profile_id
668
+ # Synchronize this MCP process only after confirmation
669
+ # (daemon-acknowledged + locally-validated, or directly
670
+ # locally-validated in the no-daemon branch above).
671
+ engine.profile_id = confirmed_profile_id
672
+ engine._config.active_profile = confirmed_profile_id
635
673
 
636
674
  # v3.6.12 (search-3): recall/delete run in a separate worker
637
675
  # subprocess that caches its engine (and profile_id) at init. Recycle
@@ -6,6 +6,23 @@
6
6
  SuperLocalMemory V3 - FastAPI API Server
7
7
  Provides REST endpoints for memory visualization and exploration.
8
8
  Uses V3 MemoryEngine for all operations.
9
+
10
+ v3.7.8 (WS3 F4): ``create_app()`` in this module is a standalone/legacy app
11
+ factory. The running daemon serves ``superlocalmemory.server.unified_daemon:
12
+ create_app`` (see ``unified_daemon.py``'s uvicorn config); THIS factory is
13
+ reachable only via direct ``python -m superlocalmemory.server.api`` /
14
+ programmatic use and the tests that exercise it directly
15
+ (``tests/test_api/test_api_lifespan_contract.py``,
16
+ ``tests/test_security/test_rate_limit_e2e.py``). Its ``auth_middleware``
17
+ below intentionally keeps the older, simpler ``check_api_key``-only gate
18
+ (unconditional per-write check, no daemon-capability / install-token
19
+ identity layer) because it predates and is independent of the unified
20
+ daemon's richer ``write_identity.require_http_mutation_actor`` boundary and
21
+ the ``SLM_REQUIRE_API_KEY_LOOPBACK`` opt-in (see
22
+ ``infra/auth_middleware.py``). Do not treat this module's auth posture as
23
+ the production write boundary -- that is ``unified_daemon.py``'s
24
+ ``auth_middleware``. ``UI_DIR`` below is still imported by
25
+ ``unified_daemon.py`` and must not be removed.
9
26
  """
10
27
 
11
28
  import json
@@ -76,7 +76,7 @@ async def chat_stream(request: Request):
76
76
  limit = min(body.get("limit", 10), 20)
77
77
 
78
78
  return StreamingResponse(
79
- _stream_chat(query, mode, limit),
79
+ _stream_chat(request.app.state, query, mode, limit),
80
80
  media_type="text/event-stream",
81
81
  headers={
82
82
  "Cache-Control": "no-cache",
@@ -89,15 +89,18 @@ async def chat_stream(request: Request):
89
89
  # ── Core Chat Logic ──────────────────────────────────────────────
90
90
 
91
91
  async def _stream_chat(
92
- query: str, mode: str, limit: int,
92
+ app_state, query: str, mode: str, limit: int,
93
93
  ) -> AsyncGenerator[str, None]:
94
94
  """Retrieve memories, then stream LLM response with citations."""
95
95
 
96
- # Step 1: Retrieve memories via WorkerPool (run in executor to avoid blocking)
96
+ # Step 1: Retrieve memories via the daemon's resident engine (run in
97
+ # executor to avoid blocking the event loop).
97
98
  memories = []
98
99
  try:
99
100
  loop = asyncio.get_event_loop()
100
- memories = await loop.run_in_executor(None, _recall_memories, query, limit)
101
+ memories = await loop.run_in_executor(
102
+ None, _recall_memories, app_state, query, limit,
103
+ )
101
104
  except Exception as exc:
102
105
  yield _sse_event("error", json.dumps({"message": f"Retrieval failed: {exc}"}))
103
106
  yield _sse_event("done", "")
@@ -314,14 +317,62 @@ async def _stream_openai_compat(
314
317
 
315
318
  # ── Retrieval Helper ─────────────────────────────────────────────
316
319
 
317
- def _recall_memories(query: str, limit: int) -> list:
318
- """Run full recall via WorkerPool (synchronous, runs in executor)."""
319
- from superlocalmemory.core.worker_pool import WorkerPool
320
- pool = WorkerPool.shared()
321
- result = pool.recall(query, limit=limit)
322
- if result.get("ok"):
323
- return result.get("results", [])
324
- return []
320
+ def _recall_memories(app_state, query: str, limit: int) -> list:
321
+ """Run full recall via the daemon's resident, lease-protected engine.
322
+
323
+ v3.7.8 CRITICAL fix: this used to go through ``WorkerPool.shared()``, a
324
+ long-lived subprocess that caches its OWN ``MemoryEngine`` + profile_id
325
+ at process init and is never recycled on a profile switch. That meant a
326
+ switch could serve the OLD profile's memories to this chat endpoint for
327
+ up to 120s — a cross-profile data leak. ``application.state.engine`` is
328
+ rebound synchronously by ``commit_daemon_profile_switch``, so reading it
329
+ (via the queue-consumer's engine adapter, which already holds the same
330
+ profile-runtime lease the daemon's own ``/recall`` route uses) always
331
+ reflects the current profile.
332
+ """
333
+ adapter = getattr(app_state, "engine_recall_adapter", None)
334
+ if adapter is not None:
335
+ result = adapter.recall(query, limit=limit)
336
+ if result.get("ok"):
337
+ return result.get("results", [])
338
+ return []
339
+ # Fallback (adapter unavailable, e.g. queue-consumer failed to start):
340
+ # recall directly against the resident engine under the same profile
341
+ # lease the HTTP /recall route uses. Never fall back to WorkerPool —
342
+ # that reintroduces the stale-profile leak this fix closes.
343
+ return _recall_via_resident_engine(app_state, query, limit)
344
+
345
+
346
+ def _recall_via_resident_engine(app_state, query: str, limit: int) -> list:
347
+ """Lease-protected direct-engine recall, mirroring the /recall route."""
348
+ from superlocalmemory.server.profile_runtime import get_profile_runtime
349
+ from superlocalmemory.server.routes.helpers import get_engine_lazy
350
+
351
+ runtime = get_profile_runtime(app_state)
352
+ with runtime.operation():
353
+ engine = get_engine_lazy(app_state)
354
+ if engine is None:
355
+ return []
356
+ response = engine.recall(query, limit=limit)
357
+ memory_ids = list({
358
+ r.fact.memory_id for r in response.results[:limit]
359
+ if r.fact.memory_id
360
+ })
361
+ memory_map = (
362
+ engine._db.get_memory_content_batch(memory_ids) if memory_ids else {}
363
+ )
364
+ from superlocalmemory.server.recall_serializer import (
365
+ serialize_recall_response,
366
+ )
367
+ _rc = getattr(engine._config, "retrieval", None)
368
+ results, _no_confident_match = serialize_recall_response(
369
+ response,
370
+ limit=limit,
371
+ memory_map=memory_map,
372
+ per_fact_max=getattr(_rc, "recall_per_fact_max_chars", 2400),
373
+ total_max=getattr(_rc, "recall_total_max_chars", 12000),
374
+ )
375
+ return results
325
376
 
326
377
 
327
378
  # ── SSE Formatting ───────────────────────────────────────────────
@@ -662,14 +662,28 @@ async def get_cluster_detail(request: Request, cluster_id: str, limit: int = Que
662
662
  if not members:
663
663
  raise HTTPException(status_code=404, detail="Cluster not found")
664
664
  # Generate cluster summary
665
+ # v3.7.8: previously routed through WorkerPool.shared(), a subprocess
666
+ # cache never recycled on a profile switch (CRITICAL cross-profile
667
+ # leak — up to 120s stale). Use the daemon's own resident,
668
+ # lease-protected engine's config instead; the summarizer only
669
+ # consumes already profile-filtered `texts` above, so this closes
670
+ # the stale-engine window without changing behavior.
665
671
  summary = ""
666
672
  try:
667
- from superlocalmemory.core.worker_pool import WorkerPool
668
- pool = WorkerPool.shared()
669
673
  texts = [m.get("content", "")[:200] for m in members[:10] if m.get("content")]
670
674
  if texts:
671
- result = pool.summarize(texts)
672
- summary = result.get("summary", "") if result.get("ok") else ""
675
+ from superlocalmemory.core.summarizer import Summarizer
676
+ from superlocalmemory.server.profile_runtime import get_profile_runtime
677
+ from superlocalmemory.server.routes.helpers import get_engine_lazy
678
+
679
+ runtime = get_profile_runtime(request.app.state)
680
+ with runtime.operation():
681
+ engine = get_engine_lazy(request.app.state)
682
+ if engine is not None:
683
+ summarizer = Summarizer(engine._config)
684
+ summary = summarizer.summarize_cluster(
685
+ [{"content": t} for t in texts]
686
+ ) or ""
673
687
  except Exception:
674
688
  pass
675
689
 
@@ -687,14 +701,47 @@ async def get_cluster_detail(request: Request, cluster_id: str, limit: int = Que
687
701
 
688
702
  @router.get("/api/memories/{memory_id}/facts")
689
703
  async def get_memory_facts(request: Request, memory_id: str):
690
- """Get original memory text with all its child atomic facts."""
704
+ """Get original memory text with all its child atomic facts.
705
+
706
+ v3.7.8: previously routed through WorkerPool.shared(), a subprocess
707
+ engine cached at process init and never recycled on a profile switch
708
+ (CRITICAL cross-profile leak — served the OLD profile's facts for up to
709
+ 120s after a switch). Uses the daemon's own resident, lease-protected
710
+ engine instead, exactly like the /recall route.
711
+ """
691
712
  try:
692
- from superlocalmemory.core.worker_pool import WorkerPool
693
- pool = WorkerPool.shared()
694
- result = pool.get_memory_facts(memory_id)
695
- if result.get("ok"):
696
- return result
697
- raise HTTPException(status_code=404, detail="Memory not found")
713
+ from superlocalmemory.server.profile_runtime import get_profile_runtime
714
+ from superlocalmemory.server.routes.helpers import get_engine_lazy
715
+
716
+ runtime = get_profile_runtime(request.app.state)
717
+ with runtime.operation():
718
+ engine = get_engine_lazy(request.app.state)
719
+ if engine is None:
720
+ raise HTTPException(status_code=503, detail="Engine not initialized")
721
+ active_profile = engine.profile_id
722
+ mem_map = engine._db.get_memory_content_batch([memory_id])
723
+ original = mem_map.get(memory_id, "")
724
+ facts = engine._db.get_facts_by_memory_id(memory_id, active_profile)
725
+ fact_list = [
726
+ {
727
+ "fact_id": f.fact_id,
728
+ "content": f.content,
729
+ "fact_type": (
730
+ f.fact_type.value if hasattr(f.fact_type, "value")
731
+ else str(f.fact_type)
732
+ ),
733
+ "confidence": round(f.confidence, 3),
734
+ "created_at": f.created_at,
735
+ }
736
+ for f in facts
737
+ ]
738
+ return {
739
+ "ok": True,
740
+ "memory_id": memory_id,
741
+ "original_content": original,
742
+ "facts": fact_list,
743
+ "fact_count": len(fact_list),
744
+ }
698
745
  except HTTPException:
699
746
  raise
700
747
  except Exception as e:
@@ -1462,7 +1462,8 @@ async def trigger_consolidation(request: Request):
1462
1462
  """Trigger consolidation manually.
1463
1463
 
1464
1464
  Body: {"lightweight": false, "profile": ""}
1465
- Uses WorkerPool for thread safety (Rule 18).
1465
+ Runs under the daemon's profile-runtime operation lease (Rule 18) so a
1466
+ concurrent profile switch cannot commit mid-consolidation.
1466
1467
  """
1467
1468
  try:
1468
1469
  body = await request.json()
@@ -1478,44 +1479,42 @@ async def trigger_consolidation(request: Request):
1478
1479
  profile_id=pid,
1479
1480
  )
1480
1481
 
1481
- # Use WorkerPool to run consolidation in the worker subprocess (Rule 18)
1482
- try:
1483
- from superlocalmemory.core.worker_pool import WorkerPool
1484
- pool = WorkerPool.shared()
1485
- result = pool.send_command({
1486
- "action": "consolidate",
1487
- "profile_id": pid,
1488
- "lightweight": lightweight,
1489
- })
1490
- if result and result.get("ok"):
1491
- authorization.complete()
1492
- return {"success": True, **result}
1493
- except Exception:
1494
- pass
1495
-
1496
- # Fallback: direct consolidation if WorkerPool unavailable
1482
+ # v3.7.8 SEC-M-01: the prior "WorkerPool" fast path called
1483
+ # ``pool.send_command(...)``, a method that does not exist on
1484
+ # WorkerPool every call raised AttributeError, was silently
1485
+ # swallowed by the bare ``except``, and fell through to this direct
1486
+ # path unconditionally. That dead branch is removed; consolidation
1487
+ # always runs directly against a lease-protected DB connection so a
1488
+ # concurrent profile switch cannot commit mid-consolidation.
1497
1489
  from superlocalmemory.core.config import SLMConfig
1498
1490
  from superlocalmemory.storage.database import DatabaseManager
1499
1491
  from superlocalmemory.storage import schema as _schema
1500
1492
  from superlocalmemory.core.consolidation_engine import ConsolidationEngine
1493
+ from superlocalmemory.server.profile_runtime import get_profile_runtime
1501
1494
 
1502
- config = SLMConfig.load()
1503
- db = DatabaseManager(config.db_path)
1504
- db.initialize(_schema)
1495
+ runtime = get_profile_runtime(request.app.state)
1496
+ with runtime.operation():
1497
+ config = SLMConfig.load()
1498
+ db = DatabaseManager(config.db_path)
1499
+ db.initialize(_schema)
1505
1500
 
1506
- engine = ConsolidationEngine(db=db, config=config.consolidation, slm_config=config)
1507
- result = engine.consolidate(profile_id=pid, lightweight=lightweight)
1501
+ engine = ConsolidationEngine(
1502
+ db=db, config=config.consolidation, slm_config=config,
1503
+ )
1504
+ result = engine.consolidate(profile_id=pid, lightweight=lightweight)
1508
1505
 
1509
- # v3.4.1: Auto-trigger behavioral pattern mining after consolidation
1510
- try:
1511
- from superlocalmemory.learning.consolidation_worker import ConsolidationWorker
1512
- learning_db = config.base_dir / "learning.db"
1513
- cw = ConsolidationWorker(str(config.db_path), str(learning_db))
1514
- pattern_count = cw._generate_patterns(pid, False)
1515
- result["patterns_mined"] = pattern_count
1516
- logger.info("Auto-mined %d patterns after consolidation", pattern_count)
1517
- except Exception as exc:
1518
- logger.debug("Pattern mining after consolidation failed: %s", exc)
1506
+ # v3.4.1: Auto-trigger behavioral pattern mining after consolidation
1507
+ try:
1508
+ from superlocalmemory.learning.consolidation_worker import (
1509
+ ConsolidationWorker,
1510
+ )
1511
+ learning_db = config.base_dir / "learning.db"
1512
+ cw = ConsolidationWorker(str(config.db_path), str(learning_db))
1513
+ pattern_count = cw._generate_patterns(pid, False)
1514
+ result["patterns_mined"] = pattern_count
1515
+ logger.info("Auto-mined %d patterns after consolidation", pattern_count)
1516
+ except Exception as exc:
1517
+ logger.debug("Pattern mining after consolidation failed: %s", exc)
1519
1518
 
1520
1519
  authorization.complete()
1521
1520
  return {"success": True, **result}
@@ -15,6 +15,16 @@ All route handlers live in routes/ directory:
15
15
  routes/events.py -- /events/stream (SSE), /api/events [v2.5]
16
16
  routes/agents.py -- /api/agents, /api/trust [v2.5]
17
17
  routes/ws.py -- /ws/updates (WebSocket)
18
+
19
+ v3.7.8 (WS3 F4): ``create_app()`` in this module is a standalone/legacy app
20
+ factory, NOT the app the running daemon serves -- that is
21
+ ``superlocalmemory.server.unified_daemon:create_app`` (see that module's
22
+ uvicorn config). This module's ``auth_middleware`` keeps the older,
23
+ unconditional ``check_api_key``-only write gate (no daemon-capability /
24
+ install-token identity layer, no ``SLM_REQUIRE_API_KEY_LOOPBACK`` opt-in --
25
+ see ``infra/auth_middleware.py`` for that). Treat this file as a standalone
26
+ entry point only; the production write-auth boundary lives in
27
+ ``unified_daemon.py``.
18
28
  """
19
29
 
20
30
  import logging
@@ -1726,6 +1726,7 @@ def _register_dashboard_routes(application: FastAPI) -> None:
1726
1726
  from superlocalmemory.infra.auth_middleware import (
1727
1727
  authorize_http_mcp_request,
1728
1728
  check_api_key,
1729
+ loopback_strict_mode_enabled,
1729
1730
  )
1730
1731
  from superlocalmemory.server.write_identity import (
1731
1732
  require_http_mutation_actor,
@@ -1801,25 +1802,52 @@ def _register_dashboard_routes(application: FastAPI) -> None:
1801
1802
  content={"error": str(_identity_exc.detail)},
1802
1803
  )
1803
1804
  raise
1804
- # v3.7.6 (#71/#73/#74): require_http_mutation_actor above is the
1805
- # authoritative write-auth boundary — it accepts the daemon
1806
- # capability, the dashboard install token, a matching X-SLM-API-Key,
1807
- # or an uncredentialed loopback caller, and fails closed for everyone
1808
- # else. The legacy check_api_key gate only understands X-SLM-API-Key,
1809
- # so running it as a second gate 401'd write paths that stage 1 had
1810
- # already authorized: capability-authenticated daemon write-throughs
1811
- # (MCP `remember`, #71) and install-token dashboard writes / config
1812
- # tests (#73/#74) whenever an api_key file exists. Only fall back to
1813
- # check_api_key when the mutation-actor gate did not run — i.e. for
1814
- # non-write, non-recall requests, where it is a no-op for reads.
1815
- if not requires_mutation_actor and not check_api_key(
1816
- headers, is_write=is_write
1817
- ):
1818
- from fastapi.responses import JSONResponse
1819
- return JSONResponse(
1820
- status_code=401,
1821
- content={"error": "Invalid or missing API key."},
1822
- )
1805
+ # v3.7.6 (#71/#73/#74): require_http_mutation_actor above is
1806
+ # the authoritative write-auth boundary — it accepts the
1807
+ # daemon capability, the dashboard install token, a matching
1808
+ # X-SLM-API-Key, or an uncredentialed loopback caller, and
1809
+ # fails closed for everyone else. Running check_api_key as an
1810
+ # unconditional second gate used to 401 write paths stage 1
1811
+ # had already authorized: capability-authenticated daemon
1812
+ # write-throughs (MCP `remember`, #71) and install-token
1813
+ # dashboard writes / config tests (#73/#74) whenever an
1814
+ # api_key file existed.
1815
+ #
1816
+ # v3.7.8 (F1/F2): that fix silently narrowed the api_key
1817
+ # feature — a configured api_key file used to force even
1818
+ # loopback writes to present a credential; after #71/#73/#74
1819
+ # loopback writes need none, with no opt-back-in. This is the
1820
+ # single enforcement point for the opt-in strict posture
1821
+ # (SLM_REQUIRE_API_KEY_LOOPBACK): re-run check_api_key, but
1822
+ # ONLY for the uncredentialed-loopback case — a caller who
1823
+ # presented none of the three credential headers above and
1824
+ # was authorized purely by being loopback. Credentialed
1825
+ # callers (capability / install token / api key) were already
1826
+ # validated by require_http_mutation_actor and are never
1827
+ # re-gated here, so #71/#73/#74 stay fixed.
1828
+ if loopback_strict_mode_enabled():
1829
+ _has_credential = any(
1830
+ headers.get(_h)
1831
+ for _h in (
1832
+ "x-slm-daemon-capability",
1833
+ "x-install-token",
1834
+ "x-slm-api-key",
1835
+ )
1836
+ )
1837
+ if not _has_credential and not check_api_key(
1838
+ headers, is_write=True
1839
+ ):
1840
+ from fastapi.responses import JSONResponse
1841
+ return JSONResponse(
1842
+ status_code=401,
1843
+ content={
1844
+ "error": (
1845
+ "SLM_REQUIRE_API_KEY_LOOPBACK is set: "
1846
+ "loopback writes must present a matching "
1847
+ "X-SLM-API-Key."
1848
+ )
1849
+ },
1850
+ )
1823
1851
  return await call_next(request)
1824
1852
  except Exception as _auth_exc:
1825
1853
  # v3.6.12 (failopen-1): security middleware must NEVER fail open silently.
@@ -365,15 +365,6 @@ V32_DDL: list[str] = [
365
365
  """,
366
366
  ]
367
367
 
368
- # vec0 virtual table DDL — executed by VectorStore ONLY (requires extension loaded first).
369
- # NOT in V32_DDL because executescript cannot load extensions mid-script.
370
- V32_VEC0_DDL: Final[str] = """
371
- CREATE VIRTUAL TABLE IF NOT EXISTS fact_embeddings USING vec0(
372
- profile_id TEXT PARTITION KEY,
373
- embedding float[768] distance_metric=cosine
374
- );
375
- """
376
-
377
368
  # ---------------------------------------------------------------------------
378
369
  # Rollback DDL (reverse FK order -- Rule 20)
379
370
  # ---------------------------------------------------------------------------