memmachine-server 0.3.8__tar.gz → 0.3.9__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 (349) hide show
  1. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/PKG-INFO +2 -2
  2. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/pyproject.toml +1 -1
  3. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_configuration.py +171 -0
  4. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +20 -0
  5. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +2 -2
  6. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/conftest.py +8 -2
  7. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_sqlalchemy_segment_store.py +22 -16
  8. memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_passthrough_segmenter.py +92 -0
  9. memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_episode_to_event.py +163 -0
  10. memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_event_backend_wiring.py +583 -0
  11. memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +315 -0
  12. memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_service_locator.py +88 -0
  13. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +1 -1
  14. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_configuration_wizard.py +87 -3
  15. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_mock.py +2 -0
  16. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_config_router.py +23 -0
  17. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_config_service.py +136 -0
  18. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_router.py +122 -4
  19. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/episodic_config.py +215 -8
  20. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +7 -5
  21. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +23 -0
  22. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_storage.py +13 -0
  23. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/__init__.py +12 -0
  24. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/resource_manager.py +26 -0
  25. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/episodic_memory.py +1 -1
  26. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/sqlalchemy_segment_store.py +1 -1
  27. memmachine_server-0.3.9/src/memmachine_server/episodic_memory/event_memory/segmenter/passthrough_segmenter.py +32 -0
  28. memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +17 -0
  29. memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +691 -0
  30. memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +234 -0
  31. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/configuration_wizard.py +146 -3
  32. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/main/memmachine.py +43 -12
  33. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/config_router.py +4 -0
  34. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/config_service.py +109 -20
  35. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/router.py +62 -14
  36. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/PKG-INFO +2 -2
  37. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/SOURCES.txt +5 -0
  38. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/requires.txt +1 -1
  39. memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -832
  40. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -8
  41. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -362
  42. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -27
  43. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/LICENSE +0 -0
  44. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/README.md +0 -0
  45. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/__init__.py +0 -0
  46. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/__init__.py +0 -0
  47. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/__init__.py +0 -0
  48. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/api/__init__.py +0 -0
  49. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/api/test_version.py +0 -0
  50. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
  51. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_database_conf.py +0 -0
  52. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
  53. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
  54. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
  55. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
  56. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
  57. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
  58. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
  59. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
  60. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
  61. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
  62. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
  63. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_embedder.py +0 -0
  64. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +0 -0
  65. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
  66. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
  67. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
  68. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
  69. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
  70. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
  71. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
  72. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
  73. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
  74. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +0 -0
  75. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
  76. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/__init__.py +0 -0
  77. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/test_payload_codec.py +0 -0
  78. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/test_payload_codec_config.py +0 -0
  79. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
  80. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
  81. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
  82. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
  83. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
  84. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
  85. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
  86. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
  87. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
  88. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
  89. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -0
  90. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
  91. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
  92. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
  93. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
  94. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
  95. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
  96. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_properties_json.py +0 -0
  97. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
  98. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_utils.py +0 -0
  99. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  100. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
  101. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
  102. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/__init__.py +0 -0
  103. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/in_memory_vector_store_collection.py +0 -0
  104. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_qdrant_vector_store.py +0 -0
  105. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_sqlite_vec_vector_store.py +0 -0
  106. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_sqlite_vector_store.py +0 -0
  107. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/__init__.py +0 -0
  108. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_hnswlib_engine.py +0 -0
  109. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_usearch_engine.py +0 -0
  110. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/conftest.py +0 -0
  111. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
  112. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
  113. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  114. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
  115. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_string_from_episode_context.py +0 -0
  116. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/__init__.py +0 -0
  117. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
  118. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/test_text_deriver.py +0 -0
  119. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +0 -0
  120. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_data_types.py +0 -0
  121. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
  122. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_text_segmenter.py +0 -0
  123. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/test_data_types.py +0 -0
  124. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/test_event_memory.py +0 -0
  125. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
  126. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  127. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
  128. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
  129. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
  130. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/__init__.py +0 -0
  131. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
  132. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
  133. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/__init__.py +0 -0
  134. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/conftest.py +0 -0
  135. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memachine.py +0 -0
  136. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
  137. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
  138. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
  139. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
  140. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
  141. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  142. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/cluster_store/test_cluster_state_storage.py +0 -0
  143. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  144. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
  145. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
  146. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
  147. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
  148. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
  149. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  150. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  151. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
  152. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
  153. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
  154. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
  155. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
  156. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
  157. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
  158. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/test_text_sanitizer.py +0 -0
  159. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_cluster_manager.py +0 -0
  160. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_cluster_splitter.py +0 -0
  161. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
  162. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +0 -0
  163. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
  164. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
  165. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
  166. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
  167. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
  168. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
  169. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
  170. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/__init__.py +0 -0
  171. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
  172. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
  173. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
  174. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
  175. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
  176. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
  177. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/test_middleware.py +0 -0
  178. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
  179. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/setup.cfg +0 -0
  180. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/__init__.py +0 -0
  181. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/__init__.py +0 -0
  182. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/api/__init__.py +0 -0
  183. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/api/version.py +0 -0
  184. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/__init__.py +0 -0
  185. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/database_conf.py +0 -0
  186. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
  187. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
  188. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
  189. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
  190. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/log_conf.py +0 -0
  191. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
  192. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
  193. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
  194. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/data_types.py +0 -0
  195. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/__init__.py +0 -0
  196. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
  197. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/embedder.py +0 -0
  198. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/openai_embedder.py +0 -0
  199. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
  200. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/__init__.py +0 -0
  201. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
  202. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/errors.py +0 -0
  203. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/__init__.py +0 -0
  204. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/filter_parser.py +0 -0
  205. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
  206. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/__init__.py +0 -0
  207. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
  208. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/language_model.py +0 -0
  209. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +0 -0
  210. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
  211. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
  212. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
  213. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
  214. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
  215. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/neo4j_utils.py +0 -0
  216. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/__init__.py +0 -0
  217. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/payload_codec.py +0 -0
  218. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/payload_codec_config.py +0 -0
  219. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/plaintext_payload_codec.py +0 -0
  220. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/properties_json.py +0 -0
  221. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/__init__.py +0 -0
  222. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
  223. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
  224. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
  225. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
  226. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
  227. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
  228. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/reranker.py +0 -0
  229. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
  230. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
  231. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/database_manager.py +0 -0
  232. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
  233. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
  234. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
  235. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
  236. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/rw_locks.py +0 -0
  237. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/__init__.py +0 -0
  238. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
  239. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
  240. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/utils.py +0 -0
  241. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  242. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
  243. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
  244. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
  245. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
  246. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/__init__.py +0 -0
  247. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/data_types.py +0 -0
  248. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/qdrant_vector_store.py +0 -0
  249. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/sqlite_vec_vector_store.py +0 -0
  250. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/sqlite_vector_store.py +0 -0
  251. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/utils.py +0 -0
  252. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/__init__.py +0 -0
  253. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/hnswlib_engine.py +0 -0
  254. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/usearch_engine.py +0 -0
  255. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/vector_search_engine.py +0 -0
  256. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
  257. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/__init__.py +0 -0
  258. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  259. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
  260. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
  261. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
  262. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/__init__.py +0 -0
  263. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/data_types.py +0 -0
  264. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
  265. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/deriver.py +0 -0
  266. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/text_deriver.py +0 -0
  267. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/event_memory.py +0 -0
  268. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +0 -0
  269. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/data_types.py +0 -0
  270. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/segment_store.py +0 -0
  271. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
  272. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/segmenter.py +0 -0
  273. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/text_segmenter.py +0 -0
  274. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
  275. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
  276. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  277. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
  278. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
  279. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/__init__.py +0 -0
  280. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/memmachine_configure.py +0 -0
  281. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/utilities.py +0 -0
  282. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/main/__init__.py +0 -0
  283. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
  284. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
  285. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
  286. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
  287. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
  288. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
  289. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
  290. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
  291. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
  292. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/__init__.py +0 -0
  293. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_manager.py +0 -0
  294. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_splitter.py +0 -0
  295. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  296. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/cluster_store.py +0 -0
  297. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/cluster_store_sqlalchemy.py +0 -0
  298. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/in_memory_cluster_store.py +0 -0
  299. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  300. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
  301. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
  302. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
  303. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_ingestion.py +0 -0
  304. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
  305. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
  306. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
  307. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
  308. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  309. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  310. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
  311. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
  312. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
  313. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
  314. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
  315. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
  316. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
  317. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
  318. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
  319. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
  320. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/c7a2f8e31b90_add_ingested_composite_index.py +0 -0
  321. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
  322. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
  323. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
  324. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
  325. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/text_sanitizer.py +0 -0
  326. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
  327. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
  328. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/__init__.py +0 -0
  329. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/__init__.py +0 -0
  330. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
  331. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/mcp.py +0 -0
  332. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/service.py +0 -0
  333. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/app.py +0 -0
  334. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/diagnostics.py +0 -0
  335. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/mcp_http.py +0 -0
  336. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/mcp_stdio.py +0 -0
  337. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/middleware.py +0 -0
  338. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/__init__.py +0 -0
  339. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
  340. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
  341. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
  342. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
  343. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
  344. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
  345. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
  346. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
  347. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
  348. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/entry_points.txt +0 -0
  349. {memmachine_server-0.3.8 → memmachine_server-0.3.9}/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.8
