surreal-memory 2.3.0__tar.gz → 2.3.2__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 (380) hide show
  1. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/PKG-INFO +1 -1
  2. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/pyproject.toml +1 -1
  3. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/__init__.py +1 -1
  4. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/tools.py +10 -0
  5. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/doctor.py +186 -0
  6. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/full_setup.py +10 -0
  7. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/setup.py +121 -20
  8. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/wizard.py +4 -0
  9. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/diagnostics.py +10 -0
  10. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/server.py +12 -0
  11. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/dashboard_api.py +28 -4
  12. surreal_memory-2.3.2/src/surreal_memory/storage/surrealdb/connection.py +120 -0
  13. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/store.py +128 -15
  14. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/unified_config.py +91 -8
  15. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/.gitignore +0 -0
  16. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/LICENSE +0 -0
  17. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/NOTICE +0 -0
  18. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/README.md +0 -0
  19. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/__init__.py +0 -0
  20. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/__main__.py +0 -0
  21. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/_helpers.py +0 -0
  22. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/__init__.py +0 -0
  23. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/brain.py +0 -0
  24. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/codebase.py +0 -0
  25. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/config_cmd.py +0 -0
  26. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/habits.py +0 -0
  27. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/info.py +0 -0
  28. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/listing.py +0 -0
  29. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/memory.py +0 -0
  30. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/project.py +0 -0
  31. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/reindex.py +0 -0
  32. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/shared.py +0 -0
  33. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/shortcuts.py +0 -0
  34. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/storage.py +0 -0
  35. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/telegram.py +0 -0
  36. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/train.py +0 -0
  37. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/update.py +0 -0
  38. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/version.py +0 -0
  39. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/commands/watch.py +0 -0
  40. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/config.py +0 -0
  41. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/embedding_setup.py +0 -0
  42. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/graph_export.py +0 -0
  43. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/ide_rules.py +0 -0
  44. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/main.py +0 -0
  45. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/markdown_export.py +0 -0
  46. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/storage.py +0 -0
  47. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/tui.py +0 -0
  48. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/cli/update_check.py +0 -0
  49. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/config_presets.py +0 -0
  50. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/__init__.py +0 -0
  51. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/action_event.py +0 -0
  52. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/alert.py +0 -0
  53. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/brain.py +0 -0
  54. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/brain_mode.py +0 -0
  55. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/eternal_context.py +0 -0
  56. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/fiber.py +0 -0
  57. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/memory_types.py +0 -0
  58. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/neuron.py +0 -0
  59. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/project.py +0 -0
  60. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/review_schedule.py +0 -0
  61. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/source.py +0 -0
  62. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/synapse.py +0 -0
  63. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/core/trigger_engine.py +0 -0
  64. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/__init__.py +0 -0
  65. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/activation.py +0 -0
  66. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/arousal.py +0 -0
  67. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/associative_inference.py +0 -0
  68. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/brain_evolution.py +0 -0
  69. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/brain_transplant.py +0 -0
  70. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/brain_versioning.py +0 -0
  71. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/causal_traversal.py +0 -0
  72. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/chart_generator.py +0 -0
  73. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/chunking.py +0 -0
  74. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/citation.py +0 -0
  75. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/clustering.py +0 -0
  76. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/codebase_encoder.py +0 -0
  77. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/cognitive.py +0 -0
  78. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/compression.py +0 -0
  79. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/conflict_auto_resolve.py +0 -0
  80. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/conflict_detection.py +0 -0
  81. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/connection_explainer.py +0 -0
  82. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/consolidation.py +0 -0
  83. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/consolidation_delta.py +0 -0
  84. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/context_merger.py +0 -0
  85. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/context_optimizer.py +0 -0
  86. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/context_retrieval.py +0 -0
  87. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/cross_brain.py +0 -0
  88. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/db_introspector.py +0 -0
  89. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/db_knowledge.py +0 -0
  90. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/db_trainer.py +0 -0
  91. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/decision_intel.py +0 -0
  92. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dedup/__init__.py +0 -0
  93. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dedup/config.py +0 -0
  94. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dedup/llm_judge.py +0 -0
  95. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dedup/pipeline.py +0 -0
  96. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dedup/prompts.py +0 -0
  97. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/depth_prior.py +0 -0
  98. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/doc_chunker.py +0 -0
  99. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/doc_extractor.py +0 -0
  100. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/doc_trainer.py +0 -0
  101. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/dream.py +0 -0
  102. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/drift_detection.py +0 -0
  103. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/__init__.py +0 -0
  104. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/capability.py +0 -0
  105. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/config.py +0 -0
  106. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/gemini_embedding.py +0 -0
  107. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/ollama_embedding.py +0 -0
  108. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/openai_embedding.py +0 -0
  109. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/openrouter_embedding.py +0 -0
  110. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/provider.py +0 -0
  111. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/retry.py +0 -0
  112. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/embedding/sentence_transformer.py +0 -0
  113. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/encoder.py +0 -0
  114. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/enrichment.py +0 -0
  115. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/fidelity.py +0 -0
  116. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/file_watcher.py +0 -0
  117. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/fuzzy_match.py +0 -0
  118. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/fuzzy_query.py +0 -0
  119. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/gromov.py +0 -0
  120. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/hippocampal_replay.py +0 -0
  121. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/hooks.py +0 -0
  122. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/idf_anchor.py +0 -0
  123. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/importance.py +0 -0
  124. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/interference.py +0 -0
  125. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/koopman.py +0 -0
  126. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/learning_rule.py +0 -0
  127. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/lifecycle.py +0 -0
  128. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/memory_stages.py +0 -0
  129. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/merge.py +0 -0
  130. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/narrative.py +0 -0
  131. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/pattern_extraction.py +0 -0
  132. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/pipeline.py +0 -0
  133. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/pipeline_steps.py +0 -0
  134. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/ppr_activation.py +0 -0
  135. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/prediction_error.py +0 -0
  136. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/priming.py +0 -0
  137. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/quality_scorer.py +0 -0
  138. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/query_expander.py +0 -0
  139. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/query_expansion.py +0 -0
  140. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/query_pattern_mining.py +0 -0
  141. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/reconsolidation.py +0 -0
  142. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/reconstruction.py +0 -0
  143. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/reflection.py +0 -0
  144. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/reflex_activation.py +0 -0
  145. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/reranker.py +0 -0
  146. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/retrieval.py +0 -0
  147. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/retrieval_context.py +0 -0
  148. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/retrieval_types.py +0 -0
  149. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/schema_assimilation.py +0 -0
  150. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/score_fusion.py +0 -0
  151. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/semantic_discovery.py +0 -0
  152. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/sequence_mining.py +0 -0
  153. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/session_state.py +0 -0
  154. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/spaced_repetition.py +0 -0
  155. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/stabilization.py +0 -0
  156. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/sufficiency.py +0 -0
  157. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/temporal_binding.py +0 -0
  158. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/tier_engine.py +0 -0
  159. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/token_budget.py +0 -0
  160. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/token_normalizer.py +0 -0
  161. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/tool_memory.py +0 -0
  162. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/topology_analysis.py +0 -0
  163. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/watch_state.py +0 -0
  164. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/workflow_suggest.py +0 -0
  165. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/engine/write_queue.py +0 -0
  166. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/__init__.py +0 -0
  167. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/codebase.py +0 -0
  168. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/entities.py +0 -0
  169. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/keywords.py +0 -0
  170. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/llm_provider.py +0 -0
  171. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/parser.py +0 -0
  172. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/relations.py +0 -0
  173. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/router.py +0 -0
  174. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/sentiment.py +0 -0
  175. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/structure_detector.py +0 -0
  176. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/extraction/temporal.py +0 -0
  177. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/git_context.py +0 -0
  178. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/__init__.py +0 -0
  179. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/post_tool_use.py +0 -0
  180. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/pre_compact.py +0 -0
  181. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/project_context.py +0 -0
  182. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/session_start.py +0 -0
  183. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/stop.py +0 -0
  184. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/hooks/task_context.py +0 -0
  185. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/__init__.py +0 -0
  186. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapter.py +0 -0
  187. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/__init__.py +0 -0
  188. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/awf_adapter.py +0 -0
  189. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/chromadb_adapter.py +0 -0
  190. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/cognee_adapter.py +0 -0
  191. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/graphiti_adapter.py +0 -0
  192. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/llamaindex_adapter.py +0 -0
  193. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/adapters/mem0_adapter.py +0 -0
  194. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/mapper.py +0 -0
  195. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/models.py +0 -0
  196. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/sync_engine.py +0 -0
  197. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integration/telegram.py +0 -0
  198. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/__init__.py +0 -0
  199. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/__init__.py +0 -0
  200. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/base_tool.py +0 -0
  201. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/context.py +0 -0
  202. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/memory_store.py +0 -0
  203. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/protocol.py +0 -0
  204. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/setup.py +0 -0
  205. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/nanobot/tools.py +0 -0
  206. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/integrations/openclaw_config.py +0 -0
  207. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/__init__.py +0 -0
  208. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/__main__.py +0 -0
  209. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/alert_handler.py +0 -0
  210. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/auto_capture.py +0 -0
  211. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/auto_handler.py +0 -0
  212. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/budget_handler.py +0 -0
  213. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/cognitive_handler.py +0 -0
  214. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/conflict_handler.py +0 -0
  215. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/connection_handler.py +0 -0
  216. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/constants.py +0 -0
  217. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/db_train_handler.py +0 -0
  218. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/drift_handler.py +0 -0
  219. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/eternal_handler.py +0 -0
  220. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/evolution_handler.py +0 -0
  221. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/expiry_cleanup_handler.py +0 -0
  222. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/http_transport.py +0 -0
  223. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/index_handler.py +0 -0
  224. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/instruction_handler.py +0 -0
  225. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/lifecycle_handler.py +0 -0
  226. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/maintenance_handler.py +0 -0
  227. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/mem0_sync_handler.py +0 -0
  228. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/narrative_handler.py +0 -0
  229. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/onboarding_handler.py +0 -0
  230. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/prompt.py +0 -0
  231. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/provenance_handler.py +0 -0
  232. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/recall_handler.py +0 -0
  233. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/remember_handler.py +0 -0
  234. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/response_compactor.py +0 -0
  235. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/review_handler.py +0 -0
  236. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/scheduled_consolidation_handler.py +0 -0
  237. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/session_handler.py +0 -0
  238. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/stats_handler.py +0 -0
  239. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/surface_handler.py +0 -0
  240. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/sync_handler.py +0 -0
  241. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/telegram_handler.py +0 -0
  242. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/tier_handler.py +0 -0
  243. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/tool_handler_utils.py +0 -0
  244. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/tool_handlers.py +0 -0
  245. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/tool_schemas.py +0 -0
  246. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/train_handler.py +0 -0
  247. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/version_check_handler.py +0 -0
  248. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/visualize_handler.py +0 -0
  249. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/mcp/watch_handler.py +0 -0
  250. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/plugins/__init__.py +0 -0
  251. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/plugins/base.py +0 -0
  252. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/plugins/community.py +0 -0
  253. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/py.typed +0 -0
  254. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/safety/__init__.py +0 -0
  255. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/safety/encryption.py +0 -0
  256. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/safety/freshness.py +0 -0
  257. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/safety/input_firewall.py +0 -0
  258. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/safety/sensitive.py +0 -0
  259. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/__init__.py +0 -0
  260. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/app.py +0 -0
  261. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/dependencies.py +0 -0
  262. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/models.py +0 -0
  263. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/__init__.py +0 -0
  264. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/brain.py +0 -0
  265. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/consolidation.py +0 -0
  266. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/hub.py +0 -0
  267. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/integration_status.py +0 -0
  268. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/memory.py +0 -0
  269. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/oauth.py +0 -0
  270. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/openclaw_api.py +0 -0
  271. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/routes/sync.py +0 -0
  272. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/DiagramsPage-BZV40eAE.css +0 -0
  273. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/DiagramsPage-DxR1C_Ua.js +0 -0
  274. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/EvolutionPage-By828lS5.js +0 -0
  275. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/GraphPage-DwQB1_DY.js +0 -0
  276. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/HealthPage-DetJg-Qr.js +0 -0
  277. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/OraclePage-7FBeVFXa.js +0 -0
  278. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/OverviewPage-xe8kFqX3.js +0 -0
  279. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/ProGate-CwBF4etn.js +0 -0
  280. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/SettingsPage-CH2mIMiD.js +0 -0
  281. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/StoragePage-CLDPXEH8.js +0 -0
  282. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/SyncPage-MbtH1dwD.js +0 -0
  283. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/TimelinePage-BIybkdH4.js +0 -0
  284. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/ToolStatsPage-BA-DvxES.js +0 -0
  285. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/VisualizePage-B_IPrBGU.js +0 -0
  286. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/card-B0vNsxr_.js +0 -0
  287. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/embed-gLOWnRXV.js +0 -0
  288. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/index-BFkJgtCN.css +0 -0
  289. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/index-C26pxqlr.js +0 -0
  290. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/skeleton-DQJ-n00q.js +0 -0
  291. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/timer-DWAvo6M8.js +0 -0
  292. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-icons-BYlYobEK.js +0 -0
  293. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-motion-Ct_HHbYW.js +0 -0
  294. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-query-CqA1cBNl.js +0 -0
  295. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-react-BfuodpLv.js +0 -0
  296. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-recharts-BkwZfCWA.js +0 -0
  297. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/assets/vendor-ui-Qm4_4bAc.js +0 -0
  298. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/server/static/dist/index.html +0 -0
  299. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/skills/__init__.py +0 -0
  300. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/skills/memory-audit/SKILL.md +0 -0
  301. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/skills/memory-evolution/SKILL.md +0 -0
  302. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/skills/memory-intake/SKILL.md +0 -0
  303. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/__init__.py +0 -0
  304. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/base.py +0 -0
  305. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/factory.py +0 -0
  306. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/memory_brain_ops.py +0 -0
  307. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/memory_collections.py +0 -0
  308. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/memory_reviews.py +0 -0
  309. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/memory_store.py +0 -0
  310. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/neuron_cache.py +0 -0
  311. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/read_pool.py +0 -0
  312. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/shared_store.py +0 -0
  313. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/shared_store_collections.py +0 -0
  314. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/shared_store_mappers.py +0 -0
  315. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_action_log.py +0 -0
  316. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_alerts.py +0 -0
  317. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_brain_ops.py +0 -0
  318. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_calibration.py +0 -0
  319. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_change_log.py +0 -0
  320. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_coactivation.py +0 -0
  321. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_cognitive.py +0 -0
  322. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_compression.py +0 -0
  323. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_depth_priors.py +0 -0
  324. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_devices.py +0 -0
  325. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_drift.py +0 -0
  326. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_entity_refs.py +0 -0
  327. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_fibers.py +0 -0
  328. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_maturation.py +0 -0
  329. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_merkle.py +0 -0
  330. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_neurons.py +0 -0
  331. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_projects.py +0 -0
  332. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_reviews.py +0 -0
  333. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_row_mappers.py +0 -0
  334. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_schema.py +0 -0
  335. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_sessions.py +0 -0
  336. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_sources.py +0 -0
  337. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_store.py +0 -0
  338. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_synapses.py +0 -0
  339. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_sync_state.py +0 -0
  340. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_tool_events.py +0 -0
  341. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_training_files.py +0 -0
  342. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_typed.py +0 -0
  343. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/sqlite_versioning.py +0 -0
  344. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/__init__.py +0 -0
  345. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/activity.py +0 -0
  346. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/alerts.py +0 -0
  347. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/cognitive.py +0 -0
  348. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/compression.py +0 -0
  349. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/depth_priors.py +0 -0
  350. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/keyword_entity.py +0 -0
  351. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/projects.py +0 -0
  352. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/review_schedules.py +0 -0
  353. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/schema.py +0 -0
  354. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/sources.py +0 -0
  355. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/tool_events.py +0 -0
  356. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/typed_memory.py +0 -0
  357. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/storage/surrealdb/versions.py +0 -0
  358. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/__init__.py +0 -0
  359. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/generator.py +0 -0
  360. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/lifecycle.py +0 -0
  361. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/models.py +0 -0
  362. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/parser.py +0 -0
  363. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/resolver.py +0 -0
  364. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/serializer.py +0 -0
  365. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/surface/token_budget.py +0 -0
  366. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/__init__.py +0 -0
  367. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/client.py +0 -0
  368. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/device.py +0 -0
  369. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/incremental_merge.py +0 -0
  370. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/merkle.py +0 -0
  371. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/protocol.py +0 -0
  372. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/sync/sync_engine.py +0 -0
  373. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/__init__.py +0 -0
  374. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/config.py +0 -0
  375. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/consolidation_lock.py +0 -0
  376. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/sandbox.py +0 -0
  377. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/simhash.py +0 -0
  378. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/ssl_helper.py +0 -0
  379. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/tag_normalizer.py +0 -0
  380. {surreal_memory-2.3.0 → surreal_memory-2.3.2}/src/surreal_memory/utils/timeutils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: surreal-memory
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: Reflex-based memory system for AI agents with SurrealDB backend — retrieval through activation, not search
5
5
  Project-URL: Homepage, https://github.com/acidkill/surreal-memory
