memmachine-server 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. {memmachine_server-0.3.1/src/memmachine_server.egg-info → memmachine_server-0.3.2}/PKG-INFO +1 -1
  2. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_database_conf.py +33 -0
  3. memmachine_server-0.3.2/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +256 -0
  4. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/database_conf.py +43 -0
  5. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/database_manager.py +30 -15
  6. {memmachine_server-0.3.1 → memmachine_server-0.3.2/src/memmachine_server.egg-info}/PKG-INFO +1 -1
  7. memmachine_server-0.3.1/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -121
  8. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/LICENSE +0 -0
  9. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/README.md +0 -0
  10. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/pyproject.toml +0 -0
  11. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/__init__.py +0 -0
  12. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/__init__.py +0 -0
  13. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/__init__.py +0 -0
  14. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/api/__init__.py +0 -0
  15. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/api/test_version.py +0 -0
  16. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
  17. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_configuration.py +0 -0
  18. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
  19. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
  20. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
  21. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
  22. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
  23. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
  24. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
  25. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
  26. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
  27. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
  28. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
  29. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +0 -0
  30. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
  31. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
  32. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
  33. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
  34. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +0 -0
  35. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
  36. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
  37. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
  38. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
  39. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
  40. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +0 -0
  41. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
  42. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
  43. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
  44. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
  45. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
  46. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
  47. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
  48. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
  49. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
  50. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
  51. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
  52. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
  53. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
  54. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
  55. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
  56. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
  57. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +0 -0
  58. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
  59. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
  60. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/test_utils.py +0 -0
  61. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  62. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
  63. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
  64. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/conftest.py +0 -0
  65. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
  66. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
  67. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  68. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
  69. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
  70. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -0
  71. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  72. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
  73. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +0 -0
  74. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
  75. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
  76. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/__init__.py +0 -0
  77. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_configuration_wizard.py +0 -0
  78. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
  79. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
  80. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/__init__.py +0 -0
  81. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/conftest.py +0 -0
  82. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memachine.py +0 -0
  83. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
  84. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
  85. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_mock.py +0 -0
  86. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
  87. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
  88. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
  89. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  90. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
  91. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
  92. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
  93. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
  94. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
  95. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  96. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  97. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
  98. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
  99. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
  100. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
  101. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
  102. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
  103. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
  104. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
  105. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +0 -0
  106. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
  107. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
  108. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
  109. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
  110. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
  111. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
  112. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
  113. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/__init__.py +0 -0
  114. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
  115. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_config_router.py +0 -0
  116. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_config_service.py +0 -0
  117. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
  118. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_router.py +0 -0
  119. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
  120. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
  121. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
  122. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
  123. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/test_middleware.py +0 -0
  124. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
  125. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/setup.cfg +0 -0
  126. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/__init__.py +0 -0
  127. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/__init__.py +0 -0
  128. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/api/__init__.py +0 -0
  129. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/api/version.py +0 -0
  130. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/__init__.py +0 -0
  131. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
  132. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
  133. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
  134. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/episodic_config.py +0 -0
  135. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
  136. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/log_conf.py +0 -0
  137. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
  138. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
  139. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
  140. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/data_types.py +0 -0
  141. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/__init__.py +0 -0
  142. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
  143. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/embedder.py +0 -0
  144. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/openai_embedder.py +0 -0
  145. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
  146. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/__init__.py +0 -0
  147. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +0 -0
  148. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
  149. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +0 -0
  150. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_storage.py +0 -0
  151. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/errors.py +0 -0
  152. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/__init__.py +0 -0
  153. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/filter_parser.py +0 -0
  154. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
  155. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/__init__.py +0 -0
  156. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
  157. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/language_model.py +0 -0
  158. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +0 -0
  159. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
  160. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
  161. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
  162. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
  163. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
  164. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/neo4j_utils.py +0 -0
  165. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/__init__.py +0 -0
  166. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
  167. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
  168. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
  169. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
  170. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
  171. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
  172. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/reranker.py +0 -0
  173. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
  174. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/__init__.py +0 -0
  175. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
  176. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
  177. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
  178. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
  179. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/resource_manager.py +0 -0
  180. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
  181. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/rw_locks.py +0 -0
  182. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/__init__.py +0 -0
  183. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
  184. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
  185. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/utils.py +0 -0
  186. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  187. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
  188. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
  189. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
  190. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
  191. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/__init__.py +0 -0
  192. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/data_types.py +0 -0
  193. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
  194. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/__init__.py +0 -0
  195. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  196. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
  197. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
  198. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/episodic_memory.py +0 -0
  199. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
  200. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
  201. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
  202. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -0
  203. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -0
  204. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
  205. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  206. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
  207. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
  208. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/__init__.py +0 -0
  209. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/configuration_wizard.py +0 -0
  210. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/memmachine_configure.py +0 -0
  211. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/utilities.py +0 -0
  212. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/main/__init__.py +0 -0
  213. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/main/memmachine.py +0 -0
  214. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
  215. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
  216. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
  217. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
  218. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
  219. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
  220. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
  221. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
  222. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
  223. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/__init__.py +0 -0
  224. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  225. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
  226. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
  227. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
  228. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_ingestion.py +0 -0
  229. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
  230. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
  231. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
  232. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
  233. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  234. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  235. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
  236. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
  237. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
  238. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
  239. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
  240. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
  241. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
  242. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
  243. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
  244. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
  245. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
  246. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
  247. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
  248. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
  249. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
  250. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
  251. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/__init__.py +0 -0
  252. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/__init__.py +0 -0
  253. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/config_router.py +0 -0
  254. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/config_service.py +0 -0
  255. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
  256. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/mcp.py +0 -0
  257. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/router.py +0 -0
  258. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/service.py +0 -0
  259. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/app.py +0 -0
  260. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/diagnostics.py +0 -0
  261. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/mcp_http.py +0 -0
  262. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/mcp_stdio.py +0 -0
  263. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/middleware.py +0 -0
  264. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/__init__.py +0 -0
  265. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
  266. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
  267. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
  268. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
  269. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
  270. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
  271. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
  272. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
  273. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/SOURCES.txt +0 -0
  274. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
  275. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/entry_points.txt +0 -0
  276. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/requires.txt +0 -0
  277. {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memmachine-server
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: MemMachine Server - The complete MemMachine memory system server with episodic and profile memory
5
5
  Author-email: MemMachine <noreply@memmachine.ai>
6
6
  License-Expression: Apache-2.0
@@ -166,6 +166,39 @@ def test_serialize_deserialize_database_conf(db_conf_dict):
166
166
  assert conf == conf_cp
167
167
 
168
168
 
169
+ def test_neo4j_pool_lifecycle_fields():
170
+ # Defaults are None (use driver's internal defaults)
171
+ conf = Neo4jConf()
172
+ assert conf.max_connection_lifetime is None
173
+ assert conf.liveness_check_timeout is None
174
+
175
+ # Explicit values round-trip correctly
176
+ conf = Neo4jConf(max_connection_lifetime=3000.0, liveness_check_timeout=300.0)
177
+ assert conf.max_connection_lifetime == 3000.0
178
+ assert conf.liveness_check_timeout == 300.0
179
+
180
+
181
+ def test_sqlalchemy_pool_lifecycle_fields():
182
+ # Defaults are None (use SQLAlchemy's internal defaults)
183
+ conf = SqlAlchemyConf(dialect="sqlite", driver="aiosqlite", path="test.db")
184
+ assert conf.pool_timeout is None
185
+ assert conf.pool_recycle is None
186
+ assert conf.pool_pre_ping is None
187
+
188
+ # Explicit values round-trip correctly
189
+ conf = SqlAlchemyConf(
190
+ dialect="sqlite",
191
+ driver="aiosqlite",
192
+ path="test.db",
193
+ pool_timeout=30,
194
+ pool_recycle=3000,
195
+ pool_pre_ping=True,
196
+ )
197
+ assert conf.pool_timeout == 30
198
+ assert conf.pool_recycle == 3000
199
+ assert conf.pool_pre_ping is True
200
+
201
+
169
202
  def test_neo4j_uri():
170
203
  conf = Neo4jConf(uri="bolt://localhost:1234")
171
204
  assert conf.get_uri() == "bolt://localhost:1234"
@@ -0,0 +1,256 @@
1
+ from typing import Any, cast
2
+ from unittest.mock import AsyncMock, MagicMock, patch
3
+
4
+ import pytest
5
+ from pydantic import SecretStr
6
+ from sqlalchemy.ext.asyncio import AsyncEngine
7
+
8
+ from memmachine_server.common.configuration.database_conf import (
9
+ DatabasesConf,
10
+ Neo4jConf,
11
+ SqlAlchemyConf,
12
+ )
13
+ from memmachine_server.common.resource_manager.database_manager import DatabaseManager
14
+ from memmachine_server.common.vector_graph_store import VectorGraphStore
15
+
16
+
17
+ @pytest.fixture
18
+ def mock_conf():
19
+ """Mock StoragesConf with dummy connection configurations."""
20
+ conf = MagicMock(spec=DatabasesConf)
21
+ conf.neo4j_confs = {
22
+ "neo1": Neo4jConf(
23
+ host="localhost", port=1234, user="neo", password=SecretStr("pw")
24
+ ),
25
+ }
26
+ conf.relational_db_confs = {
27
+ "pg1": SqlAlchemyConf(
28
+ dialect="postgresql",
29
+ driver="asyncpg",
30
+ host="localhost",
31
+ port=5432,
32
+ user="user",
33
+ password=SecretStr("password"),
34
+ db_name="testdb",
35
+ ),
36
+ "sqlite1": SqlAlchemyConf(
37
+ dialect="sqlite",
38
+ driver="aiosqlite",
39
+ path="test.db",
40
+ ),
41
+ }
42
+ conf.sqlite_confs = {}
43
+ conf.nebula_graph_confs = {}
44
+ return conf
45
+
46
+
47
+ @pytest.mark.asyncio
48
+ async def test_build_neo4j(mock_conf):
49
+ builder = DatabaseManager(mock_conf)
50
+ await builder._build_neo4j()
51
+
52
+ assert "neo1" in builder.graph_stores
53
+ driver = builder.graph_stores["neo1"]
54
+ assert isinstance(driver, VectorGraphStore)
55
+
56
+
57
+ @pytest.mark.asyncio
58
+ async def test_validate_neo4j(mock_conf):
59
+ builder = DatabaseManager(mock_conf)
60
+
61
+ mock_driver = MagicMock()
62
+ mock_session = AsyncMock()
63
+ mock_result = AsyncMock()
64
+ mock_record = {"ok": 1}
65
+
66
+ mock_driver.close = AsyncMock()
67
+ mock_result.single.return_value = mock_record
68
+ mock_session.run.return_value = mock_result
69
+
70
+ mock_driver.session.return_value.__aenter__ = AsyncMock(return_value=mock_session)
71
+ mock_driver.session.return_value.__aexit__ = AsyncMock(return_value=None)
72
+
73
+ builder.neo4j_drivers = {"neo1": mock_driver}
74
+
75
+ await builder._validate_neo4j_drivers()
76
+ mock_session.run.assert_awaited_once_with("RETURN 1 AS ok")
77
+
78
+
79
+ @pytest.mark.asyncio
80
+ async def test_build_sqlite(mock_conf):
81
+ builder = DatabaseManager(mock_conf)
82
+ await builder._build_sql_engines()
83
+
84
+ assert "sqlite1" in builder.sql_engines
85
+ assert isinstance(builder.sql_engines["sqlite1"], AsyncEngine)
86
+
87
+
88
+ @pytest.mark.asyncio
89
+ async def test_build_and_validate_sqlite():
90
+ conf = MagicMock(spec=DatabasesConf)
91
+ conf.neo4j_confs = {}
92
+ conf.nebula_graph_confs = {}
93
+ conf.relational_db_confs = {
94
+ "sqlite1": SqlAlchemyConf(
95
+ dialect="sqlite",
96
+ driver="aiosqlite",
97
+ path=":memory:",
98
+ )
99
+ }
100
+ builder = DatabaseManager(conf)
101
+ await builder.build_all(validate=True)
102
+ # If no exception is raised, validation passed
103
+ assert "sqlite1" in builder.sql_engines
104
+ await builder.close()
105
+ assert "sqlite1" not in builder.sql_engines
106
+
107
+
108
+ @pytest.mark.asyncio
109
+ async def test_build_all_without_validation(mock_conf):
110
+ builder = DatabaseManager(mock_conf)
111
+ builder_any = cast(Any, builder)
112
+ builder_any._build_neo4j = AsyncMock()
113
+ builder_any._build_sql_engines = AsyncMock()
114
+ builder_any._validate_neo4j_drivers = AsyncMock()
115
+ builder_any._validate_sql_engines = AsyncMock()
116
+
117
+ await builder.build_all(validate=False)
118
+
119
+ assert "sqlite1" in builder.sql_engines
120
+ assert "pg1" in builder.sql_engines
121
+ assert "neo1" in builder.graph_stores
122
+
123
+
124
+ @pytest.mark.asyncio
125
+ async def test_neo4j_pool_lifecycle_kwargs():
126
+ """max_connection_lifetime and liveness_check_timeout are forwarded to the driver."""
127
+ conf = MagicMock(spec=DatabasesConf)
128
+ neo4j_conf = Neo4jConf(
129
+ host="localhost",
130
+ port=7687,
131
+ user="neo4j",
132
+ password=SecretStr("pw"),
133
+ max_connection_lifetime=3000.0,
134
+ liveness_check_timeout=300.0,
135
+ )
136
+ conf.neo4j_confs = {"neo1": neo4j_conf}
137
+ conf.relational_db_confs = {}
138
+ conf.nebula_graph_confs = {}
139
+
140
+ mock_driver = MagicMock()
141
+ mock_driver.close = AsyncMock()
142
+
143
+ with (
144
+ patch(
145
+ "memmachine_server.common.resource_manager.database_manager.AsyncGraphDatabase.driver",
146
+ return_value=mock_driver,
147
+ ) as mock_driver_cls,
148
+ patch(
149
+ "memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStoreParams",
150
+ ),
151
+ patch(
152
+ "memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStore",
153
+ ),
154
+ ):
155
+ builder = DatabaseManager(conf)
156
+ await builder.async_get_neo4j_driver("neo1")
157
+
158
+ call_kwargs = mock_driver_cls.call_args.kwargs
159
+ assert call_kwargs["max_connection_lifetime"] == 3000.0
160
+ assert call_kwargs["liveness_check_timeout"] == 300.0
161
+
162
+
163
+ @pytest.mark.asyncio
164
+ async def test_sqlalchemy_pool_lifecycle_kwargs():
165
+ """pool_timeout, pool_recycle, and pool_pre_ping are forwarded to create_async_engine."""
166
+ conf = MagicMock(spec=DatabasesConf)
167
+ sql_conf = SqlAlchemyConf(
168
+ dialect="sqlite",
169
+ driver="aiosqlite",
170
+ path=":memory:",
171
+ pool_timeout=30,
172
+ pool_recycle=3000,
173
+ pool_pre_ping=True,
174
+ )
175
+ conf.neo4j_confs = {}
176
+ conf.nebula_graph_confs = {}
177
+ conf.relational_db_confs = {"db1": sql_conf}
178
+
179
+ mock_engine = MagicMock(spec=AsyncEngine)
180
+
181
+ with patch(
182
+ "memmachine_server.common.resource_manager.database_manager.create_async_engine",
183
+ return_value=mock_engine,
184
+ ) as mock_create:
185
+ builder = DatabaseManager(conf)
186
+ await builder.async_get_sql_engine("db1")
187
+
188
+ call_kwargs = mock_create.call_args.kwargs
189
+ assert call_kwargs["pool_timeout"] == 30
190
+ assert call_kwargs["pool_recycle"] == 3000
191
+ assert call_kwargs["pool_pre_ping"] is True
192
+
193
+
194
+ @pytest.mark.asyncio
195
+ async def test_neo4j_pool_lifecycle_kwargs_none_omitted():
196
+ """When pool lifecycle fields are None, they are not forwarded to the driver."""
197
+ conf = MagicMock(spec=DatabasesConf)
198
+ neo4j_conf = Neo4jConf(
199
+ host="localhost",
200
+ port=7687,
201
+ user="neo4j",
202
+ password=SecretStr("pw"),
203
+ )
204
+ conf.neo4j_confs = {"neo1": neo4j_conf}
205
+ conf.relational_db_confs = {}
206
+ conf.nebula_graph_confs = {}
207
+
208
+ mock_driver = MagicMock()
209
+ mock_driver.close = AsyncMock()
210
+
211
+ with (
212
+ patch(
213
+ "memmachine_server.common.resource_manager.database_manager.AsyncGraphDatabase.driver",
214
+ return_value=mock_driver,
215
+ ) as mock_driver_cls,
216
+ patch(
217
+ "memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStoreParams",
218
+ ),
219
+ patch(
220
+ "memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStore",
221
+ ),
222
+ ):
223
+ builder = DatabaseManager(conf)
224
+ await builder.async_get_neo4j_driver("neo1")
225
+
226
+ call_kwargs = mock_driver_cls.call_args.kwargs
227
+ assert "max_connection_lifetime" not in call_kwargs
228
+ assert "liveness_check_timeout" not in call_kwargs
229
+
230
+
231
+ @pytest.mark.asyncio
232
+ async def test_sqlalchemy_pool_lifecycle_kwargs_none_omitted():
233
+ """When pool lifecycle fields are None, they are not forwarded to create_async_engine."""
234
+ conf = MagicMock(spec=DatabasesConf)
235
+ sql_conf = SqlAlchemyConf(
236
+ dialect="sqlite",
237
+ driver="aiosqlite",
238
+ path=":memory:",
239
+ )
240
+ conf.neo4j_confs = {}
241
+ conf.nebula_graph_confs = {}
242
+ conf.relational_db_confs = {"db1": sql_conf}
243
+
244
+ mock_engine = MagicMock(spec=AsyncEngine)
245
+
246
+ with patch(
247
+ "memmachine_server.common.resource_manager.database_manager.create_async_engine",
248
+ return_value=mock_engine,
249
+ ) as mock_create:
250
+ builder = DatabaseManager(conf)
251
+ await builder.async_get_sql_engine("db1")
252
+
253
+ call_kwargs = mock_create.call_args.kwargs
254
+ assert "pool_timeout" not in call_kwargs
255
+ assert "pool_recycle" not in call_kwargs
256
+ assert "pool_pre_ping" not in call_kwargs
@@ -60,6 +60,24 @@ class Neo4jConf(YamlSerializableMixin, PasswordMixin):
60
60
  "Internal default is 60.0."
61
61
  ),
