surreal-memory 2.7.2__tar.gz → 2.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/PKG-INFO +1 -1
  2. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/pyproject.toml +1 -1
  3. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/__init__.py +1 -1
  4. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/diagnostics.py +43 -17
  5. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/app.py +23 -1
  6. surreal_memory-2.7.4/src/surreal_memory/server/dashboard_cache.py +82 -0
  7. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/dashboard_api.py +50 -28
  8. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/base.py +3 -1
  9. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/factory.py +6 -2
  10. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_store.py +3 -1
  11. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store.py +3 -1
  12. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_store.py +3 -1
  13. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/schema.py +7 -0
  14. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/store.py +122 -75
  15. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/.gitignore +0 -0
  16. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/LICENSE +0 -0
  17. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/NOTICE +0 -0
  18. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/README.md +0 -0
  19. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/__init__.py +0 -0
  20. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/__main__.py +0 -0
  21. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/_helpers.py +0 -0
  22. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/__init__.py +0 -0
  23. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/brain.py +0 -0
  24. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/codebase.py +0 -0
  25. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/config_cmd.py +0 -0
  26. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/habits.py +0 -0
  27. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/info.py +0 -0
  28. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/listing.py +0 -0
  29. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/memory.py +0 -0
  30. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/project.py +0 -0
  31. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/reindex.py +0 -0
  32. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/shared.py +0 -0
  33. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/shortcuts.py +0 -0
  34. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/storage.py +0 -0
  35. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/telegram.py +0 -0
  36. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/tools.py +0 -0
  37. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/train.py +0 -0
  38. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/update.py +0 -0
  39. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/version.py +0 -0
  40. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/watch.py +0 -0
  41. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/config.py +0 -0
  42. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/doctor.py +0 -0
  43. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/embedding_setup.py +0 -0
  44. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/full_setup.py +0 -0
  45. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/graph_export.py +0 -0
  46. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/ide_rules.py +0 -0
  47. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/main.py +0 -0
  48. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/markdown_export.py +0 -0
  49. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/setup.py +0 -0
  50. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/storage.py +0 -0
  51. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/tui.py +0 -0
  52. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/update_check.py +0 -0
  53. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/wizard.py +0 -0
  54. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/config_presets.py +0 -0
  55. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/__init__.py +0 -0
  56. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/action_event.py +0 -0
  57. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/alert.py +0 -0
  58. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/brain.py +0 -0
  59. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/brain_mode.py +0 -0
  60. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/eternal_context.py +0 -0
  61. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/fiber.py +0 -0
  62. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/memory_types.py +0 -0
  63. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/neuron.py +0 -0
  64. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/project.py +0 -0
  65. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/review_schedule.py +0 -0
  66. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/source.py +0 -0
  67. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/synapse.py +0 -0
  68. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/trigger_engine.py +0 -0
  69. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/__init__.py +0 -0
  70. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/activation.py +0 -0
  71. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/arousal.py +0 -0
  72. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/associative_inference.py +0 -0
  73. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_evolution.py +0 -0
  74. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_transplant.py +0 -0
  75. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_versioning.py +0 -0
  76. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/causal_traversal.py +0 -0
  77. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/chart_generator.py +0 -0
  78. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/chunking.py +0 -0
  79. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/citation.py +0 -0
  80. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/clustering.py +0 -0
  81. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/codebase_encoder.py +0 -0
  82. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/cognitive.py +0 -0
  83. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/compression.py +0 -0
  84. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/conflict_auto_resolve.py +0 -0
  85. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/conflict_detection.py +0 -0
  86. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/connection_explainer.py +0 -0
  87. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/consolidation.py +0 -0
  88. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/consolidation_delta.py +0 -0
  89. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_merger.py +0 -0
  90. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_optimizer.py +0 -0
  91. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_retrieval.py +0 -0
  92. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/cross_brain.py +0 -0
  93. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_introspector.py +0 -0
  94. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_knowledge.py +0 -0
  95. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_trainer.py +0 -0
  96. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/decision_intel.py +0 -0
  97. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/__init__.py +0 -0
  98. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/config.py +0 -0
  99. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/llm_judge.py +0 -0
  100. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/pipeline.py +0 -0
  101. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/prompts.py +0 -0
  102. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/depth_prior.py +0 -0
  103. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_chunker.py +0 -0
  104. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_extractor.py +0 -0
  105. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_trainer.py +0 -0
  106. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dream.py +0 -0
  107. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/drift_detection.py +0 -0
  108. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/__init__.py +0 -0
  109. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/capability.py +0 -0
  110. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/config.py +0 -0
  111. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/gemini_embedding.py +0 -0
  112. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/ollama_embedding.py +0 -0
  113. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/openai_embedding.py +0 -0
  114. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/openrouter_embedding.py +0 -0
  115. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/provider.py +0 -0
  116. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/retry.py +0 -0
  117. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/sentence_transformer.py +0 -0
  118. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/encoder.py +0 -0
  119. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/enrichment.py +0 -0
  120. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fidelity.py +0 -0
  121. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/file_watcher.py +0 -0
  122. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fuzzy_match.py +0 -0
  123. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fuzzy_query.py +0 -0
  124. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/gromov.py +0 -0
  125. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/hippocampal_replay.py +0 -0
  126. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/hooks.py +0 -0
  127. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/idf_anchor.py +0 -0
  128. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/importance.py +0 -0
  129. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/interference.py +0 -0
  130. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/koopman.py +0 -0
  131. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/learning_rule.py +0 -0
  132. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/lifecycle.py +0 -0
  133. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/memory_stages.py +0 -0
  134. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/merge.py +0 -0
  135. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/narrative.py +0 -0
  136. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pattern_extraction.py +0 -0
  137. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pipeline.py +0 -0
  138. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pipeline_steps.py +0 -0
  139. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/ppr_activation.py +0 -0
  140. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/prediction_error.py +0 -0
  141. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/priming.py +0 -0
  142. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/quality_scorer.py +0 -0
  143. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_expander.py +0 -0
  144. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_expansion.py +0 -0
  145. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_pattern_mining.py +0 -0
  146. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reconsolidation.py +0 -0
  147. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reconstruction.py +0 -0
  148. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reflection.py +0 -0
  149. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reflex_activation.py +0 -0
  150. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reranker.py +0 -0
  151. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval.py +0 -0
  152. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval_context.py +0 -0
  153. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval_types.py +0 -0
  154. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/schema_assimilation.py +0 -0
  155. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/score_fusion.py +0 -0
  156. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/semantic_discovery.py +0 -0
  157. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/sequence_mining.py +0 -0
  158. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/session_state.py +0 -0
  159. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/spaced_repetition.py +0 -0
  160. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/stabilization.py +0 -0
  161. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/sufficiency.py +0 -0
  162. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/temporal_binding.py +0 -0
  163. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/tier_engine.py +0 -0
  164. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/token_budget.py +0 -0
  165. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/token_normalizer.py +0 -0
  166. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/tool_memory.py +0 -0
  167. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/topology_analysis.py +0 -0
  168. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/watch_state.py +0 -0
  169. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/workflow_suggest.py +0 -0
  170. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/write_queue.py +0 -0
  171. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/__init__.py +0 -0
  172. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/codebase.py +0 -0
  173. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/entities.py +0 -0
  174. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/keywords.py +0 -0
  175. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/llm_provider.py +0 -0
  176. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/parser.py +0 -0
  177. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/relations.py +0 -0
  178. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/router.py +0 -0
  179. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/sentiment.py +0 -0
  180. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/structure_detector.py +0 -0
  181. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/temporal.py +0 -0
  182. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/git_context.py +0 -0
  183. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/__init__.py +0 -0
  184. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/post_tool_use.py +0 -0
  185. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/pre_compact.py +0 -0
  186. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/project_context.py +0 -0
  187. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/session_start.py +0 -0
  188. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/stop.py +0 -0
  189. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/task_context.py +0 -0
  190. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/__init__.py +0 -0
  191. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapter.py +0 -0
  192. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/__init__.py +0 -0
  193. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/awf_adapter.py +0 -0
  194. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/chromadb_adapter.py +0 -0
  195. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/cognee_adapter.py +0 -0
  196. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/graphiti_adapter.py +0 -0
  197. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/llamaindex_adapter.py +0 -0
  198. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/mem0_adapter.py +0 -0
  199. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/mapper.py +0 -0
  200. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/models.py +0 -0
  201. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/sync_engine.py +0 -0
  202. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/telegram.py +0 -0
  203. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/__init__.py +0 -0
  204. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/__init__.py +0 -0
  205. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/base_tool.py +0 -0
  206. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/context.py +0 -0
  207. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/memory_store.py +0 -0
  208. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/protocol.py +0 -0
  209. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/setup.py +0 -0
  210. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/tools.py +0 -0
  211. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/openclaw_config.py +0 -0
  212. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/__init__.py +0 -0
  213. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/__main__.py +0 -0
  214. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/alert_handler.py +0 -0
  215. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/auto_capture.py +0 -0
  216. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/auto_handler.py +0 -0
  217. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/budget_handler.py +0 -0
  218. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/cognitive_handler.py +0 -0
  219. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/conflict_handler.py +0 -0
  220. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/connection_handler.py +0 -0
  221. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/constants.py +0 -0
  222. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/db_train_handler.py +0 -0
  223. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/drift_handler.py +0 -0
  224. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/eternal_handler.py +0 -0
  225. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/evolution_handler.py +0 -0
  226. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/expiry_cleanup_handler.py +0 -0
  227. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/http_transport.py +0 -0
  228. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/index_handler.py +0 -0
  229. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/instruction_handler.py +0 -0
  230. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/lifecycle_handler.py +0 -0
  231. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/maintenance_handler.py +0 -0
  232. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/mem0_sync_handler.py +0 -0
  233. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/narrative_handler.py +0 -0
  234. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/offload_handler.py +0 -0
  235. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/onboarding_handler.py +0 -0
  236. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/prompt.py +0 -0
  237. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/provenance_handler.py +0 -0
  238. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/recall_handler.py +0 -0
  239. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/remember_handler.py +0 -0
  240. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/response_compactor.py +0 -0
  241. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/review_handler.py +0 -0
  242. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/scheduled_consolidation_handler.py +0 -0
  243. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/server.py +0 -0
  244. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/session_handler.py +0 -0
  245. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/stats_handler.py +0 -0
  246. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/surface_handler.py +0 -0
  247. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/sync_handler.py +0 -0
  248. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/telegram_handler.py +0 -0
  249. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tier_handler.py +0 -0
  250. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_handler_utils.py +0 -0
  251. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_handlers.py +0 -0
  252. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_schemas.py +0 -0
  253. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/train_handler.py +0 -0
  254. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/version_check_handler.py +0 -0
  255. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/visualize_handler.py +0 -0
  256. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/watch_handler.py +0 -0
  257. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/__init__.py +0 -0
  258. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/base.py +0 -0
  259. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/community.py +0 -0
  260. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/py.typed +0 -0
  261. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/__init__.py +0 -0
  262. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/encryption.py +0 -0
  263. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/freshness.py +0 -0
  264. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/input_firewall.py +0 -0
  265. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/sensitive.py +0 -0
  266. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/__init__.py +0 -0
  267. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/dependencies.py +0 -0
  268. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/models.py +0 -0
  269. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/__init__.py +0 -0
  270. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/brain.py +0 -0
  271. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/consolidation.py +0 -0
  272. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/hub.py +0 -0
  273. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/integration_status.py +0 -0
  274. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/memory.py +0 -0
  275. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/oauth.py +0 -0
  276. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/openclaw_api.py +0 -0
  277. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/sync.py +0 -0
  278. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/DiagramsPage-BZV40eAE.css +0 -0
  279. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/DiagramsPage-DbhaKtcI.js +0 -0
  280. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/EvolutionPage-CzD9dgSX.js +0 -0
  281. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/GraphPage-CrI1ELz_.js +0 -0
  282. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/HealthPage-9CH7uxp0.js +0 -0
  283. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/OraclePage--QnA7bus.js +0 -0
  284. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/OverviewPage-uovTY60B.js +0 -0
  285. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/ProGate-37WFbaAW.js +0 -0
  286. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/SettingsPage-BwQ0sSKJ.js +0 -0
  287. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/StoragePage-Dfp1G5qu.js +0 -0
  288. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/SyncPage-CNbeBod6.js +0 -0
  289. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/TimelinePage-C2MQrnce.js +0 -0
  290. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/ToolStatsPage-zZWqg3RV.js +0 -0
  291. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/VisualizePage-D-CKRU7v.js +0 -0
  292. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/card-CB2KYkrP.js +0 -0
  293. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/embed-gLOWnRXV.js +0 -0
  294. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/index-CWIfFh7B.css +0 -0
  295. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/index-DzyKsRxc.js +0 -0
  296. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/skeleton-B4zDkVHp.js +0 -0
  297. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/timer-DWAvo6M8.js +0 -0
  298. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-icons-BYlYobEK.js +0 -0
  299. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-motion-Ct_HHbYW.js +0 -0
  300. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-query-CqA1cBNl.js +0 -0
  301. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-react-BfuodpLv.js +0 -0
  302. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-recharts-BkwZfCWA.js +0 -0
  303. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-ui-Qm4_4bAc.js +0 -0
  304. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/index.html +0 -0
  305. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/__init__.py +0 -0
  306. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-audit/SKILL.md +0 -0
  307. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-evolution/SKILL.md +0 -0
  308. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-intake/SKILL.md +0 -0
  309. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/__init__.py +0 -0
  310. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_brain_ops.py +0 -0
  311. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_collections.py +0 -0
  312. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_reviews.py +0 -0
  313. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/neuron_cache.py +0 -0
  314. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/read_pool.py +0 -0
  315. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store_collections.py +0 -0
  316. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store_mappers.py +0 -0
  317. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_action_log.py +0 -0
  318. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_alerts.py +0 -0
  319. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_brain_ops.py +0 -0
  320. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_calibration.py +0 -0
  321. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_change_log.py +0 -0
  322. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_coactivation.py +0 -0
  323. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_cognitive.py +0 -0
  324. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_compression.py +0 -0
  325. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_depth_priors.py +0 -0
  326. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_devices.py +0 -0
  327. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_drift.py +0 -0
  328. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_entity_refs.py +0 -0
  329. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_fibers.py +0 -0
  330. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_maturation.py +0 -0
  331. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_merkle.py +0 -0
  332. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_neurons.py +0 -0
  333. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_projects.py +0 -0
  334. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_reviews.py +0 -0
  335. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_row_mappers.py +0 -0
  336. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_schema.py +0 -0
  337. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sessions.py +0 -0
  338. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sources.py +0 -0
  339. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_synapses.py +0 -0
  340. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sync_state.py +0 -0
  341. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_tool_events.py +0 -0
  342. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_training_files.py +0 -0
  343. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_typed.py +0 -0
  344. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_versioning.py +0 -0
  345. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/__init__.py +0 -0
  346. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/activity.py +0 -0
  347. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/alerts.py +0 -0
  348. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/cognitive.py +0 -0
  349. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/compression.py +0 -0
  350. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/connection.py +0 -0
  351. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/depth_priors.py +0 -0
  352. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/keyword_entity.py +0 -0
  353. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/maturation.py +0 -0
  354. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/migrations.py +0 -0
  355. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/projects.py +0 -0
  356. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/review_schedules.py +0 -0
  357. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/sources.py +0 -0
  358. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/tool_events.py +0 -0
  359. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/typed_memory.py +0 -0
  360. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/versions.py +0 -0
  361. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/__init__.py +0 -0
  362. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/generator.py +0 -0
  363. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/lifecycle.py +0 -0
  364. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/models.py +0 -0
  365. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/parser.py +0 -0
  366. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/resolver.py +0 -0
  367. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/serializer.py +0 -0
  368. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/token_budget.py +0 -0
  369. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/__init__.py +0 -0
  370. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/client.py +0 -0
  371. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/device.py +0 -0
  372. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/incremental_merge.py +0 -0
  373. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/merkle.py +0 -0
  374. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/protocol.py +0 -0
  375. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/sync_engine.py +0 -0
  376. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/unified_config.py +0 -0
  377. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/__init__.py +0 -0
  378. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/config.py +0 -0
  379. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/consolidation_lock.py +0 -0
  380. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/sandbox.py +0 -0
  381. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/simhash.py +0 -0
  382. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/ssl_helper.py +0 -0
  383. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/tag_normalizer.py +0 -0
  384. {surreal_memory-2.7.2 → surreal_memory-2.7.4}/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.7.2