6
6
  Project-URL: Documentation, https://github.com/acidkill/surreal-memory/blob/main/docs/getting-started/quickstart.md
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "surreal-memory"
7
- version = "2.3.0"
7
+ version = "2.3.2"
8
8
  description = "Reflex-based memory system for AI agents with SurrealDB backend — retrieval through activation, not search"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -16,7 +16,7 @@ from surreal_memory.engine.encoder import EncodingResult, MemoryEncoder
16
16
  from surreal_memory.engine.reflex_activation import CoActivation, ReflexActivation
17
17
  from surreal_memory.engine.retrieval import DepthLevel, ReflexPipeline, RetrievalResult
18
18
 
19
- __version__ = "2.3.0"
19
+ __version__ = "2.3.2"
20
20
 
21
21
  __all__ = [
22
22
  "__version__",
@@ -241,6 +241,7 @@ def init(
241
241
  setup_config,
242
242
  setup_hooks_claude,
243
243
  setup_mcp_claude,
244
+ setup_mcp_claude_desktop,
244
245
  setup_mcp_cursor,
245
246
  setup_skills,
246
247
  )
@@ -280,6 +281,15 @@ def init(
280
281
  }
281
282
  results["Cursor"] = cursor_labels.get(cursor_status, cursor_status)
282
283
 
284
+ desktop_status = setup_mcp_claude_desktop()
285
+ desktop_labels = {
286
+ "added": "claude_desktop_config.json (added MCP server)",
287
+ "exists": "claude_desktop_config.json (already configured)",
288
+ "not_found": "not detected (Claude Desktop not installed)",
289
+ "failed": "failed to write config",
290
+ }
291
+ results["Claude Desktop"] = desktop_labels.get(desktop_status, desktop_status)
292
+
283
293
  # 4. Hooks (Claude Code only)
284
294
  if not skip_mcp:
285
295
  hook_status = setup_hooks_claude()
@@ -40,7 +40,9 @@ _CHECK_TIERS: dict[str, str] = {
40
40
  "Dependencies": TIER_CORE,
41
41
  "Schema version": TIER_CORE,
42
42
  "CLI tools": TIER_CORE,
43
+ "SurrealDB connection": TIER_CORE,
43
44
  "Embedding provider": TIER_RECOMMENDED,
45
+ "MCP env completeness": TIER_RECOMMENDED,
44
46
  "MCP configuration": TIER_RECOMMENDED,
45
47
  "MCP server": TIER_RECOMMENDED,
46
48
  "Hooks": TIER_RECOMMENDED,
@@ -86,6 +88,8 @@ def run_doctor(
86
88
  checks.append(_check_surface())
87
89
  checks.append(_check_config_freshness())
88
90
  checks.append(_check_cli_tools())
91
+ checks.append(_check_surrealdb_connection())
92
+ checks.append(_check_mcp_env_completeness())
89
93
  checks.append(_check_pro_plugin())
90
94
  if dev:
91
95
  checks.extend(_check_dev_environment())
@@ -328,6 +332,12 @@ def _check_brain() -> dict[str, Any]:
328
332
 
329
333
  config = get_config(reload=True)
330
334
  brain_name = config.current_brain
335
+ if config.storage_backend == "surrealdb":
336
+ return {
337
+ "name": "Brain database",
338
+ "status": SKIP,
339
+ "detail": "surrealdb backend — brain lives in SurrealDB, not a local .db file",
340
+ }
331
341
  except Exception:
332
342
  brain_name = "default"
333
343
 
@@ -441,6 +451,12 @@ def _check_schema_version() -> dict[str, Any]:
441
451
  from surreal_memory.unified_config import get_config, get_surrealmemory_dir
442
452
 
443
453
  config = get_config(reload=True)
454
+ if config.storage_backend == "surrealdb":
455
+ return {
456
+ "name": "Schema version",
457
+ "status": SKIP,
458
+ "detail": "surrealdb backend — schema managed by SurrealDB, not SQLite",
459
+ }
444
460
  brain_name = config.current_brain
445
461
  db_path = get_surrealmemory_dir() / "brains" / f"{brain_name}.db"
446
462
 
@@ -865,6 +881,8 @@ _FIX_HANDLERS: dict[str, Any] = {
865
881
  "Dedup": lambda: _fix_dedup(),
866
882
  "Embedding provider": lambda: _fix_embedding(),
867
883
  "Config freshness": lambda: _fix_config_freshness(),
884
+ "MCP env completeness": lambda: _fix_mcp_env(),
885
+ "SurrealDB connection": lambda: _fix_mcp_env(),
868
886
  }
869
887
 
870
888
 
@@ -958,6 +976,174 @@ def _fix_config_freshness() -> dict[str, Any]:
958
976
  }
959
977
 
960
978
 
979
+ # ---------------------------------------------------------------------------
980
+ # SurrealDB-specific checks
981
+ # ---------------------------------------------------------------------------
982
+
983
+
984
+ def _run_surrealdb_ping() -> None:
985
+ """Attempt a real SurrealDB connection with a short timeout.
986
+
987
+ Raises StorageAuthError on bad credentials, any other exception on
988
+ connectivity issues. Returns None on success.
989
+ """
990
+ import asyncio
991
+
992
+ from surreal_memory.storage.surrealdb.connection import SurrealSettings
993
+ from surreal_memory.storage.surrealdb.store import SurrealDBStorage
994
+
995
+ async def _ping() -> None:
996
+ settings = SurrealSettings.from_env()
997
+ storage = SurrealDBStorage(
998
+ url=settings.url,
999
+ user=settings.user,
1000
+ password=settings.password,
1001
+ namespace=settings.namespace,
1002
+ database=settings.database,
1003
+ )
1004
+ try:
1005
+ await asyncio.wait_for(storage.initialize(), timeout=5)
1006
+ finally:
1007
+ await storage.close()
1008
+
1009
+ run_async(_ping())
1010
+
1011
+
1012
+ def _check_surrealdb_connection() -> dict[str, Any]:
1013
+ """Check that the SurrealDB connection works (TIER_CORE for surrealdb backend).
1014
+
1015
+ Returns SKIP when storage backend is not surrealdb.
1016
+ Returns FAIL with actionable hint when authentication fails.
1017
+ Returns WARN when SurrealDB is unreachable (not running, wrong URL, etc.).
1018
+ Returns OK on success.
1019
+ """
1020
+ import os
1021
+
1022
+ from surreal_memory.storage.surrealdb.connection import StorageAuthError
1023
+
1024
+ if os.environ.get("SURREAL_MEMORY_STORAGE") != "surrealdb":
1025
+ try:
1026
+ from surreal_memory.unified_config import get_config
1027
+
1028
+ config = get_config(reload=True)
1029
+ if config.storage_backend != "surrealdb":
1030
+ return {
1031
+ "name": "SurrealDB connection",
1032
+ "status": SKIP,
1033
+ "detail": "surrealdb backend not active",
1034
+ }
1035
+ except Exception as cfg_exc:
1036
+ return {
1037
+ "name": "SurrealDB connection",
1038
+ "status": WARN,
1039
+ "detail": f"could not load config to determine backend: {type(cfg_exc).__name__}",
1040
+ "fix": "Check config.toml is valid; run: smem init",
1041
+ }
1042
+
1043
+ try:
1044
+ _run_surrealdb_ping()
1045
+ return {
1046
+ "name": "SurrealDB connection",
1047
+ "status": OK,
1048
+ "detail": "authenticated and connected",
1049
+ }
1050
+ except StorageAuthError:
1051
+ return {
1052
+ "name": "SurrealDB connection",
1053
+ "status": FAIL,
1054
+ "detail": "authentication failed (wrong password or user)",
1055
+ "fix": "Set SURREALDB_PASS in your MCP client env or run: smem doctor --fix",
1056
+ "fixable": True,
1057
+ }
1058
+ except Exception as exc:
1059
+ return {
1060
+ "name": "SurrealDB connection",
1061
+ "status": WARN,
1062
+ "detail": f"could not reach SurrealDB: {type(exc).__name__}",
1063
+ "fix": "Ensure SurrealDB is running and SURREALDB_URL is correct",
1064
+ }
1065
+
1066
+
1067
+ def _check_mcp_env_completeness() -> dict[str, Any]:
1068
+ """Check that MCP entries contain the required env block (TIER_RECOMMENDED).
1069
+
1070
+ Reads ~/.claude.json (Claude Code) and claude_desktop_config.json to verify
1071
+ that the surreal-memory entry has SURREALDB_PASS in its env block.
1072
+ """
1073
+ configs_to_check: list[tuple[str, Path]] = [
1074
+ ("Claude Code (~/.claude.json)", Path.home() / ".claude.json"),
1075
+ ]
1076
+
1077
+ # Also check Claude Desktop config
1078
+ try:
1079
+ from surreal_memory.cli.setup import _claude_desktop_config_path
1080
+
1081
+ desktop_path = _claude_desktop_config_path()
1082
+ if desktop_path is not None:
1083
+ configs_to_check.append(("Claude Desktop", desktop_path))
1084
+ except Exception:
1085
+ pass
1086
+
1087
+ missing_env: list[str] = []
1088
+
1089
+ for label, config_path in configs_to_check:
1090
+ if not config_path.exists():
1091
+ continue
1092
+ try:
1093
+ data = json.loads(config_path.read_text(encoding="utf-8"))
1094
+ entry = data.get("mcpServers", {}).get("surreal-memory")
1095
+ if entry is None:
1096
+ continue
1097
+ if not entry.get("env", {}).get("SURREALDB_PASS"):
1098
+ missing_env.append(label)
1099
+ except (json.JSONDecodeError, OSError):
1100
+ continue
1101
+
1102
+ if not any(p.exists() for _, p in configs_to_check):
1103
+ return {
1104
+ "name": "MCP env completeness",
1105
+ "status": SKIP,
1106
+ "detail": "no MCP client config files found",
1107
+ }
1108
+
1109
+ if missing_env:
1110
+ return {
1111
+ "name": "MCP env completeness",
1112
+ "status": WARN,
1113
+ "detail": f"surreal-memory entry missing env in: {', '.join(missing_env)}",
1114
+ "fix": "Run: smem doctor --fix",
1115
+ "fixable": True,
1116
+ }
1117
+
1118
+ return {
1119
+ "name": "MCP env completeness",
1120
+ "status": OK,
1121
+ "detail": "env block with SURREALDB_PASS present",
1122
+ }
1123
+
1124
+
1125
+ def _fix_mcp_env() -> dict[str, Any]:
1126
+ """Auto-fix: backfill env into MCP client configs."""
1127
+ from surreal_memory.cli.setup import setup_mcp_claude, setup_mcp_claude_desktop
1128
+
1129
+ try:
1130
+ setup_mcp_claude()
1131
+ setup_mcp_claude_desktop()
1132
+ return {
1133
+ "name": "MCP env completeness",
1134
+ "status": OK,
1135
+ "detail": "auto-fixed: env backfilled in MCP client configs",
1136
+ }
1137
+ except Exception:
1138
+ pass
1139
+ return {
1140
+ "name": "MCP env completeness",
1141
+ "status": WARN,
1142
+ "detail": "auto-fix failed",
1143
+ "fix": "Run: smem init",
1144
+ }
1145
+
1146
+
961
1147
  def _render_results(result: dict[str, Any]) -> None:
962
1148
  """Render diagnostic results to terminal."""
963
1149
  typer.echo()
@@ -306,6 +306,7 @@ def run_full_setup(
306
306
  setup_config,
307
307
  setup_hooks_claude,
308
308
  setup_mcp_claude,
309
+ setup_mcp_claude_desktop,
309
310
  setup_mcp_cursor,
310
311
  setup_skills,
311
312
  )
@@ -347,6 +348,15 @@ def run_full_setup(
347
348
  }
348
349
  results["Cursor"] = cursor_labels.get(cursor_status, cursor_status)
349
350
 
351
+ desktop_status = setup_mcp_claude_desktop()
352
+ desktop_labels = {
353
+ "added": "MCP server configured",
354
+ "exists": "already configured",
355
+ "not_found": "not detected",
356
+ "failed": "failed",
357
+ }
358
+ results["Claude Desktop"] = desktop_labels.get(desktop_status, desktop_status)
359
+
350
360
  # 4. Hooks
351
361
  if not skip_mcp:
352
362
  hook_status = setup_hooks_claude()
@@ -22,16 +22,27 @@ def find_smem_command() -> dict[str, Any]:
22
22
  1. smem-mcp entry point (cleanest)
23
23
  2. smem CLI with mcp subcommand
24
24
  3. python -m fallback (uses absolute path, normalized for Windows)
25
+
26
+ Always includes an ``env`` block so MCP clients receive the full
27
+ SurrealDB connection config and do not start with an empty environment.
25
28
  """
29
+ from surreal_memory.storage.surrealdb.connection import build_mcp_env
30
+
31
+ env = build_mcp_env()
32
+
26
33
  smem_mcp = shutil.which("smem-mcp")
27
34
  if smem_mcp:
28
- return {"command": "smem-mcp"}
35
+ return {"command": "smem-mcp", "env": env}
29
36
 
30
37
  smem = shutil.which("smem")
31
38
  if smem:
32
- return {"command": "smem", "args": ["mcp"]}
39
+ return {"command": "smem", "args": ["mcp"], "env": env}
33
40
 
34
- return {"command": _normalize_path(sys.executable), "args": ["-m", "surreal_memory.mcp"]}
41
+ return {
42
+ "command": _normalize_path(sys.executable),
43
+ "args": ["-m", "surreal_memory.mcp"],
44
+ "env": env,
45
+ }
35
46
 
36
47
 
37
48
  def setup_config(data_dir: Path, *, force: bool = False) -> bool:
@@ -149,9 +160,13 @@ def setup_mcp_claude() -> str:
149
160
  """Auto-configure MCP in Claude Code.
150
161
 
151
162
  Strategy:
152
- 1. Use ``claude mcp add --scope user`` CLI if available (official method).
153
- 2. Fallback: write directly to ``~/.claude.json`` > ``mcpServers``.
154
- 3. Clean up deprecated ``~/.claude/mcp_servers.json`` (Claude Code ignores it).
163
+ Always use direct JSON write (``~/.claude.json``) rather than the
164
+ ``claude mcp add`` CLI path, because the CLI does not support the ``env``
165
+ block required for SurrealDB credential injection. The JSON write is
166
+ idempotent and includes the full ``env`` dict.
167
+
168
+ If an entry already exists but lacks ``env``, the env block is backfilled
169
+ so upgraded installations receive the credential config.
155
170
 
156
171
  Returns status string: "added", "exists", "failed", or "not_found".
157
172
  """
@@ -160,23 +175,35 @@ def setup_mcp_claude() -> str:
160
175
  return "not_found"
161
176
 
162
177
  claude_json = claude_dir.parent / ".claude.json"
163
-
164
- # Already registered?
165
- if _claude_json_has_server(claude_json, "surreal-memory"):
166
- _cleanup_stale_mcp_servers_json()
167
- return "exists"
168
-
169
- # Build the command to register
170
178
  mcp_entry = find_smem_command()
171
- command_args: list[str] = [mcp_entry["command"]]
172
- command_args.extend(mcp_entry.get("args", []))
173
179
 
174
- # Try official CLI first
175
- if _add_via_claude_cli("user", command_args):
176
- _cleanup_stale_mcp_servers_json()
177
- return "added"
180
+ # Check for existing entry
181
+ if claude_json.exists():
182
+ try:
183
+ raw = claude_json.read_text(encoding="utf-8").strip()
184
+ if raw:
185
+ data: dict[str, Any] = json.loads(raw)
186
+ servers = data.get("mcpServers", {})
187
+ if "surreal-memory" in servers:
188
+ existing = servers["surreal-memory"]
189
+ # If env already present and populated → exists
190
+ if existing.get("env", {}).get("SURREALDB_PASS"):
191
+ _cleanup_stale_mcp_servers_json()
192
+ return "exists"
193
+ # Backfill env for upgraded installations — backup first
194
+ try:
195
+ backup = claude_json.with_suffix(".json.bak")
196
+ backup.write_bytes(claude_json.read_bytes())
197
+ except OSError:
198
+ pass
199
+ existing["env"] = mcp_entry.get("env", {})
200
+ claude_json.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
201
+ _cleanup_stale_mcp_servers_json()
202
+ return "added"
203
+ except (json.JSONDecodeError, OSError):
204
+ pass
178
205
 
179
- # Fallback: direct JSON write
206
+ # Write full entry (includes env)
180
207
  if _add_via_claude_json(claude_json, mcp_entry):
181
208
  _cleanup_stale_mcp_servers_json()
182
209
  return "added"
@@ -221,6 +248,80 @@ def setup_mcp_cursor() -> str:
221
248
  return "failed"
222
249
 
223
250
 
251
+ def _claude_desktop_config_path() -> Path | None:
252
+ """Return the Claude Desktop config file path for the current OS.
253
+
254
+ Returns None when the parent directory does not exist (Desktop not installed).
255
+ """
256
+ import os
257
+
258
+ if sys.platform == "darwin":
259
+ config_dir = Path.home() / "Library" / "Application Support" / "Claude"
260
+ elif sys.platform == "win32":
261
+ appdata = os.environ.get("APPDATA", "")
262
+ if not appdata:
263
+ return None
264
+ config_dir = Path(appdata) / "Claude"
265
+ else:
266
+ config_dir = Path.home() / ".config" / "Claude"
267
+
268
+ if not config_dir.exists():
269
+ return None
270
+ return config_dir / "claude_desktop_config.json"
271
+
272
+
273
+ def setup_mcp_claude_desktop() -> str:
274
+ """Auto-configure MCP in Claude Desktop.
275
+
276
+ Writes or updates ``claude_desktop_config.json`` with a ``surreal-memory``
277
+ entry including the full ``env`` block so the Desktop app never starts the
278
+ MCP server with an empty environment.
279
+
280
+ Idempotent: if the entry already exists and has ``env.SURREALDB_PASS``,
281
+ returns ``"exists"``. If the entry exists without ``env``, backfills it
282
+ and returns ``"added"``. Creates a ``.bak`` backup before any write.
283
+
284
+ Returns status string: ``"added"``, ``"exists"``, ``"failed"``,
285
+ or ``"not_found"`` (Desktop not installed).
286
+ """
287
+ config_path = _claude_desktop_config_path()
288
+ if config_path is None:
289
+ return "not_found"
290
+
291
+ mcp_entry = find_smem_command()
292
+
293
+ existing: dict[str, Any] = {}
294
+ if config_path.exists():
295
+ try:
296
+ raw = config_path.read_text(encoding="utf-8").strip()
297
+ if raw:
298
+ existing = json.loads(raw)
299
+ except (json.JSONDecodeError, OSError):
300
+ existing = {}
301
+
302
+ servers = existing.get("mcpServers", {})
303
+ if "surreal-memory" in servers:
304
+ current = servers["surreal-memory"]
305
+ if current.get("env", {}).get("SURREALDB_PASS"):
306
+ return "exists"
307
+ # Backfill env for upgraded installations — fall through to write
308
+
309
+ # Backup before modifying
310
+ try:
311
+ backup = config_path.with_suffix(".json.bak")
312
+ backup.write_bytes(config_path.read_bytes())
313
+ except OSError:
314
+ pass
315
+
316
+ try:
317
+ servers = existing.setdefault("mcpServers", {})
318
+ servers["surreal-memory"] = mcp_entry
319
+ config_path.write_text(json.dumps(existing, indent=2) + "\n", encoding="utf-8")
320
+ return "added"
321
+ except OSError:
322
+ return "failed"
323
+
324
+
224
325
  def _normalize_path(path: str) -> str:
225
326
  """Normalize a filesystem path for use in shell commands.
226
327
 
@@ -16,6 +16,7 @@ from surreal_memory.cli.setup import (
16
16
  setup_config,
17
17
  setup_hooks_claude,
18
18
  setup_mcp_claude,
19
+ setup_mcp_claude_desktop,
19
20
  setup_mcp_cursor,
20
21
  setup_skills,
21
22
  )
@@ -91,6 +92,9 @@ def run_wizard(*, force: bool = False) -> None:
91
92
  cursor_status = setup_mcp_cursor()
92
93
  _format_mcp_result(results, "Cursor", cursor_status)
93
94
 
95
+ desktop_status = setup_mcp_claude_desktop()
96
+ _format_mcp_result(results, "Claude Desktop", desktop_status)
97
+
94
98
  # Step 5: Hooks
95
99
  hook_status = setup_hooks_claude()
96
100
  hook_labels = {
@@ -299,6 +299,16 @@ class DiagnosticsEngine:
299
299
  Returns:
300
300
  BrainHealthReport with scores, warnings, and recommendations
301
301
  """
302
+ # Pin storage to the analyzed brain before any brain-scoped reads.
303
+ # The SurrealDB backend uses a single shared storage singleton with a
304
+ # mutable current-brain pointer; without this, a concurrent multi-brain
305
+ # dashboard call (e.g. /stats analyzing both brains) leaves the pointer
306
+ # on a different brain, and get_all_synapses()/get_fibers() then return
307
+ # the WRONG brain's data — producing a false orphan rate. Harmless on
308
+ # backends that scope storage per brain (e.g. SQLite per-file).
309
+ if hasattr(self._storage, "set_brain"):
310
+ self._storage.set_brain(brain_id)
311
+
302
312
  # Gather base data
303
313
  enhanced = await self._storage.get_enhanced_stats(brain_id)
304
314
  neuron_count: int = enhanced.get("neuron_count", 0)
@@ -55,6 +55,7 @@ from surreal_memory.mcp.train_handler import TrainHandler
55
55
  from surreal_memory.mcp.version_check_handler import VersionCheckHandler
56
56
  from surreal_memory.mcp.visualize_handler import VisualizeHandler
57
57
  from surreal_memory.mcp.watch_handler import WatchHandler
58
+ from surreal_memory.storage.surrealdb.connection import StorageAuthError
58
59
  from surreal_memory.unified_config import get_config, get_shared_storage
59
60
 
60
61
  if TYPE_CHECKING:
@@ -492,6 +493,17 @@ async def handle_message(server: MCPServer, message: dict[str, Any]) -> dict[str
492
493
  "message": f"Tool '{tool_name}' timed out after {_TOOL_CALL_TIMEOUT}s",
493
494
  },
494
495
  }
496
+ except StorageAuthError as exc:
497
+ logger.error("Tool '%s' failed: SurrealDB auth error", tool_name)
498
+ try:
499
+ await _record_tool_event(server, tool_name, tool_args, t0, success=False)
500
+ except Exception:
501
+ logger.debug("Tool event recording failed", exc_info=True)
502
+ return {
503
+ "jsonrpc": "2.0",
504
+ "id": msg_id,
505
+ "error": {"code": -32001, "message": str(exc)},
506
+ }
495
507
  except Exception:
496
508
  logger.error("Tool '%s' raised an exception", tool_name, exc_info=True)
497
509
  try:
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import asyncio
6
5
  import logging
7
6
  from pathlib import Path
8
7
  from typing import Annotated, Any
@@ -130,7 +129,12 @@ async def get_stats() -> DashboardStats:
130
129
  logger.warning("Brain analysis failed for %s", name, exc_info=True)
131
130
  return BrainSummary(id=name, name=name, is_active=name == active_name)
132
131
 
133
- brains = list(await asyncio.gather(*[_analyze_brain(name) for name in brain_names]))
132
+ # Analyze brains sequentially, NOT via asyncio.gather: the SurrealDB backend
133
+ # shares one storage singleton with a mutable current-brain pointer, so
134
+ # concurrent per-brain analysis races and corrupts orphan/synapse reads
135
+ # (each _analyze_brain repins the shared pointer). Sequential keeps each
136
+ # brain's reads consistent. Brain count is tiny, so latency is negligible.
137
+ brains = [await _analyze_brain(name) for name in brain_names]
134
138
 
135
139
  total_n = sum(b.neuron_count for b in brains)
136
140
  total_s = sum(b.synapse_count for b in brains)
@@ -192,7 +196,15 @@ async def get_tier_stats(
192
196
  summary="List all brains",
193
197
  )
194
198
  async def list_brains_api() -> list[BrainSummary]:
195
- """List all available brains with summary stats."""
199
+ """List all available brains with summary stats, including health grade.
200
+
201
+ Previously this endpoint left grade/purity at their model defaults (F / 0.0)
202
+ because it never ran diagnostics, so the dashboard's Brains table showed
203
+ every brain as grade F while the stats cards (which DO run diagnostics)
204
+ showed the real grade — the F-vs-D mismatch. Run diagnostics per brain here
205
+ too, sequentially (the SurrealDB backend shares one storage singleton with a
206
+ mutable brain pointer, so concurrent analysis would race).
207
+ """
196
208
  from surreal_memory.unified_config import (
197
209
  get_config,
198
210
  get_shared_storage,
@@ -208,6 +220,16 @@ async def list_brains_api() -> list[BrainSummary]:
208
220
  try:
209
221
  brain_storage = await get_shared_storage(brain_name=name)
210
222
  stats = await brain_storage.get_stats(name)
223
+ grade = "F"
224
+ purity = 0.0
225
+ try:
226
+ from surreal_memory.engine.diagnostics import DiagnosticsEngine
227
+
228
+ report = await DiagnosticsEngine(brain_storage).analyze(name)
229
+ grade = report.grade
230
+ purity = report.purity_score
231
+ except Exception:
232
+ logger.debug("Diagnostics failed for brain %s", name, exc_info=True)
211
233
  results.append(
212
234
  BrainSummary(
213
235
  id=name,
@@ -215,11 +237,13 @@ async def list_brains_api() -> list[BrainSummary]:
215
237
  neuron_count=stats.get("neuron_count", 0),
216
238
  synapse_count=stats.get("synapse_count", 0),
217
239
  fiber_count=stats.get("fiber_count", 0),
240
+ grade=grade,
241
+ purity_score=purity,
218
242
  is_active=name == active_name,
219
243
  )
220
244
  )
221
245
  except Exception:
222
- logger.debug("Failed to get stats for brain %s", name, exc_info=True)
246
+ logger.warning("Brain summary failed for %s", name, exc_info=True)
223
247
  results.append(BrainSummary(id=name, name=name, is_active=name == active_name))
224
248
 
225
249
  return results