hy-memory 2.0.5.dev1__tar.gz → 2.0.5.dev3__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 (141) hide show
  1. {hy_memory-2.0.5.dev1/hy_memory.egg-info → hy_memory-2.0.5.dev3}/PKG-INFO +1 -1
  2. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/client.py +272 -2
  3. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3/hy_memory.egg-info}/PKG-INFO +1 -1
  4. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/pyproject.toml +1 -1
  5. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/LICENSE +0 -0
  6. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/MANIFEST.in +0 -0
  7. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/README.md +0 -0
  8. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/__init__.py +0 -0
  9. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/__init__.py +0 -0
  10. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/abstractor.py +0 -0
  11. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/emotion_analyzer.py +0 -0
  12. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/episode_summary.py +0 -0
  13. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/extractor.py +0 -0
  14. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/intention_detector.py +0 -0
  15. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/llm_provider.py +0 -0
  16. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/mem_agent.py +0 -0
  17. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/prompts_zh.py +0 -0
  18. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/reconciler.py +0 -0
  19. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/reflector.py +0 -0
  20. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/__init__.py +0 -0
  21. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/base.py +0 -0
  22. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/agent/tools/basic_profile.py +0 -0
  23. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/__init__.py +0 -0
  24. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/chain_store.py +0 -0
  25. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/extractor.py +0 -0
  26. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/fact_reconciler.py +0 -0
  27. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/judge.py +0 -0
  28. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/lexical.py +0 -0
  29. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/preproc.py +0 -0
  30. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/prompts_zh.py +0 -0
  31. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/reconciler.py +0 -0
  32. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/store.py +0 -0
  33. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/types.py +0 -0
  34. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/coding/writer.py +0 -0
  35. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/config.py +0 -0
  36. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/__init__.py +0 -0
  37. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/embed_service.py +0 -0
  38. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/merger.py +0 -0
  39. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/scorer.py +0 -0
  40. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/core/workload.py +0 -0
  41. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/__init__.py +0 -0
  42. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache.py +0 -0
  43. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_base.py +0 -0
  44. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_mysql.py +0 -0
  45. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/cache_sqlite.py +0 -0
  46. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store.py +0 -0
  47. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_base.py +0 -0
  48. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_kuzu.py +0 -0
  49. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/graph_store_neo4j.py +0 -0
  50. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/history_store.py +0 -0
  51. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/kv_store.py +0 -0
  52. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/rdb.py +0 -0
  53. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store.py +0 -0
  54. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_base.py +0 -0
  55. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_chroma.py +0 -0
  56. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_faiss.py +0 -0
  57. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/data/vector_store_qdrant.py +0 -0
  58. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/inspector.py +0 -0
  59. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/metrics.py +0 -0
  60. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/__init__.py +0 -0
  61. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/memory.py +0 -0
  62. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/models/requests.py +0 -0
  63. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/__init__.py +0 -0
  64. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/__init__.py +0 -0
  65. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/projector.py +0 -0
  66. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/rerank.py +0 -0
  67. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_graph/topic_summary.py +0 -0
  68. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/__init__.py +0 -0
  69. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/bm25.py +0 -0
  70. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/bm25_fastembed.py +0 -0
  71. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/candidate_guards.py +0 -0
  72. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/config.py +0 -0
  73. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/date_view.py +0 -0
  74. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/dedup.py +0 -0
  75. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/diversity.py +0 -0
  76. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/entities.py +0 -0
  77. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/entity_store.py +0 -0
  78. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/evolution.py +0 -0
  79. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/hierarchy_bundle.py +0 -0
  80. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/intent.py +0 -0
  81. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/intention.py +0 -0
  82. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/lemmatize.py +0 -0
  83. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/local_rerank.py +0 -0
  84. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/memory_format.py +0 -0
  85. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/multi_seed_bundle.py +0 -0
  86. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/ner.py +0 -0
  87. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_evidence.py +0 -0
  88. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/profile_owner_gate.py +0 -0
  89. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/query_expand.py +0 -0
  90. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/reconcile_retrieval.py +0 -0
  91. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/record_date_view.py +0 -0
  92. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/retrieval_clauses.py +0 -0
  93. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/rrf.py +0 -0
  94. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/scoring.py +0 -0
  95. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/series_tail_guard.py +0 -0
  96. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/session_episode.py +0 -0
  97. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/strength.py +0 -0
  98. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/supplemental_propositions.py +0 -0
  99. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/tag_index.py +0 -0
  100. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/temporal.py +0 -0
  101. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/topic_candidates.py +0 -0
  102. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/trace.py +0 -0
  103. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/underflow.py +0 -0
  104. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/_retrieval/user_level_l0.py +0 -0
  105. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/balanced_catalog.py +0 -0
  106. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/base.py +0 -0
  107. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/cross_domain_sweeper.py +0 -0
  108. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader.py +0 -0
  109. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_base.py +0 -0
  110. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_hybrid.py +0 -0
  111. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/reader_legacy.py +0 -0
  112. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/registry.py +0 -0
  113. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/specific_supplement.py +0 -0
  114. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_agent.py +0 -0
  115. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_tools.py +0 -0
  116. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/system2_writer.py +0 -0
  117. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/user_profile_scope.py +0 -0
  118. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/pipelines/writer.py +0 -0
  119. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/runtime.py +0 -0
  120. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/server.py +0 -0
  121. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/snapshot.py +0 -0
  122. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/structure.py +0 -0
  123. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/async_executor.py +0 -0
  124. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/clone_references.py +0 -0
  125. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/keyword_ties.py +0 -0
  126. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/lang_detect.py +0 -0
  127. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/log_setup.py +0 -0
  128. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/metrics.py +0 -0
  129. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/model_call_context.py +0 -0
  130. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/pipeline_log_writer.py +0 -0
  131. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/pipeline_observability.py +0 -0
  132. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/source_filter.py +0 -0
  133. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/time_window.py +0 -0
  134. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/token_count.py +0 -0
  135. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/trace_file_writer.py +0 -0
  136. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory/utils/tracer.py +0 -0
  137. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/SOURCES.txt +0 -0
  138. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/dependency_links.txt +0 -0
  139. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/requires.txt +0 -0
  140. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/hy_memory.egg-info/top_level.txt +0 -0
  141. {hy_memory-2.0.5.dev1 → hy_memory-2.0.5.dev3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hy-memory
3
- Version: 2.0.5.dev1
3
+ Version: 2.0.5.dev3
4
4
  Summary: HY Memory - Industrial-grade dual-system cognitive memory framework
5
5
  Author: alvinfei
6
6
  License-Expression: Apache-2.0
@@ -2936,6 +2936,49 @@ class HyMemoryClient:
2936
2936
  include_runtime_diag=True,
2937
2937
  )