3
+ Version: 2.7.4
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.7.2"
7
+ version = "2.7.4"
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.7.2"
19
+ __version__ = "2.7.4"
20
20
 
21
21
  __all__ = [
22
22
  "__version__",
@@ -7,6 +7,7 @@ Supports both MCP and CLI exposure.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import asyncio
10
11
  import math
11
12
  from dataclasses import dataclass, field
12
13
  from datetime import datetime, timedelta
@@ -322,8 +323,14 @@ class DiagnosticsEngine:
322
323
  if hasattr(self._storage, "set_brain"):
323
324
  self._storage.set_brain(brain_id)
324
325
 
325
- # Gather base data
326
- enhanced = await self._storage.get_enhanced_stats(brain_id)
326
+ # Gather base data. Skip the neuron-type breakdown — it is the priciest
327
+ # query on a large brain (~2.6 s / 64k neurons) and none of the health
328
+ # metrics below read it. Backends whose get_enhanced_stats predates the
329
+ # flag fall back to the full call.
330
+ try:
331
+ enhanced = await self._storage.get_enhanced_stats(brain_id, include_neuron_types=False)
332
+ except TypeError:
333
+ enhanced = await self._storage.get_enhanced_stats(brain_id)
327
334
  neuron_count: int = enhanced.get("neuron_count", 0)
328
335
  synapse_count: int = enhanced.get("synapse_count", 0)
329
336
  fiber_count: int = enhanced.get("fiber_count", 0)
@@ -335,15 +342,26 @@ class DiagnosticsEngine:
335
342
  # Compute individual metrics
336
343
  synapse_stats = enhanced.get("synapse_stats", {})
337
344
 
338
- # Fetch fibers once for freshness + diagnostics
339
- fibers = await self._storage.get_fibers(limit=10000)
345
+ # The remaining DB-bound reads are independent, so run them concurrently
346
+ # rather than serially (measured ~1.6x on the shared HTTP connection).
347
+ # orphan-rate needs both fibers and the connected-neuron set, so fetch
348
+ # the set here and hand it in (avoids a second scan inside the compute).
349
+ get_connected = getattr(self._storage, "get_connected_neuron_ids", None)
350
+
351
+ async def _connected_or_none() -> set[str] | None:
352
+ return await get_connected() if get_connected is not None else None
353
+
354
+ fibers, consolidation_ratio, activation_efficiency, connected = await asyncio.gather(
355
+ self._storage.get_fibers(limit=10000),
356
+ self._compute_consolidation_ratio(fiber_count),
357
+ self._compute_activation_efficiency(neuron_count),
358
+ _connected_or_none(),
359
+ )
340
360
 
341
361
  connectivity = self._compute_connectivity(synapse_count, neuron_count)
342
362
  diversity = self._compute_diversity(synapse_stats)
343
363
  freshness = self._compute_freshness(fibers)
344
- consolidation_ratio = await self._compute_consolidation_ratio(fiber_count)
345
- orphan_rate = await self._compute_orphan_rate(neuron_count, fibers)
346
- activation_efficiency = await self._compute_activation_efficiency(neuron_count)
364
+ orphan_rate = await self._compute_orphan_rate(neuron_count, fibers, connected=connected)
347
365
  recall_confidence = self._compute_recall_confidence(synapse_stats)
348
366
 
349
367
  # Compute purity score
@@ -500,7 +518,10 @@ class DiagnosticsEngine:
500
518
  return len(semantic_records) / fiber_count
501
519
 
502
520
  async def _compute_orphan_rate(
503
- self, neuron_count: int, fibers: list[Any] | None = None
521
+ self,
522
+ neuron_count: int,
523
+ fibers: list[Any] | None = None,
524
+ connected: set[str] | None = None,
504
525
  ) -> float:
505
526
  """Compute fraction of neurons with no synapses AND no fiber membership.
506
527
 
@@ -513,16 +534,21 @@ class DiagnosticsEngine:
513
534
  if neuron_count == 0:
514
535
  return 0.0
515
536
 
516
- # Prefer the DB-side distinct-endpoints aggregate over loading ~185k
517
- # Synapse objects (that scan was seconds of the dashboard's slowness).
518
- get_connected = getattr(self._storage, "get_connected_neuron_ids", None)
519
- if get_connected is not None:
520
- connected: set[str] = set(await get_connected())
537
+ # The caller may hand in the connected-neuron set (computed concurrently
538
+ # with the other reads). Otherwise fetch it: prefer the DB-side
539
+ # distinct-endpoints aggregate over loading ~185k Synapse objects (that
540
+ # scan was seconds of the dashboard's slowness).
541
+ if connected is None:
542
+ get_connected = getattr(self._storage, "get_connected_neuron_ids", None)
543
+ if get_connected is not None:
544
+ connected = set(await get_connected())
545
+ else:
546
+ connected = set()
547
+ for s in await self._storage.get_all_synapses():
548
+ connected.add(s.source_id)
549
+ connected.add(s.target_id)
521
550
  else:
522
- connected = set()
523
- for s in await self._storage.get_all_synapses():
524
- connected.add(s.source_id)
525
- connected.add(s.target_id)
551
+ connected = set(connected)
526
552
 
527
553
  # Also count neurons that belong to fibers as connected
528
554
  if fibers:
@@ -14,6 +14,7 @@ from fastapi.responses import FileResponse, RedirectResponse, Response
14
14
  from fastapi.staticfiles import StaticFiles
15
15
 
16
16
  from surreal_memory import __version__
17
+ from surreal_memory.server.dashboard_cache import TTLCache
17
18
  from surreal_memory.server.models import HealthResponse, ReadyResponse
18
19
  from surreal_memory.server.routes import (
19
20
  brain_router,
@@ -32,6 +33,12 @@ from surreal_memory.storage.sqlite_schema import SCHEMA_VERSION
32
33
  # Static files directory
33
34
  STATIC_DIR = Path(__file__).parent / "static"
34
35
 
36
+ # The graph view aggregates degree over the whole synapse graph + fetches the
37
+ # dense core's nodes/edges — a few seconds on a large brain. The graph structure
38
+ # is slow-moving, so cache the built payload per (brain, limit, offset) for a
39
+ # short window (see dashboard_cache).
40
+ _GRAPH_CACHE = TTLCache()
41
+
35
42
 
36
43
  @asynccontextmanager
37
44
  async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
@@ -586,6 +593,19 @@ def create_app(
586
593
  capped_limit = min(limit, 2000)
587
594
  edge_cap = 4000
588
595
 
596
+ # Serve a recently-built graph for this (brain, limit, offset) from cache.
597
+ _brain_id = "default"
598
+ _get_bid = getattr(storage, "_get_brain_id", None)
599
+ if _get_bid is not None:
600
+ try:
601
+ _brain_id = _get_bid()
602
+ except Exception:
603
+ pass
604
+ _cache_key = f"graph:{_brain_id}:{limit}:{offset}"
605
+ _cached_graph = _GRAPH_CACHE.get(_cache_key)
606
+ if _cached_graph is not None:
607
+ return dict(_cached_graph)
608
+
589
609
  # Degree ranking + edge fetch via DB aggregates/graph traversal when the
590
610
  # backend supports it (SurrealDB). Loading all ~185k synapses into Python
591
611
  # just to rank/filter them was ~10 s of the graph view's 30 s+ hang.
@@ -636,7 +656,7 @@ def create_app(
636
656
 
637
657
  fibers = await storage.get_fibers(limit=1000)
638
658
 
639
- return {
659
+ payload = {
640
660
  "neurons": [
641
661
  {
642
662
  "id": n.id,
@@ -673,6 +693,8 @@ def create_app(
673
693
  "fiber_count": len(fibers),
674
694
  },
675
695
  }
696
+ _GRAPH_CACHE.set(_cache_key, payload)
697
+ return payload
676
698
 
677
699
  # React SPA dist directory
678
700
  spa_dist = STATIC_DIR / "dist"
@@ -0,0 +1,82 @@
1
+ """Tiny TTL cache for the expensive dashboard reads.
2
+
3
+ The overview grade/purity (a full ``DiagnosticsEngine.analyze``) and the graph
4
+ view are inherently a few seconds each on a large brain — they aggregate over
5
+ hundreds of thousands of synapses (``GROUP BY`` scans that no index removes).
6
+ But these are *slow-moving quality/structure* views: the health grade barely
7
+ shifts between two page loads seconds apart, and neither does a 64k-node graph.
8
+
9
+ So instead of recomputing on every request, cache the result per brain for a
10
+ short window. Repeat loads (the common case — the dashboard auto-refreshes and
11
+ users navigate back and forth) are served instantly; the value is recomputed at
12
+ most once per TTL. Counts (neuron/synapse/fiber) are cheap and are NOT cached
13
+ here — the overview keeps them live.
14
+
15
+ TTL is read from ``SURREAL_MEMORY_DASHBOARD_CACHE_TTL`` (seconds); set it to 0 to
16
+ disable caching entirely (every request recomputes).
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import os
22
+ import time
23
+ from collections.abc import Callable
24
+ from typing import Any
25
+
26
+ _DEFAULT_TTL_SECONDS = 60.0
27
+
28
+
29
+ def _configured_ttl() -> float:
30
+ raw = os.environ.get("SURREAL_MEMORY_DASHBOARD_CACHE_TTL")
31
+ if raw is None or raw == "":
32
+ return _DEFAULT_TTL_SECONDS
33
+ try:
34
+ return max(0.0, float(raw))
35
+ except ValueError:
36
+ return _DEFAULT_TTL_SECONDS
37
+
38
+
39
+ class TTLCache:
40
+ """A minimal, single-process TTL cache.
41
+
42
+ Entries expire ``ttl`` seconds after they are written. A ttl of 0 disables
43
+ the cache (``get`` always misses, ``set`` is a no-op) so it can be turned off
44
+ without touching call sites. The clock is injectable for deterministic tests.
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ ttl: float | None = None,
50
+ *,
51
+ clock: Callable[[], float] = time.monotonic,
52
+ ) -> None:
53
+ self._ttl = _configured_ttl() if ttl is None else max(0.0, ttl)
54
+ self._clock = clock
55
+ self._store: dict[str, tuple[float, Any]] = {}
56
+
57
+ @property
58
+ def enabled(self) -> bool:
59
+ return self._ttl > 0
60
+
61
+ def get(self, key: str) -> Any | None:
62
+ if not self.enabled:
63
+ return None
64
+ entry = self._store.get(key)
65
+ if entry is None:
66
+ return None
67
+ written_at, value = entry
68
+ if self._clock() - written_at > self._ttl:
69
+ self._store.pop(key, None)
70
+ return None
71
+ return value
72
+
73
+ def set(self, key: str, value: Any) -> None:
74
+ if not self.enabled:
75
+ return
76
+ self._store[key] = (self._clock(), value)
77
+
78
+ def invalidate(self, key: str) -> None:
79
+ self._store.pop(key, None)
80
+
81
+ def clear(self) -> None:
82
+ self._store.clear()
@@ -9,11 +9,33 @@ from typing import Annotated, Any
9
9
  from fastapi import APIRouter, Depends, HTTPException, Query, Request
10
10
  from pydantic import BaseModel, Field
11
11
 
12
+ from surreal_memory.server.dashboard_cache import TTLCache
12
13
  from surreal_memory.server.dependencies import get_storage, require_local_request
13
14
  from surreal_memory.storage.base import NeuralStorage
14
15
 
15
16
  logger = logging.getLogger(__name__)
16
17
 
18
+ # Full diagnostics (grade/purity) aggregates over the whole synapse graph — a few
19
+ # seconds on a large brain. The grade is slow-moving, so cache it per brain for a
20
+ # short window; the overview's counts are computed live (cheap) around it.
21
+ _GRADE_CACHE = TTLCache()
22
+
23
+
24
+ async def _cached_grade_purity(storage: NeuralStorage, brain_name: str) -> tuple[str, float]:
25
+ """Return (grade, purity) for a brain, cached per brain for the TTL window."""
26
+ key = f"grade:{brain_name}"
27
+ cached = _GRADE_CACHE.get(key)
28
+ if cached is not None:
29
+ grade, purity = cached
30
+ return str(grade), float(purity)
31
+ from surreal_memory.engine.diagnostics import DiagnosticsEngine
32
+
33
+ report = await DiagnosticsEngine(storage).analyze(brain_name)
34
+ result = (report.grade, report.purity_score)
35
+ _GRADE_CACHE.set(key, result)
36
+ return result
37
+
38
+
17
39
  router = APIRouter(
18
40
  prefix="/api/dashboard",
19
41
  tags=["dashboard"],
@@ -91,42 +113,42 @@ async def get_stats() -> DashboardStats:
91
113
  active_name = cfg.current_brain
92
114
 
93
115
  async def _analyze_brain(name: str) -> BrainSummary:
94
- """Analyze a single brain using its own per-brain storage."""
116
+ """Summarize a single brain.
117
+
118
+ Only the ACTIVE brain gets the full DiagnosticsEngine.analyze (grade +
119
+ purity); every other brain returns just its counts. The overview shows
120
+ the active brain's grade at the top (health_grade) and the per-brain
121
+ grade has its own home (the /brains endpoint + the Health page), so
122
+ running the multi-second analyze for every brain was pure waste — a
123
+ station carrying integration-test residue brains paid a full diagnostic
124
+ pass for each of them on every overview load.
125
+ """
126
+ is_active = name == active_name
95
127
  try:
96
128
  brain_storage = await get_shared_storage(brain_name=name)
97
129
 
98
- grade = "F"
130
+ # Counts are cheap (indexed count()) — always compute them live so the
131
+ # neuron/synapse/fiber numbers are never stale.
132
+ stats = await brain_storage.get_stats(name)
133
+ grade = "—"
99
134
  purity = 0.0
100
- nc = sc = fc = 0
101
- try:
102
- from surreal_memory.engine.diagnostics import DiagnosticsEngine
103
-
104
- diag = DiagnosticsEngine(brain_storage)
105
- report = await diag.analyze(name)
106
- grade = report.grade
107
- purity = report.purity_score
108
- # The report already carries the counts (via get_enhanced_stats),
109
- # so a separate get_stats here would just repeat the same three
110
- # count queries per brain.
111
- nc = report.neuron_count
112
- sc = report.synapse_count
113
- fc = report.fiber_count
114
- except Exception:
115
- logger.debug("Diagnostics failed for brain %s", name, exc_info=True)
116
- stats = await brain_storage.get_stats(name)
117
- nc = stats.get("neuron_count", 0)
118
- sc = stats.get("synapse_count", 0)
119
- fc = stats.get("fiber_count", 0)
120
-
135
+ if is_active:
136
+ # Grade/purity is the multi-second part — served from the per-brain
137
+ # TTL cache (recomputed at most once per window).
138
+ try:
139
+ grade, purity = await _cached_grade_purity(brain_storage, name)
140
+ except Exception:
141
+ logger.debug("Diagnostics failed for active brain %s", name, exc_info=True)
142
+ grade = "F"
121
143
  return BrainSummary(
122
144
  id=name,
123
145
  name=name,
124
- neuron_count=nc,
125
- synapse_count=sc,
126
- fiber_count=fc,
146
+ neuron_count=stats.get("neuron_count", 0),
147
+ synapse_count=stats.get("synapse_count", 0),
148
+ fiber_count=stats.get("fiber_count", 0),
127
149
  grade=grade,
128
150
  purity_score=purity,
129
- is_active=name == active_name,
151
+ is_active=is_active,
130
152
  )
131
153
  except Exception:
132
154
  # Surface at WARNING (not debug): swallowing this silently made the
@@ -134,7 +156,7 @@ async def get_stats() -> DashboardStats:
134
156
  # storage/config misconfiguration. Keep returning a placeholder so
135
157
  # one bad brain does not break the whole dashboard.
136
158
  logger.warning("Brain analysis failed for %s", name, exc_info=True)
137
- return BrainSummary(id=name, name=name, is_active=name == active_name)
159
+ return BrainSummary(id=name, name=name, is_active=is_active)
138
160
 
139
161
  # Analyze brains sequentially, NOT via asyncio.gather: the SurrealDB backend
140
162
  # shares one storage singleton with a mutable current-brain pointer, so
@@ -712,7 +712,9 @@ class NeuralStorage(ABC):
712
712
  ...
713
713
 
714
714
  @abstractmethod
715
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
715
+ async def get_enhanced_stats(
716
+ self, brain_id: str, include_neuron_types: bool = True
717
+ ) -> dict[str, Any]:
716
718
  """
717
719
  Get enhanced statistics for a brain.
718
720
 
@@ -308,8 +308,12 @@ class HybridStorage:
308
308
  async def get_stats(self, brain_id: str) -> dict[str, int]:
309
309
  return await self._local.get_stats(brain_id)
310
310
 
311
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
312
- return await self._local.get_enhanced_stats(brain_id)
311
+ async def get_enhanced_stats(
312
+ self, brain_id: str, include_neuron_types: bool = True
313
+ ) -> dict[str, Any]:
314
+ return await self._local.get_enhanced_stats(
315
+ brain_id, include_neuron_types=include_neuron_types
316
+ )
313
317
 
314
318
  async def clear(self, brain_id: str) -> None:
315
319
  await self._local.clear(brain_id)
@@ -421,7 +421,9 @@ class InMemoryStorage(
421
421
  "project_count": len(self._projects[brain_id]),
422
422
  }
423
423
 
424
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
424
+ async def get_enhanced_stats(
425
+ self, brain_id: str, include_neuron_types: bool = True
426
+ ) -> dict[str, Any]:
425
427
  basic_stats = await self.get_stats(brain_id)
426
428
 
427
429
  # Hot neurons by access frequency
@@ -425,7 +425,9 @@ class SharedStorage(SharedFiberBrainMixin, NeuralStorage):
425
425
  "fiber_count": result.get("fiber_count", 0),
426
426
  }
