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.
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/PKG-INFO +1 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/pyproject.toml +1 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/__init__.py +1 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/diagnostics.py +43 -17
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/app.py +23 -1
- surreal_memory-2.7.4/src/surreal_memory/server/dashboard_cache.py +82 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/dashboard_api.py +50 -28
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/base.py +3 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/factory.py +6 -2
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_store.py +3 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store.py +3 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_store.py +3 -1
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/schema.py +7 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/store.py +122 -75
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/.gitignore +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/LICENSE +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/NOTICE +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/README.md +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/__main__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/_helpers.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/brain.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/codebase.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/config_cmd.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/habits.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/info.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/listing.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/memory.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/project.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/reindex.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/shared.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/shortcuts.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/storage.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/telegram.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/tools.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/train.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/update.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/version.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/commands/watch.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/doctor.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/embedding_setup.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/full_setup.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/graph_export.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/ide_rules.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/main.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/markdown_export.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/setup.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/storage.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/tui.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/update_check.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/cli/wizard.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/config_presets.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/action_event.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/alert.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/brain.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/brain_mode.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/eternal_context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/fiber.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/memory_types.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/neuron.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/project.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/review_schedule.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/source.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/synapse.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/core/trigger_engine.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/activation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/arousal.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/associative_inference.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_evolution.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_transplant.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/brain_versioning.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/causal_traversal.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/chart_generator.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/chunking.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/citation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/clustering.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/codebase_encoder.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/cognitive.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/compression.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/conflict_auto_resolve.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/conflict_detection.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/connection_explainer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/consolidation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/consolidation_delta.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_merger.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_optimizer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/context_retrieval.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/cross_brain.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_introspector.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_knowledge.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/db_trainer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/decision_intel.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/llm_judge.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/pipeline.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dedup/prompts.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/depth_prior.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_chunker.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_extractor.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/doc_trainer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/dream.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/drift_detection.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/capability.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/gemini_embedding.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/ollama_embedding.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/openai_embedding.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/openrouter_embedding.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/provider.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/retry.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/embedding/sentence_transformer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/encoder.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/enrichment.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fidelity.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/file_watcher.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fuzzy_match.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/fuzzy_query.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/gromov.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/hippocampal_replay.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/hooks.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/idf_anchor.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/importance.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/interference.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/koopman.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/learning_rule.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/lifecycle.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/memory_stages.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/merge.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/narrative.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pattern_extraction.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pipeline.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/pipeline_steps.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/ppr_activation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/prediction_error.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/priming.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/quality_scorer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_expander.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_expansion.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/query_pattern_mining.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reconsolidation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reconstruction.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reflection.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reflex_activation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/reranker.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval_context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/retrieval_types.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/schema_assimilation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/score_fusion.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/semantic_discovery.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/sequence_mining.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/session_state.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/spaced_repetition.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/stabilization.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/sufficiency.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/temporal_binding.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/tier_engine.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/token_budget.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/token_normalizer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/tool_memory.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/topology_analysis.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/watch_state.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/workflow_suggest.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/engine/write_queue.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/codebase.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/entities.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/keywords.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/llm_provider.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/parser.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/relations.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/router.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/sentiment.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/structure_detector.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/extraction/temporal.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/git_context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/post_tool_use.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/pre_compact.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/project_context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/session_start.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/stop.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/hooks/task_context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/awf_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/chromadb_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/cognee_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/graphiti_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/llamaindex_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/adapters/mem0_adapter.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/mapper.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/models.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/sync_engine.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integration/telegram.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/base_tool.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/context.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/memory_store.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/protocol.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/setup.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/nanobot/tools.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/integrations/openclaw_config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/__main__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/alert_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/auto_capture.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/auto_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/budget_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/cognitive_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/conflict_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/connection_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/constants.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/db_train_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/drift_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/eternal_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/evolution_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/expiry_cleanup_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/http_transport.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/index_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/instruction_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/lifecycle_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/maintenance_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/mem0_sync_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/narrative_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/offload_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/onboarding_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/prompt.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/provenance_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/recall_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/remember_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/response_compactor.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/review_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/scheduled_consolidation_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/server.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/session_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/stats_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/surface_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/sync_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/telegram_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tier_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_handler_utils.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_handlers.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/tool_schemas.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/train_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/version_check_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/visualize_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/mcp/watch_handler.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/base.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/plugins/community.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/py.typed +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/encryption.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/freshness.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/input_firewall.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/safety/sensitive.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/dependencies.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/models.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/brain.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/consolidation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/hub.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/integration_status.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/memory.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/oauth.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/openclaw_api.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/sync.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/DiagramsPage-BZV40eAE.css +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/DiagramsPage-DbhaKtcI.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/EvolutionPage-CzD9dgSX.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/GraphPage-CrI1ELz_.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/HealthPage-9CH7uxp0.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/OraclePage--QnA7bus.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/OverviewPage-uovTY60B.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/ProGate-37WFbaAW.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/SettingsPage-BwQ0sSKJ.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/StoragePage-Dfp1G5qu.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/SyncPage-CNbeBod6.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/TimelinePage-C2MQrnce.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/ToolStatsPage-zZWqg3RV.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/VisualizePage-D-CKRU7v.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/card-CB2KYkrP.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/embed-gLOWnRXV.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/index-CWIfFh7B.css +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/index-DzyKsRxc.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/skeleton-B4zDkVHp.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/timer-DWAvo6M8.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-icons-BYlYobEK.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-motion-Ct_HHbYW.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-query-CqA1cBNl.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-react-BfuodpLv.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-recharts-BkwZfCWA.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/assets/vendor-ui-Qm4_4bAc.js +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/static/dist/index.html +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-audit/SKILL.md +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-evolution/SKILL.md +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/skills/memory-intake/SKILL.md +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_brain_ops.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_collections.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/memory_reviews.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/neuron_cache.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/read_pool.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store_collections.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/shared_store_mappers.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_action_log.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_alerts.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_brain_ops.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_calibration.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_change_log.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_coactivation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_cognitive.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_compression.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_depth_priors.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_devices.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_drift.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_entity_refs.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_fibers.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_maturation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_merkle.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_neurons.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_projects.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_reviews.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_row_mappers.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_schema.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sessions.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sources.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_synapses.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_sync_state.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_tool_events.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_training_files.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_typed.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/sqlite_versioning.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/activity.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/alerts.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/cognitive.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/compression.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/connection.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/depth_priors.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/keyword_entity.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/maturation.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/migrations.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/projects.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/review_schedules.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/sources.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/tool_events.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/typed_memory.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/versions.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/generator.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/lifecycle.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/models.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/parser.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/resolver.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/serializer.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/surface/token_budget.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/client.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/device.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/incremental_merge.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/merkle.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/protocol.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/sync/sync_engine.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/unified_config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/__init__.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/config.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/consolidation_lock.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/sandbox.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/simhash.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/ssl_helper.py +0 -0
- {surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/utils/tag_normalizer.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
#
|
|
339
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
#
|
|
517
|
-
#
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
-
|
|
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()
|
{surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/server/routes/dashboard_api.py
RENAMED
|
@@ -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
|
-
"""
|
|
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
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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=
|
|
125
|
-
synapse_count=
|
|
126
|
-
fiber_count=
|
|
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=
|
|
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=
|
|
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(
|
|
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(
|
|
312
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
{surreal_memory-2.7.2 → surreal_memory-2.7.4}/src/surreal_memory/storage/surrealdb/schema.py
RENAMED
|
@@ -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
|
|