2938
2938
 
2939
+ def import_memory_exact(
2940
+ self,
2941
+ content: str,
2942
+ *,
2943
+ memory_id: str,
2944
+ user_id: str,
2945
+ agent_id: str = "default_agent",
2946
+ session_id: str = "default_session",
2947
+ source: str = "default",
2948
+ layer: Any = "l2_fact",
2949
+ status: Any = "active",
2950
+ owner: Optional[str] = None,
2951
+ tags: Optional[List[str]] = None,
2952
+ supersedes: Optional[List[str]] = None,
2953
+ superseded_by: Optional[List[str]] = None,
2954
+ is_latest: bool = True,
2955
+ memory_at: Optional[datetime] = None,
2956
+ metadata: Optional[Dict[str, Any]] = None,
2957
+ request_id: Optional[str] = None,
2958
+ ) -> Dict[str, Any]:
2959
+ """Import one existing semantic memory without extraction/reconcile."""
2960
+ return self._loop_thread.run(
2961
+ self.async_import_memory_exact(
2962
+ content,
2963
+ memory_id=memory_id,
2964
+ user_id=user_id,
2965
+ agent_id=agent_id,
2966
+ session_id=session_id,
2967
+ source=source,
2968
+ layer=layer,
2969
+ status=status,
2970
+ owner=owner,
2971
+ tags=tags,
2972
+ supersedes=supersedes,
2973
+ superseded_by=superseded_by,
2974
+ is_latest=is_latest,
2975
+ memory_at=memory_at,
2976
+ metadata=metadata,
2977
+ request_id=request_id,
2978
+ ),
2979
+ include_runtime_diag=True,
2980
+ )
2981
+
2939
2982
  def get_raw(self, raw_id: str) -> Optional[Dict[str, Any]]:
2940
2983
  """Read one SDK raw record through the explicit raw API."""
2941
2984
  return self._loop_thread.run(self.async_get_raw(raw_id))
@@ -3223,6 +3266,157 @@ class HyMemoryClient:
3223
3266
  raise RuntimeError("raw import changed the requested identity")
3224
3267
  return {"success": True, "raw_id": node_id, "request_id": request_id}
3225
3268
 
3269
+ @_ensure_internal_loop
3270
+ async def async_import_memory_exact(
3271
+ self,
3272
+ content: str,
3273
+ *,
3274
+ memory_id: str,
3275
+ user_id: str,
3276
+ agent_id: str = "default_agent",
3277
+ session_id: str = "default_session",
3278
+ source: str = "default",
3279
+ layer: Any = "l2_fact",
3280
+ status: Any = "active",
3281
+ owner: Optional[str] = None,
3282
+ tags: Optional[List[str]] = None,
3283
+ supersedes: Optional[List[str]] = None,
3284
+ superseded_by: Optional[List[str]] = None,
3285
+ is_latest: bool = True,
3286
+ memory_at: Optional[datetime] = None,
3287
+ metadata: Optional[Dict[str, Any]] = None,
3288
+ request_id: Optional[str] = None,
3289
+ ) -> Dict[str, Any]:
3290
+ """Import a canonical memory node exactly, with no model invocation."""
3291
+ from .models.memory import MemoryLayer, MemoryStatus
3292
+ from .utils.source_filter import normalize_source
3293
+
3294
+ if not content or not memory_id or not user_id:
3295
+ raise ValueError("content, memory_id and user_id are required")
3296
+ normalized_layer = (
3297
+ layer if isinstance(layer, MemoryLayer) else MemoryLayer.from_string(str(layer))
3298
+ )
3299
+ if normalized_layer == MemoryLayer.L1_RAW:
3300
+ raise ValueError("use import_raw for L1_RAW")
3301
+ normalized_status = (
3302
+ status if isinstance(status, MemoryStatus) else MemoryStatus(str(status).lower())
3303
+ )
3304
+ request_id = request_id or str(uuid.uuid4())
3305
+ replay = await self._claim_write_outcome(
3306
+ request_id=request_id,
3307
+ user_id=user_id,
3308
+ agent_id=agent_id,
3309
+ session_id=session_id,
3310
+ operation="import_memory_exact",
3311
+ )
3312
+ if replay is not None:
3313
+ return replay
3314
+ try:
3315
+ result = await self._async_import_memory_exact_impl(
3316
+ content,
3317
+ memory_id=memory_id,
3318
+ user_id=user_id,
3319
+ agent_id=agent_id,
3320
+ session_id=session_id,
3321
+ source=normalize_source(source),
3322
+ layer=normalized_layer,
3323
+ status=normalized_status,
3324
+ owner=owner,
3325
+ tags=tags or [],
3326
+ supersedes=supersedes or [],
3327
+ superseded_by=superseded_by or [],
3328
+ is_latest=is_latest,
3329
+ memory_at=memory_at,
3330
+ metadata=metadata,
3331
+ request_id=request_id,
3332
+ )
3333
+ except BaseException:
3334
+ await self._mark_write_outcome_unknown(request_id)
3335
+ raise
3336
+ await self._finish_write_outcome(request_id, "succeeded", result)
3337
+ return result
3338
+
3339
+ async def _async_import_memory_exact_impl(
3340
+ self,
3341
+ content: str,
3342
+ *,
3343
+ memory_id: str,
3344
+ user_id: str,
3345
+ agent_id: str,
3346
+ session_id: str,
3347
+ source: str,
3348
+ layer,
3349
+ status,
3350
+ owner: Optional[str],
3351
+ tags: List[str],
3352
+ supersedes: List[str],
3353
+ superseded_by: List[str],
3354
+ is_latest: bool,
3355
+ memory_at: Optional[datetime],
3356
+ metadata: Optional[Dict[str, Any]],
3357
+ request_id: str,
3358
+ ) -> Dict[str, Any]:
3359
+ from .models.memory import MemoryNode, SourceType
3360
+
3361
+ existing = await self._vector_store.get_by_id(memory_id)
3362
+ if existing is not None:
3363
+ identity = (
3364
+ existing.content == content,
3365
+ existing.user_id == user_id,
3366
+ existing.agent_id == agent_id,
3367
+ existing.session_id == session_id,
3368
+ existing.source == source,
3369
+ existing.layer == layer,
3370
+ existing.status == status,
3371
+ existing.owner == owner,
3372
+ list(existing.tags or []) == tags,
3373
+ list(existing.supersedes or []) == supersedes,
3374
+ list(existing.superseded_by or []) == superseded_by,
3375
+ existing.is_latest == is_latest,
3376
+ )
3377
+ if not all(identity):
3378
+ raise ValueError("memory_id is already bound to different memory content")
3379
+ return {
3380
+ "success": True,
3381
+ "memory_id": memory_id,
3382
+ "memory_ids": [memory_id],
3383
+ "request_id": request_id,
3384
+ "replayed": True,
3385
+ }
3386
+
3387
+ custom = dict(metadata or {})
3388
+ custom["request_id"] = request_id
3389
+ custom["input_kind"] = "memory_exact_import"
3390
+ embedding = await self._embed_service.embed(content)
3391
+ node = MemoryNode(
3392
+ node_id=memory_id,
3393
+ user_id=user_id,
3394
+ agent_id=agent_id,
3395
+ session_id=session_id,
3396
+ source=source,
3397
+ layer=layer,
3398
+ content=content,
3399
+ source_type=SourceType.EXPLICIT,
3400
+ status=status,
3401
+ owner=owner,
3402
+ tags=list(tags),
3403
+ supersedes=list(supersedes),
3404
+ superseded_by=list(superseded_by),
3405
+ is_latest=is_latest,
3406
+ embedding=embedding,
3407
+ memory_at=memory_at,
3408
+ custom=custom,
3409
+ )
3410
+ stored_id = await self._vector_store.upsert(node)
3411
+ if stored_id != memory_id:
3412
+ raise RuntimeError("exact memory import changed the requested identity")
3413
+ return {
3414
+ "success": True,
3415
+ "memory_id": memory_id,
3416
+ "memory_ids": [memory_id],
3417
+ "request_id": request_id,
3418
+ }
3419
+
3226
3420
  @_ensure_internal_loop
