surreal-memory 2.7.2__tar.gz → 2.7.3__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 (383) hide show
  1. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/PKG-INFO +1 -1
  2. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/pyproject.toml +1 -1
  3. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/__init__.py +1 -1
  4. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/diagnostics.py +43 -17
  5. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/dashboard_api.py +39 -30
  6. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/base.py +3 -1
  7. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/factory.py +6 -2
  8. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/memory_store.py +3 -1
  9. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/shared_store.py +3 -1
  10. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_store.py +3 -1
  11. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/store.py +63 -30
  12. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/.gitignore +0 -0
  13. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/LICENSE +0 -0
  14. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/NOTICE +0 -0
  15. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/README.md +0 -0
  16. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/__init__.py +0 -0
  17. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/__main__.py +0 -0
  18. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/_helpers.py +0 -0
  19. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/__init__.py +0 -0
  20. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/brain.py +0 -0
  21. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/codebase.py +0 -0
  22. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/config_cmd.py +0 -0
  23. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/habits.py +0 -0
  24. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/info.py +0 -0
  25. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/listing.py +0 -0
  26. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/memory.py +0 -0
  27. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/project.py +0 -0
  28. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/reindex.py +0 -0
  29. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/shared.py +0 -0
  30. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/shortcuts.py +0 -0
  31. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/storage.py +0 -0
  32. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/telegram.py +0 -0
  33. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/tools.py +0 -0
  34. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/train.py +0 -0
  35. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/update.py +0 -0
  36. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/version.py +0 -0
  37. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/commands/watch.py +0 -0
  38. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/config.py +0 -0
  39. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/doctor.py +0 -0
  40. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/embedding_setup.py +0 -0
  41. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/full_setup.py +0 -0
  42. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/graph_export.py +0 -0
  43. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/ide_rules.py +0 -0
  44. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/main.py +0 -0
  45. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/markdown_export.py +0 -0
  46. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/setup.py +0 -0
  47. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/storage.py +0 -0
  48. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/tui.py +0 -0
  49. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/update_check.py +0 -0
  50. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/cli/wizard.py +0 -0
  51. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/config_presets.py +0 -0
  52. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/__init__.py +0 -0
  53. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/action_event.py +0 -0
  54. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/alert.py +0 -0
  55. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/brain.py +0 -0
  56. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/brain_mode.py +0 -0
  57. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/eternal_context.py +0 -0
  58. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/fiber.py +0 -0
  59. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/memory_types.py +0 -0
  60. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/neuron.py +0 -0
  61. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/project.py +0 -0
  62. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/review_schedule.py +0 -0
  63. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/source.py +0 -0
  64. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/synapse.py +0 -0
  65. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/core/trigger_engine.py +0 -0
  66. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/__init__.py +0 -0
  67. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/activation.py +0 -0
  68. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/arousal.py +0 -0
  69. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/associative_inference.py +0 -0
  70. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/brain_evolution.py +0 -0
  71. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/brain_transplant.py +0 -0
  72. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/brain_versioning.py +0 -0
  73. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/causal_traversal.py +0 -0
  74. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/chart_generator.py +0 -0
  75. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/chunking.py +0 -0
  76. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/citation.py +0 -0
  77. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/clustering.py +0 -0
  78. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/codebase_encoder.py +0 -0
  79. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/cognitive.py +0 -0
  80. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/compression.py +0 -0
  81. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/conflict_auto_resolve.py +0 -0
  82. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/conflict_detection.py +0 -0
  83. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/connection_explainer.py +0 -0
  84. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/consolidation.py +0 -0
  85. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/consolidation_delta.py +0 -0
  86. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/context_merger.py +0 -0
  87. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/context_optimizer.py +0 -0
  88. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/context_retrieval.py +0 -0
  89. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/cross_brain.py +0 -0
  90. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/db_introspector.py +0 -0
  91. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/db_knowledge.py +0 -0
  92. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/db_trainer.py +0 -0
  93. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/decision_intel.py +0 -0
  94. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dedup/__init__.py +0 -0
  95. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dedup/config.py +0 -0
  96. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dedup/llm_judge.py +0 -0
  97. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dedup/pipeline.py +0 -0
  98. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dedup/prompts.py +0 -0
  99. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/depth_prior.py +0 -0
  100. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/doc_chunker.py +0 -0
  101. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/doc_extractor.py +0 -0
  102. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/doc_trainer.py +0 -0
  103. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/dream.py +0 -0
  104. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/drift_detection.py +0 -0
  105. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/__init__.py +0 -0
  106. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/capability.py +0 -0
  107. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/config.py +0 -0
  108. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/gemini_embedding.py +0 -0
  109. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/ollama_embedding.py +0 -0
  110. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/openai_embedding.py +0 -0
  111. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/openrouter_embedding.py +0 -0
  112. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/provider.py +0 -0
  113. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/retry.py +0 -0
  114. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/embedding/sentence_transformer.py +0 -0
  115. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/encoder.py +0 -0
  116. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/enrichment.py +0 -0
  117. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/fidelity.py +0 -0
  118. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/file_watcher.py +0 -0
  119. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/fuzzy_match.py +0 -0
  120. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/fuzzy_query.py +0 -0
  121. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/gromov.py +0 -0
  122. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/hippocampal_replay.py +0 -0
  123. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/hooks.py +0 -0
  124. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/idf_anchor.py +0 -0
  125. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/importance.py +0 -0
  126. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/interference.py +0 -0
  127. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/koopman.py +0 -0
  128. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/learning_rule.py +0 -0
  129. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/lifecycle.py +0 -0
  130. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/memory_stages.py +0 -0
  131. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/merge.py +0 -0
  132. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/narrative.py +0 -0
  133. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/pattern_extraction.py +0 -0
  134. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/pipeline.py +0 -0
  135. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/pipeline_steps.py +0 -0
  136. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/ppr_activation.py +0 -0
  137. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/prediction_error.py +0 -0
  138. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/priming.py +0 -0
  139. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/quality_scorer.py +0 -0
  140. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/query_expander.py +0 -0
  141. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/query_expansion.py +0 -0
  142. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/query_pattern_mining.py +0 -0
  143. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/reconsolidation.py +0 -0
  144. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/reconstruction.py +0 -0
  145. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/reflection.py +0 -0
  146. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/reflex_activation.py +0 -0
  147. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/reranker.py +0 -0
  148. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/retrieval.py +0 -0
  149. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/retrieval_context.py +0 -0
  150. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/retrieval_types.py +0 -0
  151. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/schema_assimilation.py +0 -0
  152. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/score_fusion.py +0 -0
  153. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/semantic_discovery.py +0 -0
  154. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/sequence_mining.py +0 -0
  155. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/session_state.py +0 -0
  156. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/spaced_repetition.py +0 -0
  157. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/stabilization.py +0 -0
  158. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/sufficiency.py +0 -0
  159. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/temporal_binding.py +0 -0
  160. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/tier_engine.py +0 -0
  161. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/token_budget.py +0 -0
  162. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/token_normalizer.py +0 -0
  163. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/tool_memory.py +0 -0
  164. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/topology_analysis.py +0 -0
  165. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/watch_state.py +0 -0
  166. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/workflow_suggest.py +0 -0
  167. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/engine/write_queue.py +0 -0
  168. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/__init__.py +0 -0
  169. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/codebase.py +0 -0
  170. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/entities.py +0 -0
  171. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/keywords.py +0 -0
  172. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/llm_provider.py +0 -0
  173. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/parser.py +0 -0
  174. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/relations.py +0 -0
  175. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/router.py +0 -0
  176. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/sentiment.py +0 -0
  177. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/structure_detector.py +0 -0
  178. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/extraction/temporal.py +0 -0
  179. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/git_context.py +0 -0
  180. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/__init__.py +0 -0
  181. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/post_tool_use.py +0 -0
  182. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/pre_compact.py +0 -0
  183. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/project_context.py +0 -0
  184. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/session_start.py +0 -0
  185. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/stop.py +0 -0
  186. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/hooks/task_context.py +0 -0
  187. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/__init__.py +0 -0
  188. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapter.py +0 -0
  189. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/__init__.py +0 -0
  190. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/awf_adapter.py +0 -0
  191. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/chromadb_adapter.py +0 -0
  192. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/cognee_adapter.py +0 -0
  193. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/graphiti_adapter.py +0 -0
  194. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/llamaindex_adapter.py +0 -0
  195. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/adapters/mem0_adapter.py +0 -0
  196. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/mapper.py +0 -0
  197. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/models.py +0 -0
  198. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/sync_engine.py +0 -0
  199. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integration/telegram.py +0 -0
  200. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/__init__.py +0 -0
  201. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/__init__.py +0 -0
  202. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/base_tool.py +0 -0
  203. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/context.py +0 -0
  204. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/memory_store.py +0 -0
  205. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/protocol.py +0 -0
  206. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/setup.py +0 -0
  207. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/nanobot/tools.py +0 -0
  208. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/integrations/openclaw_config.py +0 -0
  209. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/__init__.py +0 -0
  210. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/__main__.py +0 -0
  211. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/alert_handler.py +0 -0
  212. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/auto_capture.py +0 -0
  213. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/auto_handler.py +0 -0
  214. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/budget_handler.py +0 -0
  215. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/cognitive_handler.py +0 -0
  216. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/conflict_handler.py +0 -0
  217. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/connection_handler.py +0 -0
  218. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/constants.py +0 -0
  219. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/db_train_handler.py +0 -0
  220. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/drift_handler.py +0 -0
  221. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/eternal_handler.py +0 -0
  222. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/evolution_handler.py +0 -0
  223. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/expiry_cleanup_handler.py +0 -0
  224. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/http_transport.py +0 -0
  225. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/index_handler.py +0 -0
  226. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/instruction_handler.py +0 -0
  227. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/lifecycle_handler.py +0 -0
  228. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/maintenance_handler.py +0 -0
  229. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/mem0_sync_handler.py +0 -0
  230. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/narrative_handler.py +0 -0
  231. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/offload_handler.py +0 -0
  232. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/onboarding_handler.py +0 -0
  233. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/prompt.py +0 -0
  234. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/provenance_handler.py +0 -0
  235. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/recall_handler.py +0 -0
  236. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/remember_handler.py +0 -0
  237. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/response_compactor.py +0 -0
  238. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/review_handler.py +0 -0
  239. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/scheduled_consolidation_handler.py +0 -0
  240. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/server.py +0 -0
  241. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/session_handler.py +0 -0
  242. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/stats_handler.py +0 -0
  243. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/surface_handler.py +0 -0
  244. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/sync_handler.py +0 -0
  245. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/telegram_handler.py +0 -0
  246. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/tier_handler.py +0 -0
  247. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/tool_handler_utils.py +0 -0
  248. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/tool_handlers.py +0 -0
  249. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/tool_schemas.py +0 -0
  250. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/train_handler.py +0 -0
  251. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/version_check_handler.py +0 -0
  252. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/visualize_handler.py +0 -0
  253. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/mcp/watch_handler.py +0 -0
  254. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/plugins/__init__.py +0 -0
  255. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/plugins/base.py +0 -0
  256. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/plugins/community.py +0 -0
  257. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/py.typed +0 -0
  258. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/safety/__init__.py +0 -0
  259. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/safety/encryption.py +0 -0
  260. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/safety/freshness.py +0 -0
  261. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/safety/input_firewall.py +0 -0
  262. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/safety/sensitive.py +0 -0
  263. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/__init__.py +0 -0
  264. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/app.py +0 -0
  265. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/dependencies.py +0 -0
  266. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/models.py +0 -0
  267. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/__init__.py +0 -0
  268. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/brain.py +0 -0
  269. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/consolidation.py +0 -0
  270. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/hub.py +0 -0
  271. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/integration_status.py +0 -0
  272. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/memory.py +0 -0
  273. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/oauth.py +0 -0
  274. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/openclaw_api.py +0 -0
  275. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/routes/sync.py +0 -0
  276. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/DiagramsPage-BZV40eAE.css +0 -0
  277. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/DiagramsPage-DbhaKtcI.js +0 -0
  278. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/EvolutionPage-CzD9dgSX.js +0 -0
  279. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/GraphPage-CrI1ELz_.js +0 -0
  280. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/HealthPage-9CH7uxp0.js +0 -0
  281. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/OraclePage--QnA7bus.js +0 -0
  282. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/OverviewPage-uovTY60B.js +0 -0
  283. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/ProGate-37WFbaAW.js +0 -0
  284. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/SettingsPage-BwQ0sSKJ.js +0 -0
  285. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/StoragePage-Dfp1G5qu.js +0 -0
  286. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/SyncPage-CNbeBod6.js +0 -0
  287. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/TimelinePage-C2MQrnce.js +0 -0
  288. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/ToolStatsPage-zZWqg3RV.js +0 -0
  289. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/VisualizePage-D-CKRU7v.js +0 -0
  290. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/card-CB2KYkrP.js +0 -0
  291. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/embed-gLOWnRXV.js +0 -0
  292. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/index-CWIfFh7B.css +0 -0
  293. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/index-DzyKsRxc.js +0 -0
  294. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/skeleton-B4zDkVHp.js +0 -0
  295. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/timer-DWAvo6M8.js +0 -0
  296. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-icons-BYlYobEK.js +0 -0
  297. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-motion-Ct_HHbYW.js +0 -0
  298. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-query-CqA1cBNl.js +0 -0
  299. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-react-BfuodpLv.js +0 -0
  300. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-recharts-BkwZfCWA.js +0 -0
  301. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/assets/vendor-ui-Qm4_4bAc.js +0 -0
  302. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/server/static/dist/index.html +0 -0
  303. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/skills/__init__.py +0 -0
  304. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/skills/memory-audit/SKILL.md +0 -0
  305. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/skills/memory-evolution/SKILL.md +0 -0
  306. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/skills/memory-intake/SKILL.md +0 -0
  307. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/__init__.py +0 -0
  308. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/memory_brain_ops.py +0 -0
  309. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/memory_collections.py +0 -0
  310. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/memory_reviews.py +0 -0
  311. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/neuron_cache.py +0 -0
  312. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/read_pool.py +0 -0
  313. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/shared_store_collections.py +0 -0
  314. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/shared_store_mappers.py +0 -0
  315. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_action_log.py +0 -0
  316. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_alerts.py +0 -0
  317. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_brain_ops.py +0 -0
  318. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_calibration.py +0 -0
  319. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_change_log.py +0 -0
  320. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_coactivation.py +0 -0
  321. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_cognitive.py +0 -0
  322. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_compression.py +0 -0
  323. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_depth_priors.py +0 -0
  324. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_devices.py +0 -0
  325. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_drift.py +0 -0
  326. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_entity_refs.py +0 -0
  327. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_fibers.py +0 -0
  328. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_maturation.py +0 -0
  329. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_merkle.py +0 -0
  330. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_neurons.py +0 -0
  331. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_projects.py +0 -0
  332. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_reviews.py +0 -0
  333. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_row_mappers.py +0 -0
  334. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_schema.py +0 -0
  335. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_sessions.py +0 -0
  336. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_sources.py +0 -0
  337. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_synapses.py +0 -0
  338. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_sync_state.py +0 -0
  339. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_tool_events.py +0 -0
  340. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_training_files.py +0 -0
  341. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_typed.py +0 -0
  342. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/sqlite_versioning.py +0 -0
  343. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/__init__.py +0 -0
  344. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/activity.py +0 -0
  345. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/alerts.py +0 -0
  346. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/cognitive.py +0 -0
  347. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/compression.py +0 -0
  348. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/connection.py +0 -0
  349. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/depth_priors.py +0 -0
  350. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/keyword_entity.py +0 -0
  351. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/maturation.py +0 -0
  352. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/migrations.py +0 -0
  353. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/projects.py +0 -0
  354. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/review_schedules.py +0 -0
  355. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/schema.py +0 -0
  356. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/sources.py +0 -0
  357. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/tool_events.py +0 -0
  358. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/typed_memory.py +0 -0
  359. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/storage/surrealdb/versions.py +0 -0
  360. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/__init__.py +0 -0
  361. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/generator.py +0 -0
  362. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/lifecycle.py +0 -0
  363. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/models.py +0 -0
  364. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/parser.py +0 -0
  365. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/resolver.py +0 -0
  366. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/serializer.py +0 -0
  367. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/surface/token_budget.py +0 -0
  368. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/__init__.py +0 -0
  369. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/client.py +0 -0
  370. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/device.py +0 -0
  371. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/incremental_merge.py +0 -0
  372. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/merkle.py +0 -0
  373. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/protocol.py +0 -0
  374. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/sync/sync_engine.py +0 -0
  375. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/unified_config.py +0 -0
  376. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/__init__.py +0 -0
  377. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/config.py +0 -0
  378. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/consolidation_lock.py +0 -0
  379. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/sandbox.py +0 -0
  380. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/simhash.py +0 -0
  381. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/ssl_helper.py +0 -0
  382. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/src/surreal_memory/utils/tag_normalizer.py +0 -0
  383. {surreal_memory-2.7.2 → surreal_memory-2.7.3}/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.3
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.3"
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.3"
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:
@@ -91,42 +91,51 @@ async def get_stats() -> DashboardStats:
91
91
  active_name = cfg.current_brain