62
62
  )
63
+ max_connection_lifetime: float | None = Field(
64
+ default=None,
65
+ description=(
66
+ "Maximum connection lifetime in seconds. Connections older than this "
67
+ "are proactively closed and replaced. Set below your infrastructure's "
68
+ "idle-connection timeout (e.g. AuraDB's 60-minute limit) to avoid "
69
+ "handing out defunct connections. Internal default is 3600."
70
+ ),
71
+ )
72
+ liveness_check_timeout: float | None = Field(
73
+ default=None,
74
+ description=(
75
+ "Idle time in seconds after which a pooled connection is tested for "
76
+ "liveness before being handed to a caller. Catches connections that "
77
+ "were reset server-side while sitting idle in the pool. "
78
+ "Set to None to disable liveness checks."
79
+ ),
80
+ )
63
81
 
64
82
  def get_uri(self) -> str:
65
83
  if self.uri:
@@ -241,6 +259,31 @@ class SqlAlchemyConf(YamlSerializableMixin, PasswordMixin):
241
259
  "disposed of when no longer needed."
242
260
  ),
243
261
  )
262
+ pool_timeout: int | None = Field(
263
+ default=None,
264
+ description=(
265
+ "Maximum time in seconds to wait for a connection from the pool. "
266
+ "If no connection is available within this period, a TimeoutError "
267
+ "is raised. Internal default is 30."
268
+ ),
269
+ )
270
+ pool_recycle: int | None = Field(
271
+ default=None,
272
+ description=(
273
+ "Maximum age of a connection in seconds before it is recycled. "
274
+ "Connections older than this are transparently replaced on checkout. "
275
+ "Set below your database server's idle-connection timeout to avoid "
276
+ "handing out stale connections. Internal default is -1 (disabled)."
277
+ ),
278
+ )
279
+ pool_pre_ping: bool | None = Field(
280
+ default=None,
281
+ description=(
282
+ "When True, test each connection for liveness (via a lightweight "
283
+ "SELECT 1) before checking it out of the pool. Catches connections "
284
+ "that were reset server-side. Internal default is False."
285
+ ),
286
+ )
244
287
 