3227
3421
  async def async_get_raw(self, raw_id: str) -> Optional[Dict[str, Any]]:
3228
3422
  from .models.memory import MemoryLayer
@@ -3275,6 +3469,66 @@ class HyMemoryClient:
3275
3469
  "offset": offset,
3276
3470
  }
3277
3471
 
3472
+ async def _search_explicit_raw_layer(
3473
+ self,
3474
+ query: str,
3475
+ *,
3476
+ user_ids: List[str],
3477
+ agent_ids: List[str],
3478
+ session_ids: List[str],
3479
+ include_sources: List[str],
3480
+ exclude_sources: List[str],
3481
+ limit: int,
3482
+ min_score: float,
3483
+ created_after: Optional[float],
3484
+ request_id: str,
3485
+ t0: float,
3486
+ query_embedding: Optional[List[float]],
3487
+ ) -> Dict[str, Any]:
3488
+ """Implement `search(..., layers=['l1_raw'])` without a second API."""
3489
+ from .models.memory import MemoryLayer, MemoryStatus
3490
+
3491
+ embedding = query_embedding or await self._embed_service.embed(query)
3492
+ fetch = min(max(limit * (10 if session_ids else 2), limit), 10_000)
3493
+ hits = await self._vector_store.search(
3494
+ query_embedding=embedding,
3495
+ user_ids=user_ids,
3496
+ agent_ids=agent_ids,
3497
+ include_sources=include_sources,
3498
+ exclude_sources=exclude_sources,
3499
+ layers=[MemoryLayer.L1_RAW],
3500
+ limit=fetch,
3501
+ score_threshold=min_score,
3502
+ status_filter=[MemoryStatus.ACTIVE],
3503
+ only_latest=False,
3504
+ created_after=created_after,
3505
+ )
3506
+ sessions = set(session_ids)
3507
+ rows: List[Dict[str, Any]] = []
3508
+ for hit in hits:
3509
+ node = hit.get("node")
3510
+ if node is None or node.layer != MemoryLayer.L1_RAW:
3511
+ continue
3512
+ if sessions and node.session_id not in sessions:
3513
+ continue
3514
+ row = self._raw_node_to_public(node)
3515
+ rows.append(
3516
+ {
3517
+ "memory_id": row.pop("raw_id"),
3518
+ **row,
3519
+ "layer": MemoryLayer.L1_RAW.value,
3520
+ "status": MemoryStatus.ACTIVE.value,
3521
+ "score": round(float(hit.get("score", 0.0)), 4),
3522
+ }
3523
+ )
3524
+ if len(rows) >= limit:
3525
+ break
3526
+ return {
3527
+ "request_id": request_id,
3528
+ "memories": {"schema": [], "proactive": [], "normal": rows},
3529
+ "elapsed_ms": round((time.perf_counter() - t0) * 1000, 2),
3530
+ }
3531
+
3278
3532
  @staticmethod