92
92
 
93
93
  async def _analyze_brain(name: str) -> BrainSummary:
94
- """Analyze a single brain using its own per-brain storage."""
94
+ """Summarize a single brain.
95
+
96
+ Only the ACTIVE brain gets the full DiagnosticsEngine.analyze (grade +
97
+ purity); every other brain returns just its counts. The overview shows
98
+ the active brain's grade at the top (health_grade) and the per-brain
99
+ grade has its own home (the /brains endpoint + the Health page), so
100
+ running the multi-second analyze for every brain was pure waste — a
101
+ station carrying integration-test residue brains paid a full diagnostic
102
+ pass for each of them on every overview load.
103
+ """
104
+ is_active = name == active_name
95
105
  try:
96
106
  brain_storage = await get_shared_storage(brain_name=name)
97
107
 
98
- grade = "F"
99
- 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)
108
+ if is_active:
109
+ try:
110
+ from surreal_memory.engine.diagnostics import DiagnosticsEngine
111
+
112
+ diag = DiagnosticsEngine(brain_storage)
113
+ report = await diag.analyze(name)
114
+ return BrainSummary(
115
+ id=name,
116
+ name=name,
117
+ neuron_count=report.neuron_count,
118
+ synapse_count=report.synapse_count,
119
+ fiber_count=report.fiber_count,
120
+ grade=report.grade,
121
+ purity_score=report.purity_score,
122
+ is_active=True,
123
+ )
124
+ except Exception:
125
+ logger.debug("Diagnostics failed for active brain %s", name, exc_info=True)
120
126
 