427
427
 
428
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
428
+ async def get_enhanced_stats(
429
+ self, brain_id: str, include_neuron_types: bool = True
430
+ ) -> dict[str, Any]:
429
431
  """Get enhanced brain statistics via API."""
430
432
  result = await self._request("GET", f"/brain/{brain_id}/stats")
431
433
  return result
@@ -224,7 +224,9 @@ class SQLiteStorage(
224
224
  "project_count": row["project_count"] if row else 0,
225
225
  }
226
226
 
227
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
227
+ async def get_enhanced_stats(
228
+ self, brain_id: str, include_neuron_types: bool = True
229
+ ) -> dict[str, Any]:
228
230
  conn = self._ensure_read_conn()
229
231
  basic_stats = await self.get_stats(brain_id)
230
232
 
@@ -14,6 +14,12 @@ SCHEMA_SQL = """
14
14
  -- Surreal-Memory SurrealDB Schema
15
15
  -- ============================================================
16
16
 
17
+ -- Full-text analyzer for neuron.content search (the @@ operator). Defined
18
+ -- before the index that uses it. Tokenizes on whitespace/class and lowercases,
19
+ -- so keyword/entity lookups become case-insensitive and index-backed instead of
20
+ -- full-scanning with CONTAINS.
21
+ DEFINE ANALYZER IF NOT EXISTS smem_content TOKENIZERS blank, class FILTERS lowercase, ascii;
22
+
17
23
  -- Neurons (primary memory units)
18
24
  DEFINE TABLE neuron SCHEMAFULL;
19
25
  DEFINE FIELD id ON neuron TYPE string;
@@ -36,6 +42,7 @@ DEFINE INDEX idx_neuron_brain ON neuron FIELDS brain_id;
36
42
  DEFINE INDEX idx_neuron_type ON neuron FIELDS brain_id, type;
37
43
  DEFINE INDEX idx_neuron_hash ON neuron FIELDS brain_id, content_hash;
38
44
  DEFINE INDEX idx_neuron_content ON neuron FIELDS brain_id, content;
45
+ DEFINE INDEX IF NOT EXISTS idx_neuron_content_fts ON neuron FIELDS content FULLTEXT ANALYZER smem_content BM25;
39
46
  -- idx_neuron_embedding (HNSW) is defined dynamically in ensure_schema() with the
40
47
  -- configured embedding dimension, so the vector index always matches the model.
41
48