3279
3533
  def _public_search_views(
3280
3534
  result_memories: List[Dict[str, Any]],
@@ -3935,6 +4189,22 @@ class HyMemoryClient:
3935
4189
  effective_search_layers = [MemoryLayer.L1_RAW] if lite_mode else layers
3936
4190
  effective_schema_limit = 0 if lite_mode else schema_limit
3937
4191
  effective_intention_limit = 0 if lite_mode else intention_limit
4192
+ normalized_search_layers = self._normalize_layers(effective_search_layers)
4193
+ if normalized_search_layers == [MemoryLayer.L1_RAW]:
4194
+ return await self._search_explicit_raw_layer(
4195
+ effective_target_query,
4196
+ user_ids=effective_user_ids,
4197
+ agent_ids=effective_agent_ids,
4198
+ session_ids=effective_session_ids,
4199
+ include_sources=effective_include_sources,
4200
+ exclude_sources=effective_exclude_sources,
4201
+ limit=limit,
4202
+ min_score=min_score,
4203
+ created_after=effective_created_after,
4204
+ request_id=request_id,
4205
+ t0=t0,
4206
+ query_embedding=query_embedding,
4207
+ )
3938
4208
 
3939
4209
  read_req = ReadRequest(
3940
4210
  query=effective_target_query,
@@ -3955,7 +4225,7 @@ class HyMemoryClient:
3955
4225
  layers=(
3956
4226
  [
3957
4227
  layer.value
3958
- for layer in self._normalize_layers(effective_search_layers)
4228
+ for layer in normalized_search_layers
3959
4229
  ]
3960
4230
  if effective_search_layers else None
3961
4231
  ),
@@ -3980,7 +4250,7 @@ class HyMemoryClient:
3980
4250
  _wanted_layers = (
3981
4251
  {
3982
4252
  layer.value
3983
- for layer in self._normalize_layers(effective_search_layers)
4253
+ for layer in normalized_search_layers
3984
4254
  }
3985
4255
  if effective_search_layers else None
3986
4256
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hy-memory
3
- Version: 2.0.5.dev1
3
+ Version: 2.0.5.dev3
4
4
  Summary: HY Memory - Industrial-grade dual-system cognitive memory framework
5
5
  Author: alvinfei
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hy-memory"
7
- version = "2.0.5.dev1"
7
+ version = "2.0.5.dev3"
8
8
  description = "HY Memory - Industrial-grade dual-system cognitive memory framework"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes
File without changes