127
+ # Inactive brain (or active-brain diagnostics failure): counts only.
128
+ # "—" flags grade as "not computed here" rather than a real F.
129
+ stats = await brain_storage.get_stats(name)
121
130
  return BrainSummary(
122
131
  id=name,
123
132
  name=name,
124
- neuron_count=nc,
125
- synapse_count=sc,
126
- fiber_count=fc,
127
- grade=grade,
128
- purity_score=purity,
129
- is_active=name == active_name,
133
+ neuron_count=stats.get("neuron_count", 0),
134
+ synapse_count=stats.get("synapse_count", 0),
135
+ fiber_count=stats.get("fiber_count", 0),
136
+ grade="F" if is_active else "—",
137
+ purity_score=0.0,
138
+ is_active=is_active,
130
139
  )
131
140
  except Exception:
132
141
  # Surface at WARNING (not debug): swallowing this silently made the
@@ -134,7 +143,7 @@ async def get_stats() -> DashboardStats:
134
143
  # storage/config misconfiguration. Keep returning a placeholder so
135
144
  # one bad brain does not break the whole dashboard.
136
145
  logger.warning("Brain analysis failed for %s", name, exc_info=True)
137
- return BrainSummary(id=name, name=name, is_active=name == active_name)
146
+ return BrainSummary(id=name, name=name, is_active=is_active)
138
147
 