3
+ Version: 0.3.9
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
@@ -31,7 +31,7 @@ Requires-Dist: langchain-aws>=0.2.33
31
31
  Requires-Dist: neo4j>=5.28.2
32
32
  Requires-Dist: nltk>=3.9.4
33
33
  Requires-Dist: openai>=2.21.0
34
- Requires-Dist: pgvector>=0.4.1
34
+ Requires-Dist: pgvector>=0.4.2
35
35
  Requires-Dist: prometheus-client>=0.22.1
36
36
  Requires-Dist: pydantic>=2.11.7
37
37
  Requires-Dist: pyyaml>=6.0.2
@@ -22,7 +22,7 @@ dependencies = [
22
22
  "neo4j>=5.28.2",
23
23
  "nltk>=3.9.4",
24
24
  "openai>=2.21.0",
25
- "pgvector>=0.4.1",
25
+ "pgvector>=0.4.2",
26
26
  "prometheus-client>=0.22.1",
27
27
  "pydantic>=2.11.7",
28
28
  "pyyaml>=6.0.2",
@@ -10,8 +10,13 @@ from memmachine_server.common.configuration import (
10
10
  EpisodicMemoryConfPartial,
11
11
  )
12
12
  from memmachine_server.common.configuration.episodic_config import (
13
+ DeclarativeLongTermMemoryConf,
14
+ EpisodicMemoryConf,
15
+ EventLongTermMemoryConf,
13
16
  LongTermMemoryConfPartial,
17
+ PassthroughSegmenterConf,
14
18
  ShortTermMemoryConfPartial,
19
+ WholeTextDeriverConf,
15
20
  )
16
21
  from memmachine_server.common.configuration.log_conf import LogLevel
17
22
 
@@ -34,6 +39,7 @@ def test_update_long_term_memory_conf(long_term_memory_conf: LongTermMemoryConfP
34
39
  )
35
40
 
36
41
  updated = specific.merge(long_term_memory_conf)
42
+ assert isinstance(updated, DeclarativeLongTermMemoryConf)
37
43
  assert updated.session_id == "session_123"
38
44
  assert updated.embedder == "embedder_v2"
39
45
  assert updated.reranker == "reranker_v1"
@@ -219,3 +225,168 @@ def test_save_raises_error_when_no_path():
219
225
 
220
226
  with pytest.raises(ValueError, match="No path provided"):
221
227
  conf_no_path.save()
228
+
229
+
230
+ # --- Backwards-compat: long-term-memory backend discriminator ---
231
+
232
+
233
+ def _ltm_minimal_short_term_block() -> dict:
234
+ return {
235
+ "session_key": "s",
236
+ "llm_model": "m",
237
+ "summary_prompt_system": "x",
238
+ "summary_prompt_user": "y",
239
+ }
240
+
241
+
242
+ def test_old_param_data_without_backend_loads_as_declarative():
243
+ """Old persisted session param_data (no `backend`) round-trips as declarative.
244
+
245
+ Reproduces the historical session_data_manager_sql_impl.py:306 path:
246
+ `EpisodicMemoryConf(**session.param_data)` for a row written before the
247
+ backend discriminator existed.
248
+ """
249
+ old_param_data = {
250
+ "session_key": "old_session",
251
+ "long_term_memory": {
252
+ "session_id": "old_session",
253
+ "embedder": "openai_embedder",
254
+ "reranker": "my_reranker_id",
255
+ "vector_graph_store": "my_storage_id",
256
+ },
257
+ "short_term_memory": _ltm_minimal_short_term_block(),
258
+ "long_term_memory_enabled": True,
259
+ "short_term_memory_enabled": True,
260
+ "enabled": True,
261
+ }
262
+
263
+ conf = EpisodicMemoryConf.model_validate(old_param_data)
264
+ assert isinstance(conf.long_term_memory, DeclarativeLongTermMemoryConf)
265
+ assert conf.long_term_memory.backend == "declarative"
266
+ assert conf.long_term_memory.embedder == "openai_embedder"
267
+ assert conf.long_term_memory.vector_graph_store == "my_storage_id"
268
+
269
+
270
+ def test_episodic_memory_conf_with_explicit_event_backend_loads_as_event():
271
+ data = {
272
+ "session_key": "s",
273
+ "long_term_memory": {
274
+ "backend": "event",
275
+ "session_id": "s",
276
+ "vector_store": "vstore",
277
+ "segment_store": "pg_engine",
278
+ "embedder": "openai_embedder",
279
+ },
280
+ "short_term_memory": _ltm_minimal_short_term_block(),
281
+ }
282
+
283
+ conf = EpisodicMemoryConf.model_validate(data)
284
+ assert isinstance(conf.long_term_memory, EventLongTermMemoryConf)
285
+ assert conf.long_term_memory.vector_store == "vstore"
286
+ assert conf.long_term_memory.segment_store == "pg_engine"
287
+ # Default sub-configs.
288
+ assert isinstance(conf.long_term_memory.segmenter, PassthroughSegmenterConf)
289
+ assert isinstance(conf.long_term_memory.deriver, WholeTextDeriverConf)
290
+ # Reranker is optional on the event backend.
291
+ assert conf.long_term_memory.reranker is None
292
+
293
+
294
+ def test_episodic_memory_conf_with_explicit_declarative_backend_loads_as_declarative():
295
+ data = {
296
+ "session_key": "s",
297
+ "long_term_memory": {
298
+ "backend": "declarative",
299
+ "session_id": "s",
300
+ "vector_graph_store": "g",
301
+ "embedder": "e",
302
+ "reranker": "r",
303
+ },
304
+ "short_term_memory": _ltm_minimal_short_term_block(),
305
+ }
306
+
307
+ conf = EpisodicMemoryConf.model_validate(data)
308
+ assert isinstance(conf.long_term_memory, DeclarativeLongTermMemoryConf)
309
+ assert conf.long_term_memory.vector_graph_store == "g"
310
+
311
+
312
+ def test_partial_merge_with_no_backend_resolves_to_declarative():
313
+ """LongTermMemoryConfPartial.merge() defaults missing backend to declarative."""
314
+ base = LongTermMemoryConfPartial(
315
+ session_id="s",
316
+ embedder="e",
317
+ reranker="r",
318
+ vector_graph_store="g",
319
+ )
320
+ override = LongTermMemoryConfPartial(embedder="e2")
321
+
322
+ merged = override.merge(base)
323
+ assert isinstance(merged, DeclarativeLongTermMemoryConf)
324
+ assert merged.embedder == "e2"
325
+ assert merged.reranker == "r"
326
+ assert merged.vector_graph_store == "g"
327
+
328
+
329
+ def test_partial_merge_with_event_backend_resolves_to_event():
330
+ base = LongTermMemoryConfPartial(
331
+ backend="event",
332
+ session_id="s",
333
+ embedder="e",
334
+ vector_store="v",
335
+ segment_store="seg",
336
+ )
337
+ override = LongTermMemoryConfPartial()
338
+
339
+ merged = override.merge(base)
340
+ assert isinstance(merged, EventLongTermMemoryConf)
341
+ assert merged.vector_store == "v"
342
+ assert merged.segment_store == "seg"
343
+ assert merged.embedder == "e"
344
+ assert merged.reranker is None
345
+
346
+
347
+ def test_partial_merge_explicit_declarative_backend():
348
+ base = LongTermMemoryConfPartial(
349
+ backend="declarative",
350
+ session_id="s",
351
+ embedder="e",
352
+ reranker="r",
353
+ vector_graph_store="g",
354
+ )
355
+ merged = LongTermMemoryConfPartial().merge(base)
356
+ assert isinstance(merged, DeclarativeLongTermMemoryConf)
357
+
358
+
359
+ def test_partial_merge_primary_backend_wins_over_fallback():
360
+ """Primary backend takes precedence over fallback."""
361
+ primary = LongTermMemoryConfPartial(
362
+ backend="event",
363
+ session_id="s",
364
+ embedder="e",
365
+ vector_store="v",
366
+ segment_store="seg",
367
+ )
368
+ fallback = LongTermMemoryConfPartial(
369
+ backend="declarative",
370
+ session_id="s",
371
+ embedder="e",
372
+ reranker="r",
373
+ vector_graph_store="g",
374
+ )
375
+ merged = primary.merge(fallback)
376
+ assert isinstance(merged, EventLongTermMemoryConf)
377
+
378
+
379
+ def test_existing_sample_yaml_loads_as_declarative_via_full_configuration():
380
+ """Existing sample YAMLs (no `backend` field) load through Configuration."""
381
+ config_path = find_config_file("episodic_memory_config.cpu.sample")
382
+ conf = Configuration.load_yml_file(str(config_path))
383
+ assert conf.episodic_memory.long_term_memory is not None
384
+ # Configuration.episodic_memory is the partial; backend stays None on load.
385
+ assert conf.episodic_memory.long_term_memory.backend is None
386
+ # ...and merging the LTM partial alone resolves to declarative.
387
+ ltm_merged = LongTermMemoryConfPartial(session_id="test_session").merge(
388
+ conf.episodic_memory.long_term_memory
389
+ )
390
+ assert isinstance(ltm_merged, DeclarativeLongTermMemoryConf)
391
+ assert ltm_merged.embedder == "openai_embedder"
392
+ assert ltm_merged.vector_graph_store == "my_storage_id"
@@ -105,6 +105,26 @@ async def test_add_and_get_history(episode_storage: EpisodeStorage):
105
105
  assert history.episode_type == EpisodeType.MESSAGE
106
106
 
107
107
 
108
+ @pytest.mark.asyncio
109
+ async def test_get_episodes_batch(episode_storage: EpisodeStorage):
110
+ first = await create_history_entry(episode_storage, content="first")
111
+ second = await create_history_entry(episode_storage, content="second")
112
+ third = await create_history_entry(episode_storage, content="third")
113
+
114
+ try:
115
+ # All present; duplicates are deduped; missing IDs are absent.
116
+ fetched = await episode_storage.get_episodes([first, third, first, "999999999"])
117
+ by_uid = {ep.uid: ep for ep in fetched}
118
+ assert set(by_uid.keys()) == {first, third}
119
+ assert by_uid[first].content == "first"
120
+ assert by_uid[third].content == "third"
121
+
122
+ # Empty input returns empty list without hitting the DB.
123
+ assert await episode_storage.get_episodes([]) == []
124
+ finally:
125
+ await episode_storage.delete_episodes([first, second, third])
126
+
127
+
108
128
  @pytest.mark.asyncio
109
129
  async def test_add_multiple_episodes_returns_models(
110
130
  episode_storage: EpisodeStorage,
@@ -6,8 +6,8 @@ from pydantic import JsonValue
6
6
  from sqlalchemy.ext.asyncio import AsyncEngine
7
7
 
8
8
  from memmachine_server.common.configuration.episodic_config import (
9
+ DeclarativeLongTermMemoryConf,
9
10
  EpisodicMemoryConf,
10
- LongTermMemoryConf,
11
11
  ShortTermMemoryConf,
12
12
  )
13
13
  from memmachine_server.common.errors import (
@@ -61,7 +61,7 @@ def episodic_memory_conf():
61
61
  """Fixture for a dummy EpisodicMemoryConf object."""
62
62
  return EpisodicMemoryConf(
63
63
  session_key="test_session",
64
- long_term_memory=LongTermMemoryConf(
64
+ long_term_memory=DeclarativeLongTermMemoryConf(
65
65
  session_id="test_session",
66
66
  vector_graph_store="test_store",
67
67
  embedder="test_embedder",
@@ -116,11 +116,17 @@ class InMemorySegmentStorePartition(SegmentStorePartition):
116
116
 
117
117
  @staticmethod
118
118
  def _normalize_segment_field(field: str) -> str:
119
- """Translate canonical filter field names to raw segment property keys."""
119
+ """Translate canonical filter field names to raw segment property keys.
120
+
121
+ Mirrors SQLAlchemySegmentStorePartition._resolve_segment_field:
122
+ - `m.<key>` / `metadata.<key>` → user metadata, bare key.
123
+ - any other bare name → system field, `_<field>` (matches the
124
+ LongTermMemory event-backend property layout).
125
+ """
120
126
  internal_name, is_user_metadata = normalize_filter_field(field)
121
127
  if is_user_metadata:
122
128
  return demangle_user_metadata_key(internal_name)
123
- return field
129
+ return f"_{field}"
124
130
 
125
131
  @override
126
132
  async def get_segment_uuids_by_event_uuids(
@@ -399,7 +399,13 @@ async def test_contexts_property_filter(
399
399
  async def test_contexts_filter_by_context_producer(
400
400
  partition: SQLAlchemySegmentStorePartition,
401
401
  ) -> None:
402
- """Filter using ``context.producer`` is not supported."""
402
+ """`context.producer` is not a stored property; the filter just matches nothing.
403
+
404
+ Bare names that aren't `timestamp` are looked up as `_<name>` in the JSON
405
+ properties (matching EventMemory's `_to_vector_record_property` convention
406
+ for system fields). `context.producer` becomes `_context.producer`, which
407
+ isn't a stored key on any segment, so the filter returns no contexts.
408
+ """
403
409
  ep = uuid4()
404
410
  s0 = _seg(
405
411
  event_uuid=ep,
@@ -422,20 +428,20 @@ async def test_contexts_filter_by_context_producer(
422
428
  await partition.add_segments(_links(s0, s1, s2))
423
429
 
424
430
  filt = Comparison(field="context.producer", op="=", value="Alice")
425
- with pytest.raises(ValueError, match="Unknown filter field"):
426
- await partition.get_segment_contexts(
427
- [s0.uuid],
428
- max_backward_segments=5,
429
- max_forward_segments=5,
430
- property_filter=filt,
431
- )
431
+ contexts = await partition.get_segment_contexts(
432
+ [s0.uuid],
433
+ max_backward_segments=5,
434
+ max_forward_segments=5,
435
+ property_filter=filt,
436
+ )
437
+ assert contexts == {}
432
438
 
433
439
 
434
440
  @pytest.mark.asyncio
435
441
  async def test_contexts_filter_by_context_type(
436
442
  partition: SQLAlchemySegmentStorePartition,
437
443
  ) -> None:
438
- """Filter using ``context.context_type`` is not supported."""
444
+ """`context.context_type` is not a stored property; filter matches nothing."""
439
445
  ep = uuid4()
440
446
  s0 = _seg(
441
447
  event_uuid=ep,
@@ -458,13 +464,13 @@ async def test_contexts_filter_by_context_type(
458
464
  await partition.add_segments(_links(s0, s1, s2))
459
465
 
460
466
  filt = Comparison(field="context.context_type", op="=", value="producer")
461
- with pytest.raises(ValueError, match="Unknown filter field"):
462
- await partition.get_segment_contexts(
463
- [s0.uuid],
464
- max_backward_segments=5,
465
- max_forward_segments=5,
466
- property_filter=filt,
467
- )
467
+ contexts = await partition.get_segment_contexts(
468
+ [s0.uuid],
469
+ max_backward_segments=5,
470
+ max_forward_segments=5,
471
+ property_filter=filt,
472
+ )
473
+ assert contexts == {}
468
474
 
469
475
 
470
476
  @pytest.mark.asyncio
@@ -0,0 +1,92 @@
1
+ """Tests for PassthroughSegmenter."""
2
+
3
+ from datetime import UTC, datetime
4
+ from uuid import uuid4
5
+
6
+ import pytest
7
+
8
+ from memmachine_server.episodic_memory.event_memory.data_types import (
9
+ Event,
10
+ NullContext,
11
+ ProducerContext,
12
+ TextBlock,
13
+ )
14
+ from memmachine_server.episodic_memory.event_memory.segmenter.passthrough_segmenter import (
15
+ PassthroughSegmenter,
16
+ )
17
+
18
+ pytestmark = pytest.mark.asyncio
19
+
20
+ _TS = datetime(2026, 1, 15, 10, 30, tzinfo=UTC)
21
+
22
+
23
+ async def test_passthrough_emits_one_segment_per_block():
24
+ event = Event(
25
+ uuid=uuid4(),
26
+ timestamp=_TS,
27
+ context=ProducerContext(producer="alice"),
28
+ blocks=[
29
+ TextBlock(text="first block"),
30
+ TextBlock(text="second block"),
31
+ TextBlock(text="third block"),
32
+ ],
33
+ properties={"my_field": "value"},
34
+ )
35
+ segmenter = PassthroughSegmenter()
36
+
37
+ segments = await segmenter.segment(event)
38
+
39
+ assert len(segments) == 3
40
+ for index, segment in enumerate(segments):
41
+ assert segment.event_uuid == event.uuid
42
+ assert segment.index == index
43
+ assert segment.offset == 0
44
+ assert segment.timestamp == event.timestamp
45
+ assert segment.context == event.context
46
+ assert segment.properties == event.properties
47
+ assert segment.block.text == event.blocks[index].text
48
+
49
+
50
+ async def test_passthrough_does_not_split_long_text():
51
+ """Each block is preserved verbatim, regardless of length."""
52
+ long_text = "lorem ipsum " * 1000
53
+ event = Event(
54
+ uuid=uuid4(),
55
+ timestamp=_TS,
56
+ context=NullContext(),
57
+ blocks=[TextBlock(text=long_text)],
58
+ )
59
+ segmenter = PassthroughSegmenter()
60
+
61
+ segments = await segmenter.segment(event)
62
+
63
+ assert len(segments) == 1
64
+ assert segments[0].block.text == long_text
65
+
66
+
67
+ async def test_passthrough_empty_blocks_yields_no_segments():
68
+ event = Event(
69
+ uuid=uuid4(),
70
+ timestamp=_TS,
71
+ context=NullContext(),
72
+ blocks=[],
73
+ )
74
+ segmenter = PassthroughSegmenter()
75
+
76
+ segments = await segmenter.segment(event)
77
+
78
+ assert segments == []
79
+
80
+
81
+ async def test_passthrough_each_segment_has_unique_uuid():
82
+ event = Event(
83
+ uuid=uuid4(),
84
+ timestamp=_TS,
85
+ context=NullContext(),
86
+ blocks=[TextBlock(text="a"), TextBlock(text="b")],
87
+ )
88
+ segmenter = PassthroughSegmenter()
89
+
90
+ segments = await segmenter.segment(event)
91
+
92
+ assert len({s.uuid for s in segments}) == len(segments)
@@ -0,0 +1,163 @@
1
+ """Unit tests for the Episode → Event translation in LongTermMemory."""
2
+
3
+ from datetime import UTC, datetime
4
+ from uuid import uuid5
5
+
6
+ import pytest
7
+
8
+ from memmachine_server.common.episode_store import (
9
+ ContentType,
10
+ Episode,
11
+ EpisodeType,
12
+ )
13
+ from memmachine_server.episodic_memory.event_memory.data_types import (
14
+ NullContext,
15
+ ProducerContext,
16
+ TextBlock,
17
+ )
18
+ from memmachine_server.episodic_memory.long_term_memory.long_term_memory import (
19
+ _EVENT_UUID_NAMESPACE,
20
+ LongTermMemory,
21
+ )
22
+
23
+
24
+ def _episode(
25
+ *,
26
+ uid: str = "ep1",
27
+ content: str = "hello",
28
+ producer_id: str = "alice",
29
+ producer_role: str = "user",
30
+ produced_for_id: str | None = None,
31
+ sequence_num: int = 0,
32
+ episode_type: EpisodeType = EpisodeType.MESSAGE,
33
+ filterable_metadata: dict | None = None,
34
+ metadata: dict | None = None,
35
+ session_key: str = "session-1",
36
+ ) -> Episode:
37
+ return Episode(
38
+ uid=uid,
39
+ content=content,
40
+ session_key=session_key,
41
+ created_at=datetime(2026, 1, 15, 12, 0, tzinfo=UTC),
42
+ producer_id=producer_id,
43
+ producer_role=producer_role,
44
+ produced_for_id=produced_for_id,
45
+ sequence_num=sequence_num,
46
+ episode_type=episode_type,
47
+ content_type=ContentType.STRING,
48
+ filterable_metadata=filterable_metadata,
49
+ metadata=metadata,
50
+ )
51
+
52
+
53
+ def test_event_uuid_is_deterministic_uuid5_of_episode_uid():
54
+ episode = _episode(uid="abc-123")
55
+ event = LongTermMemory._episode_to_event(episode)
56
+ assert event.uuid == uuid5(_EVENT_UUID_NAMESPACE, "abc-123")
57
+ # Stable across calls.
58
+ assert LongTermMemory._episode_to_event(episode).uuid == event.uuid
59
+
60
+
61
+ def test_message_episode_uses_producer_context():
62
+ episode = _episode(producer_id="alice", episode_type=EpisodeType.MESSAGE)
63
+ event = LongTermMemory._episode_to_event(episode)
64
+ assert isinstance(event.context, ProducerContext)
65
+ assert event.context.producer == "alice"
66
+
67
+
68
+ def test_non_message_episode_uses_null_context():
69
+ # Use any non-MESSAGE EpisodeType. The enum is defined in
70
+ # memmachine_common.api; pick the first non-MESSAGE entry dynamically so
71
+ # this test doesn't break when the enum gains members.
72
+ non_message = next(
73
+ (t for t in EpisodeType if t is not EpisodeType.MESSAGE),
74
+ None,
75
+ )
76
+ if non_message is None:
77
+ # Only MESSAGE exists today; this branch will start exercising once
78
+ # additional Episode types are introduced. Skip rather than assert
79
+ # invariant we can't yet exercise.
80
+ pytest.skip("Only MESSAGE EpisodeType exists; nothing else to verify yet")
81
+ episode = _episode(episode_type=non_message)
82
+ event = LongTermMemory._episode_to_event(episode)
83
+ assert isinstance(event.context, NullContext)
84
+
85
+
86
+ def test_event_has_single_text_block_with_episode_content():
87
+ episode = _episode(content="hello world")
88
+ event = LongTermMemory._episode_to_event(episode)
89
+ assert len(event.blocks) == 1
90
+ assert isinstance(event.blocks[0], TextBlock)
91
+ assert event.blocks[0].text == "hello world"
92
+
93
+
94
+ def test_system_fields_are_underscore_prefixed():
95
+ episode = _episode(
96
+ uid="ep-1",
97
+ producer_id="alice",
98
+ producer_role="user",
99
+ produced_for_id="bob",
100
+ sequence_num=42,
101
+ session_key="sess-X",
102
+ )
103
+ event = LongTermMemory._episode_to_event(episode)
104
+ p = event.properties
105
+ assert p["_episode_uid"] == "ep-1"
106
+ assert p["_session_key"] == "sess-X"
107
+ assert p["_producer_id"] == "alice"
108
+ assert p["_producer_role"] == "user"
109
+ assert p["_produced_for_id"] == "bob"
110
+ assert p["_sequence_num"] == 42
111
+ assert p["_episode_type"] == "message"
112
+ assert p["_content_type"] == "string"
113
+ assert p["_created_at"] == episode.created_at
114
+
115
+
116
+ def test_produced_for_id_omitted_when_none():
117
+ episode = _episode(produced_for_id=None)
118
+ event = LongTermMemory._episode_to_event(episode)
119
+ assert "_produced_for_id" not in event.properties
120
+
121
+
122
+ def test_user_filterable_metadata_keys_are_bare():
123
+ episode = _episode(
124
+ filterable_metadata={"my_field": "value", "count": 7},
125
+ )
126
+ event = LongTermMemory._episode_to_event(episode)
127
+ p = event.properties
128
+ # User-defined keys land bare (no `_` prefix), so the v2 client filter API
129
+ # `m.my_field` resolves to vector-record property `my_field`.
130
+ assert p["my_field"] == "value"
131
+ assert p["count"] == 7
132
+
133
+
134
+ def test_episode_to_event_rejects_underscore_prefixed_user_keys():
135
+ """Reserved `_`-prefixed user keys must be rejected at the event-backend
136
+ translation layer. Without this check a client could send
137
+ {"_producer_id": "victim", "_session_key": "other-session"} via
138
+ filterable_metadata, get its content indexed under those spoofed
139
+ identities, and impersonate the victim through search_scored's
140
+ property_filter API. We raise loudly so callers see the misuse instead
141
+ of silently dropping. (Event-backend only — the declarative backend
142
+ mangles user keys with a `metadata.` prefix and is unaffected.)
143
+ """
144
+ episode = _episode(
145
+ filterable_metadata={
146
+ "safe_key": "ok",
147
+ "_producer_id": "victim",
148
+ "_session_key": "other-session",
149
+ "_episode_uid": "spoofed-uid",
150
+ }
151
+ )
152
+ with pytest.raises(ValueError, match=r"reserved.*`_`-prefixed"):
153
+ LongTermMemory._episode_to_event(episode)
154
+
155
+
156
+ def test_episode_to_event_allows_metadata_dot_prefixed_keys():
157
+ """The declarative backend mangles user keys with a `metadata.` prefix.
158
+ On the event backend, a literal `metadata.foo` key is just a regular
159
+ user property and must not be rejected.
160
+ """
161
+ episode = _episode(filterable_metadata={"metadata.foo": "bar"})
162
+ event = LongTermMemory._episode_to_event(episode)
163
+ assert event.properties["metadata.foo"] == "bar"