245
288
  @property
246
289
  def schema_part(self) -> str:
@@ -9,7 +9,10 @@ from neo4j import AsyncDriver, AsyncGraphDatabase
9
9
  from sqlalchemy import text
10
10
  from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
11
11
 
12
- from memmachine_server.common.configuration.database_conf import DatabasesConf
12
+ from memmachine_server.common.configuration.database_conf import (
13
+ DatabasesConf,
14
+ Neo4jConf,
15
+ )
13
16
  from memmachine_server.common.errors import (
14
17
  Neo4JConfigurationError,
15
18
  SQLConfigurationError,
@@ -120,6 +123,25 @@ class DatabaseManager:
120
123
  if tasks:
121
124
  await asyncio.gather(*tasks)
122
125
 
126
+ @staticmethod
127
+ def _build_neo4j_driver_kwargs(conf: Neo4jConf) -> dict[str, Any]:
128
+ """Build keyword arguments for AsyncGraphDatabase.driver from config."""
129
+ kwargs: dict[str, Any] = {
130
+ "uri": conf.get_uri(),
131
+ "auth": (conf.user, conf.password.get_secret_value()),
132
+ }
133
+ optional_fields = (
134
+ "max_connection_pool_size",
135
+ "connection_acquisition_timeout",
136
+ "max_connection_lifetime",
137
+ "liveness_check_timeout",
138
+ )
139
+ for field in optional_fields:
140
+ value = getattr(conf, field)
141
+ if value is not None:
142
+ kwargs[field] = value
143
+ return kwargs
144
+
123
145
  async def async_get_neo4j_driver(
124
146
  self, name: str, validate: bool = False
125
147
  ) -> AsyncDriver:
@@ -136,20 +158,7 @@ class DatabaseManager:
136
158
  if not conf:
137
159
  raise ValueError(f"Neo4j config '{name}' not found.")
138
160
 
139
- driver_kwargs: dict[str, Any] = {
140
- "uri": conf.get_uri(),
141
- "auth": (conf.user, conf.password.get_secret_value()),
142
- }
143
- if conf.max_connection_pool_size is not None:
144
- driver_kwargs["max_connection_pool_size"] = (
145
- conf.max_connection_pool_size
146
- )
147
- if conf.connection_acquisition_timeout is not None:
148
- driver_kwargs["connection_acquisition_timeout"] = (
149
- conf.connection_acquisition_timeout
150
- )
151
-
152
- driver = AsyncGraphDatabase.driver(**driver_kwargs)
161
+ driver = AsyncGraphDatabase.driver(**self._build_neo4j_driver_kwargs(conf))
153
162
  if validate:
154
163
  await self.validate_neo4j_driver(name, driver)
155
164
  self.neo4j_drivers[name] = driver
@@ -255,6 +264,12 @@ class DatabaseManager:
255
264
  engine_kwargs["pool_size"] = conf.pool_size
256
265
  if conf.max_overflow is not None:
257
266
  engine_kwargs["max_overflow"] = conf.max_overflow
267
+ if conf.pool_timeout is not None:
268
+ engine_kwargs["pool_timeout"] = conf.pool_timeout
269
+ if conf.pool_recycle is not None:
270
+ engine_kwargs["pool_recycle"] = conf.pool_recycle
271
+ if conf.pool_pre_ping is not None:
272
+ engine_kwargs["pool_pre_ping"] = conf.pool_pre_ping
258
273
 
259
274
  engine = create_async_engine(conf.uri, **engine_kwargs)
260
275
  if validate:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memmachine-server
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: MemMachine Server - The complete MemMachine memory system server with episodic and profile memory
5
5
  Author-email: MemMachine <noreply@memmachine.ai>
6
6
  License-Expression: Apache-2.0
@@ -1,121 +0,0 @@
1
- from typing import Any, cast
2
- from unittest.mock import AsyncMock, MagicMock
3
-
4
- import pytest
5
- from pydantic import SecretStr
6
- from sqlalchemy.ext.asyncio import AsyncEngine
7
-
8
- from memmachine_server.common.configuration.database_conf import (
9
- DatabasesConf,
10
- Neo4jConf,
11
- SqlAlchemyConf,
12
- )
13
- from memmachine_server.common.resource_manager.database_manager import DatabaseManager
14
- from memmachine_server.common.vector_graph_store import VectorGraphStore
15
-
16
-
17
- @pytest.fixture
18
- def mock_conf():
19
- """Mock StoragesConf with dummy connection configurations."""
20
- conf = MagicMock(spec=DatabasesConf)
21
- conf.neo4j_confs = {
22
- "neo1": Neo4jConf(
23
- host="localhost", port=1234, user="neo", password=SecretStr("pw")
24
- ),
25
- }
26
- conf.relational_db_confs = {
27
- "pg1": SqlAlchemyConf(
28
- dialect="postgresql",
29
- driver="asyncpg",
30
- host="localhost",
31
- port=5432,
32
- user="user",
33
- password=SecretStr("password"),
34
- db_name="testdb",
35
- ),
36
- "sqlite1": SqlAlchemyConf(
37
- dialect="sqlite",
38
- driver="aiosqlite",
39
- path="test.db",
40
- ),
41
- }
42
- conf.sqlite_confs = {}
43
- conf.nebula_graph_confs = {}
44
- return conf
45
-
46
-
47
- @pytest.mark.asyncio
48
- async def test_build_neo4j(mock_conf):
49
- builder = DatabaseManager(mock_conf)
50
- await builder._build_neo4j()
51
-
52
- assert "neo1" in builder.graph_stores
53
- driver = builder.graph_stores["neo1"]
54
- assert isinstance(driver, VectorGraphStore)
55
-
56
-
57
- @pytest.mark.asyncio
58
- async def test_validate_neo4j(mock_conf):
59
- builder = DatabaseManager(mock_conf)
60
-
61
- mock_driver = MagicMock()
62
- mock_session = AsyncMock()
63
- mock_result = AsyncMock()
64
- mock_record = {"ok": 1}
65
-
66
- mock_driver.close = AsyncMock()
67
- mock_result.single.return_value = mock_record
68
- mock_session.run.return_value = mock_result
69
-
70
- mock_driver.session.return_value.__aenter__ = AsyncMock(return_value=mock_session)
71
- mock_driver.session.return_value.__aexit__ = AsyncMock(return_value=None)
72
-
73
- builder.neo4j_drivers = {"neo1": mock_driver}
74
-
75
- await builder._validate_neo4j_drivers()
76
- mock_session.run.assert_awaited_once_with("RETURN 1 AS ok")
77
-
78
-
79
- @pytest.mark.asyncio
80
- async def test_build_sqlite(mock_conf):
81
- builder = DatabaseManager(mock_conf)
82
- await builder._build_sql_engines()
83
-
84
- assert "sqlite1" in builder.sql_engines
85
- assert isinstance(builder.sql_engines["sqlite1"], AsyncEngine)
86
-
87
-
88
- @pytest.mark.asyncio
89
- async def test_build_and_validate_sqlite():
90
- conf = MagicMock(spec=DatabasesConf)
91
- conf.neo4j_confs = {}
92
- conf.nebula_graph_confs = {}
93
- conf.relational_db_confs = {
94
- "sqlite1": SqlAlchemyConf(
95
- dialect="sqlite",
96
- driver="aiosqlite",
97
- path=":memory:",
98
- )
99
- }
100
- builder = DatabaseManager(conf)
101
- await builder.build_all(validate=True)
102
- # If no exception is raised, validation passed
103
- assert "sqlite1" in builder.sql_engines
104
- await builder.close()
105
- assert "sqlite1" not in builder.sql_engines
106
-
107
-
108
- @pytest.mark.asyncio
109
- async def test_build_all_without_validation(mock_conf):
110
- builder = DatabaseManager(mock_conf)
111
- builder_any = cast(Any, builder)
112
- builder_any._build_neo4j = AsyncMock()
113
- builder_any._build_sql_engines = AsyncMock()
114
- builder_any._validate_neo4j_drivers = AsyncMock()
115
- builder_any._validate_sql_engines = AsyncMock()
116
-
117
- await builder.build_all(validate=False)
118
-
119
- assert "sqlite1" in builder.sql_engines
120
- assert "pg1" in builder.sql_engines
121
- assert "neo1" in builder.graph_stores