139
148
  # Analyze brains sequentially, NOT via asyncio.gather: the SurrealDB backend
140
149
  # 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
 
@@ -10,6 +10,7 @@ from __future__ import annotations
10
10
  import asyncio
11
11
  import dataclasses
12
12
  import logging
13
+ import re
13
14
  from datetime import datetime
14
15
  from hashlib import sha256
15
16
  from typing import Any, Literal
@@ -96,6 +97,24 @@ def _to_surreal_id(record_id: str) -> str:
96
97
  return record_id.replace("-", "_")
97
98
 
98
99
 
100
+ _BRAIN_ID_SAFE = re.compile(r"^[a-zA-Z0-9_.\-]+$")
101
+
102
+
103
+ def _brain_literal(brain_id: str) -> str:
104
+ """Return ``brain_id`` as a safe inline SurrealQL string literal.
105
+
106
+ SurrealDB 3.2.0's planner only uses the ``brain_id`` index when the value is
107
+ an inline literal — a parameterized ``WHERE brain_id = $bid`` falls back to a
108
+ full table scan. On the 64k-neuron table (each row carrying a 1024-float
109
+ vector) that turned ``count() … GROUP ALL`` from 0.01 s into ~2.5 s, and it
110
+ was the single biggest cost behind the dashboard's stats endpoint. brain_id
111
+ is validated to a strict charset, so inlining it is injection-safe.
112
+ """
113
+ if not _BRAIN_ID_SAFE.match(brain_id):
114
+ raise ValueError(f"unsafe brain_id for inline query: {brain_id!r}")
115
+ return f'"{brain_id}"'
116
+
117
+
99
118
  def _from_surreal_id(surreal_id: str) -> str:
100
119
  """Extract the original ID from a SurrealDB record ID like 'neuron:abc_def'."""
101
120
  if ":" in surreal_id:
@@ -1430,17 +1449,14 @@ class SurrealDBStorage(
1430
1449
  # ================================================================
1431
1450
 
1432
1451
  async def get_stats(self, brain_id: str) -> dict[str, int]:
1433
- neuron_rows = await self._query(
1434
- "SELECT count() AS c FROM neuron WHERE brain_id = $bid GROUP ALL",
1435
- bid=brain_id,
1436
- )
1437
- synapse_rows = await self._query(
1438
- "SELECT count() AS c FROM synapse WHERE brain_id = $bid GROUP ALL",
1439
- bid=brain_id,
1440
- )
1441
- fiber_rows = await self._query(
1442
- "SELECT count() AS c FROM fiber WHERE brain_id = $bid GROUP ALL",
1443
- bid=brain_id,
1452
+ # Inline the (validated) brain_id so the count() aggregates use the
1453
+ # brain_id index instead of a full scan see _brain_literal. The three
1454
+ # scans are independent, so run them concurrently.
1455
+ lit = _brain_literal(brain_id)
1456
+ neuron_rows, synapse_rows, fiber_rows = await asyncio.gather(
1457
+ self._query(f"SELECT count() AS c FROM neuron WHERE brain_id = {lit} GROUP ALL"),
1458
+ self._query(f"SELECT count() AS c FROM synapse WHERE brain_id = {lit} GROUP ALL"),
1459
+ self._query(f"SELECT count() AS c FROM fiber WHERE brain_id = {lit} GROUP ALL"),
1444
1460
  )
1445
1461
 
1446
1462
  def _count(rows: list[Any]) -> int:
@@ -1454,15 +1470,22 @@ class SurrealDBStorage(
1454
1470
  "fiber_count": _count(fiber_rows),
1455
1471
  }
1456
1472
 
1457
- async def get_enhanced_stats(self, brain_id: str) -> dict[str, Any]:
1473
+ async def get_enhanced_stats(
1474
+ self, brain_id: str, include_neuron_types: bool = True
1475
+ ) -> dict[str, Any]:
1458
1476
  stats = await self.get_stats(brain_id)
1459
1477
 
1460
- # Neuron type breakdown
1461
- type_rows = await self._query(
1462
- "SELECT type, count() AS c FROM neuron WHERE brain_id = $bid GROUP BY type",
1463
- bid=brain_id,
1464
- )
1465
- type_counts = {str(r.get("type", "unknown")): int(r.get("c", 0)) for r in type_rows}
1478
+ # Neuron type breakdown. This GROUP BY over the whole neuron table is the
1479
+ # single most expensive query on a large brain (~2.6 s for 64k neurons)
1480
+ # and DiagnosticsEngine never reads it so callers that only need the
1481
+ # health metrics pass include_neuron_types=False to skip it entirely.
1482
+ type_counts: dict[str, int] = {}
1483
+ if include_neuron_types:
1484
+ type_rows = await self._query(
1485
+ "SELECT type, count() AS c FROM neuron WHERE brain_id = $bid GROUP BY type",
1486
+ bid=brain_id,
1487
+ )
1488
+ type_counts = {str(r.get("type", "unknown")): int(r.get("c", 0)) for r in type_rows}
1466
1489
 
1467
1490
  # Synapse stats by type — required by DiagnosticsEngine for diversity
1468
1491
  # (Shannon entropy over by_type counts) and recall_confidence (avg_weight).
@@ -2084,14 +2107,20 @@ class SurrealDBStorage(
2084
2107
  replaces loading ~185k Synapse objects (~10 s) for the orphan-rate metric
2085
2108
  with two distinct-key scans (~2 s total)."""
2086
2109
  bid = brain_id or self._get_brain_id()
2087
- connected: set[str] = set()
2088
- for field in ("in", "out"):
2089
- rows = await self._query(
2110
+
2111
+ async def _endpoints(field: str) -> list[Any]:
2112
+ return await self._query(
2090
2113
  f"SELECT VALUE {field} FROM synapse WHERE brain_id = $bid GROUP BY {field}",
2091
2114
  bid=bid,
2092
2115
  )
2093
- for rid in rows:
2094
- connected.add(_from_surreal_id(str(rid)))
2116
+
2117
+ # The two distinct-endpoint scans are independent, so run them
2118
+ # concurrently — on a large brain this ~halves the wall time (measured
2119
+ # 2.5 s -> ~1.3 s) versus scanning in then out.
2120
+ in_rows, out_rows = await asyncio.gather(_endpoints("in"), _endpoints("out"))
2121
+ connected: set[str] = set()
2122
+ for rid in (*in_rows, *out_rows):
2123
+ connected.add(_from_surreal_id(str(rid)))
2095
2124
  return connected
2096
2125
 
2097
2126
  async def get_synapse_degrees(self, brain_id: str | None = None) -> dict[str, int]:
@@ -2102,17 +2131,21 @@ class SurrealDBStorage(
2102
2131
  real ``in``/``out`` record links — the ``source_id``/``target_id``
2103
2132
  fields are computed and do not aggregate."""
2104
2133
  bid = brain_id or self._get_brain_id()
2105
- degree: dict[str, int] = {}
2106
- for field in ("in", "out"):
2107
- rows = await self._query(
2134
+
2135
+ async def _degree(field: str) -> list[Any]:
2136
+ return await self._query(
2108
2137
  f"SELECT {field} AS nid, count() AS deg FROM synapse"
2109
2138
  f" WHERE brain_id = $bid GROUP BY {field}",
2110
2139
  bid=bid,
2111
2140
  )
2112
- for r in rows:
2113
- nid = _endpoint_to_id(r.get("nid"))
2114
- if nid:
2115
- degree[nid] = degree.get(nid, 0) + int(r.get("deg", 0) or 0)
2141
+
2142
+ # The in/out degree scans are independent — run them concurrently.
2143
+ in_rows, out_rows = await asyncio.gather(_degree("in"), _degree("out"))
2144
+ degree: dict[str, int] = {}
2145
+ for r in (*in_rows, *out_rows):
2146
+ nid = _endpoint_to_id(r.get("nid"))
2147
+ if nid:
2148
+ degree[nid] = degree.get(nid, 0) + int(r.get("deg", 0) or 0)
2116
2149
  return degree
2117
2150
 
2118
2151
  async def get_edges_for_neurons(self, neuron_ids: list[str]) -> list[Synapse]:
File without changes
File without changes
File without changes