MemoryOS 2.0.15__tar.gz → 2.0.16__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 (379) hide show
  1. {memoryos-2.0.15 → memoryos-2.0.16}/PKG-INFO +2 -2
  2. {memoryos-2.0.15 → memoryos-2.0.16}/README.md +1 -1
  3. {memoryos-2.0.15 → memoryos-2.0.16}/pyproject.toml +1 -1
  4. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/__init__.py +1 -1
  5. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/search_handler.py +2 -0
  6. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/product_models.py +19 -0
  7. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/multi_modal_struct.py +25 -3
  8. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +17 -38
  9. memoryos-2.0.16/src/memos/mem_reader/read_skill_memory/upload_skill_memory.py +312 -0
  10. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +4 -0
  11. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/item.py +8 -0
  12. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +129 -2
  13. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +107 -12
  14. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/single_cube.py +8 -2
  15. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/hook_defs.py +8 -0
  16. memoryos-2.0.15/src/memos/api/README_api.md +0 -13
  17. memoryos-2.0.15/src/memos/dream/README.md +0 -246
  18. memoryos-2.0.15/src/memos/dream/README_ZH.md +0 -243
  19. {memoryos-2.0.15 → memoryos-2.0.16}/LICENSE +0 -0
  20. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/__init__.py +0 -0
  21. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/client.py +0 -0
  22. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/config.py +0 -0
  23. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/context/dependencies.py +0 -0
  24. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/exceptions.py +0 -0
  25. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/__init__.py +0 -0
  26. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/add_handler.py +0 -0
  27. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/base_handler.py +0 -0
  28. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/chat_handler.py +0 -0
  29. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/component_init.py +0 -0
  30. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/config_builders.py +0 -0
  31. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/feedback_handler.py +0 -0
  32. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/formatters_handler.py +0 -0
  33. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/memory_handler.py +0 -0
  34. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/scheduler_handler.py +0 -0
  35. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/suggestion_handler.py +0 -0
  36. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/mcp_serve.py +0 -0
  37. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/__init__.py +0 -0
  38. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/auth.py +0 -0
  39. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/rate_limit.py +0 -0
  40. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/request_context.py +0 -0
  41. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/__init__.py +0 -0
  42. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/admin_router.py +0 -0
  43. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/server_router.py +0 -0
  44. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/server_api.py +0 -0
  45. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/server_api_ext.py +0 -0
  46. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/utils/__init__.py +0 -0
  47. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/utils/api_keys.py +0 -0
  48. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/__init__.py +0 -0
  49. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/base.py +0 -0
  50. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/charactertext_chunker.py +0 -0
  51. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/factory.py +0 -0
  52. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/markdown_chunker.py +0 -0
  53. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/sentence_chunker.py +0 -0
  54. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/simple_chunker.py +0 -0
  55. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/cli.py +0 -0
  56. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/__init__.py +0 -0
  57. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/base.py +0 -0
  58. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/chunker.py +0 -0
  59. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/embedder.py +0 -0
  60. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/graph_db.py +0 -0
  61. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/internet_retriever.py +0 -0
  62. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/llm.py +0 -0
  63. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_agent.py +0 -0
  64. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_chat.py +0 -0
  65. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_cube.py +0 -0
  66. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_os.py +0 -0
  67. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_reader.py +0 -0
  68. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_scheduler.py +0 -0
  69. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_user.py +0 -0
  70. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/memory.py +0 -0
  71. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/parser.py +0 -0
  72. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/reranker.py +0 -0
  73. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/utils.py +0 -0
  74. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/vec_db.py +0 -0
  75. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/context/context.py +0 -0
  76. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dependency.py +0 -0
  77. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/deprecation.py +0 -0
  78. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/__init__.py +0 -0
  79. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/hook_defs.py +0 -0
  80. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/hooks.py +0 -0
  81. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/maintenance.py +0 -0
  82. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/__init__.py +0 -0
  83. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/base.py +0 -0
  84. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/diary.py +0 -0
  85. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/motive.py +0 -0
  86. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/persistence.py +0 -0
  87. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/reasoning.py +0 -0
  88. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/recall.py +0 -0
  89. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/plugin.py +0 -0
  90. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/__init__.py +0 -0
  91. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/motive_prompt.py +0 -0
  92. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/reasoning_prompt.py +0 -0
  93. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/__init__.py +0 -0
  94. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/diary_router.py +0 -0
  95. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/trigger_router.py +0 -0
  96. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routes.py +0 -0
  97. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/signal_store.py +0 -0
  98. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/types.py +0 -0
  99. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/__init__.py +0 -0
  100. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/ark.py +0 -0
  101. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/base.py +0 -0
  102. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/factory.py +0 -0
  103. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/ollama.py +0 -0
  104. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/sentence_transformer.py +0 -0
  105. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/universal_api.py +0 -0
  106. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/exceptions.py +0 -0
  107. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/extras/__init__.py +0 -0
  108. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/__init__.py +0 -0
  109. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/base.py +0 -0
  110. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/factory.py +0 -0
  111. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/item.py +0 -0
  112. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/neo4j.py +0 -0
  113. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/neo4j_community.py +0 -0
  114. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/polardb.py +0 -0
  115. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/postgres.py +0 -0
  116. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/hello_world.py +0 -0
  117. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/__init__.py +0 -0
  118. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/base.py +0 -0
  119. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/deepseek.py +0 -0
  120. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/factory.py +0 -0
  121. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/hf.py +0 -0
  122. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/hf_singleton.py +0 -0
  123. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/minimax.py +0 -0
  124. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/ollama.py +0 -0
  125. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/openai.py +0 -0
  126. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/openai_new.py +0 -0
  127. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/qwen.py +0 -0
  128. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/utils.py +0 -0
  129. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/vllm.py +0 -0
  130. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/log.py +0 -0
  131. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/base.py +0 -0
  132. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  133. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/factory.py +0 -0
  134. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/__init__.py +0 -0
  135. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/base.py +0 -0
  136. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/factory.py +0 -0
  137. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/simple.py +0 -0
  138. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/__init__.py +0 -0
  139. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/base.py +0 -0
  140. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/general.py +0 -0
  141. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/navie.py +0 -0
  142. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/utils.py +0 -0
  143. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/base.py +0 -0
  144. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/feedback.py +0 -0
  145. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/simple_feedback.py +0 -0
  146. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/utils.py +0 -0
  147. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/core.py +0 -0
  148. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/main.py +0 -0
  149. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/default_config.py +0 -0
  150. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/format_utils.py +0 -0
  151. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/reference_utils.py +0 -0
  152. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/__init__.py +0 -0
  153. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/base.py +0 -0
  154. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/factory.py +0 -0
  155. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/memory.py +0 -0
  156. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  157. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  158. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  159. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
  160. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
  161. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
  162. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  163. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
  164. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  165. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  166. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  167. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
  168. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
  169. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/simple_struct.py +0 -0
  170. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/strategy_struct.py +0 -0
  171. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/utils.py +0 -0
  172. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/__init__.py +0 -0
  173. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
  174. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  175. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
  176. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  177. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  178. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
  179. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
  180. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
  181. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
  182. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_scheduler.py +0 -0
  183. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
  184. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  185. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  186. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +0 -0
  187. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  188. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  189. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  190. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  191. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  192. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
  193. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
  194. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
  195. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  196. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
  197. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
  198. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  199. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
  200. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
  201. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
  202. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  203. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  204. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  205. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
  206. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
  207. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
  208. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  209. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  210. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  211. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  212. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
  213. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  214. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  215. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
  216. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  217. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  218. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
  219. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  220. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
  221. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
  222. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
  223. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
  224. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
  225. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
  226. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
  227. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_dream_handler.py +0 -0
  228. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
  229. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
  230. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
  231. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
  232. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
  233. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  234. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
  235. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
  236. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
  237. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/__init__.py +0 -0
  238. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  239. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  240. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  241. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  242. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  243. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  244. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  245. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  246. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  247. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
  248. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  249. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/factory.py +0 -0
  250. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  251. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/mysql_user_manager.py +0 -0
  252. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/persistent_factory.py +0 -0
  253. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/persistent_user_manager.py +0 -0
  254. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  255. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/user_manager.py +0 -0
  256. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/__init__.py +0 -0
  257. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/__init__.py +0 -0
  258. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/base.py +0 -0
  259. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/item.py +0 -0
  260. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/kv.py +0 -0
  261. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/vllmkv.py +0 -0
  262. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/base.py +0 -0
  263. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/factory.py +0 -0
  264. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/__init__.py +0 -0
  265. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/base.py +0 -0
  266. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/item.py +0 -0
  267. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/lora.py +0 -0
  268. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/__init__.py +0 -0
  269. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/base.py +0 -0
  270. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/general.py +0 -0
  271. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/naive.py +0 -0
  272. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  273. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  274. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  275. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
  276. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  277. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  278. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  279. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  280. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/preference.py +0 -0
  281. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/simple_preference.py +0 -0
  282. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/simple_tree.py +0 -0
  283. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree.py +0 -0
  284. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  285. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  286. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  287. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
  288. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  289. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  290. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  291. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  292. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  293. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  294. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  295. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  296. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  297. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
  298. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  299. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  300. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  301. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
  302. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  303. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  304. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  305. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/lockfree_dict.py +0 -0
  306. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/notification_service.py +0 -0
  307. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/notification_utils.py +0 -0
  308. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/singleton.py +0 -0
  309. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  310. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  311. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/__init__.py +0 -0
  312. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/composite_cube.py +0 -0
  313. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/views.py +0 -0
  314. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/__init__.py +0 -0
  315. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/base.py +0 -0
  316. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/factory.py +0 -0
  317. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/markitdown.py +0 -0
  318. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/__init__.py +0 -0
  319. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/base.py +0 -0
  320. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/component_bootstrap.py +0 -0
  321. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/hooks.py +0 -0
  322. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/manager.py +0 -0
  323. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/__init__.py +0 -0
  324. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/base.py +0 -0
  325. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/concat.py +0 -0
  326. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/cosine_local.py +0 -0
  327. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/factory.py +0 -0
  328. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/http_bge.py +0 -0
  329. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/http_bge_strategy.py +0 -0
  330. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/noop.py +0 -0
  331. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/__init__.py +0 -0
  332. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/base.py +0 -0
  333. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/concat_background.py +0 -0
  334. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  335. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  336. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/factory.py +0 -0
  337. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/single_turn.py +0 -0
  338. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  339. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/search/__init__.py +0 -0
  340. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/search/search_service.py +0 -0
  341. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/settings.py +0 -0
  342. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/__init__.py +0 -0
  343. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/advanced_search_prompts.py +0 -0
  344. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/cloud_service_prompt.py +0 -0
  345. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/instruction_completion.py +0 -0
  346. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_agent_prompts.py +0 -0
  347. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_feedback_prompts.py +0 -0
  348. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_reader_prompts.py +0 -0
  349. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  350. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  351. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_search_prompts.py +0 -0
  352. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mos_prompts.py +0 -0
  353. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/prefer_complete_prompt.py +0 -0
  354. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/skill_mem_prompt.py +0 -0
  355. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/tool_mem_prompts.py +0 -0
  356. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  357. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/__init__.py +0 -0
  358. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/general_types.py +0 -0
  359. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  360. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  361. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  362. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  363. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  364. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  365. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  366. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  367. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  368. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  369. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  370. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  371. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  372. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  373. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/utils.py +0 -0
  374. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/__init__.py +0 -0
  375. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/base.py +0 -0
  376. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/factory.py +0 -0
  377. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/item.py +0 -0
  378. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/milvus.py +0 -0
  379. {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/qdrant.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MemoryOS
3
- Version: 2.0.15
3
+ Version: 2.0.16
4
4
  Summary: Intelligence Begins with Memory
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -131,7 +131,7 @@ Your lobsters and Hermes Agents now have **the best** memory system — choose *
131
131
 
132
132
  | 🔌 Plugin | <div align="center"> 💡 Core Features </div> | 🧩 Resources |
133
133
  | :----: | :--- | :---: |
134
- | 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
134
+ | 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🌐 [Website](https://memos-claw.openmem.net/) · 📖 [Docs](https://memos-docs.openmem.net/cn/openclaw/local_plugin) · 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
135
135
  | ☁️ [**OpenClaw Cloud Plugin**](https://x.com/MemOS_dev/status/2019254160919769171?s=20) | <ul><li>[Reduces token usage by 72%.](https://x.com/MemOS_dev/status/2020854044583924111)</li><li>[Multi-agent memory sharing by `user_id`.](https://x.com/MemOS_dev/status/2020538135487062094)</li></ul> | 🖥️ [MemOS Dashboard](https://memos-dashboard.openmem.net/login/) · 📖 [Full Tutorial](https://memos-docs.openmem.net/openclaw/guide#_4-update-plugin) |
136
136
 
137
137
  </div>
@@ -47,7 +47,7 @@ Your lobsters and Hermes Agents now have **the best** memory system — choose *
47
47
 
48
48
  | 🔌 Plugin | <div align="center"> 💡 Core Features </div> | 🧩 Resources |
49
49
  | :----: | :--- | :---: |
50
- | 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
50
+ | 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🌐 [Website](https://memos-claw.openmem.net/) · 📖 [Docs](https://memos-docs.openmem.net/cn/openclaw/local_plugin) · 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
51
51
  | ☁️ [**OpenClaw Cloud Plugin**](https://x.com/MemOS_dev/status/2019254160919769171?s=20) | <ul><li>[Reduces token usage by 72%.](https://x.com/MemOS_dev/status/2020854044583924111)</li><li>[Multi-agent memory sharing by `user_id`.](https://x.com/MemOS_dev/status/2020538135487062094)</li></ul> | 🖥️ [MemOS Dashboard](https://memos-dashboard.openmem.net/login/) · 📖 [Full Tutorial](https://memos-docs.openmem.net/openclaw/guide#_4-update-plugin) |
52
52
 
53
53
  </div>
@@ -4,7 +4,7 @@
4
4
  ##############################################################################
5
5
 
6
6
  name = "MemoryOS"
7
- version = "2.0.15"
7
+ version = "2.0.16"
8
8
  description = "Intelligence Begins with Memory"
9
9
  license = {text = "Apache-2.0"}
10
10
  readme = "README.md"
@@ -1,4 +1,4 @@
1
- __version__ = "2.0.15"
1
+ __version__ = "2.0.16"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -20,6 +20,7 @@ from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
20
20
  from memos.multi_mem_cube.composite_cube import CompositeCubeView
21
21
  from memos.multi_mem_cube.single_cube import SingleCubeView
22
22
  from memos.multi_mem_cube.views import MemCubeView
23
+ from memos.plugins.hooks import hookable
23
24
 
24
25
 
25
26
  logger = get_logger(__name__)
@@ -44,6 +45,7 @@ class SearchHandler(BaseHandler):
44
45
  "naive_mem_cube", "mem_scheduler", "searcher", "deepsearch_agent"
45
46
  )
46
47
 
48
+ @hookable("search")
47
49
  def handle_search_memories(self, search_req: APISearchRequest) -> SearchResponse:
48
50
  """
49
51
  Main handler for search memories endpoint.
@@ -438,6 +438,14 @@ class APISearchRequest(BaseRequest):
438
438
  )
439
439
 
440
440
  # ==== Context ====
441
+ reference_time: str | None = Field(
442
+ None,
443
+ description=(
444
+ "Optional reference time for time-sensitive search parsing. "
445
+ "If omitted, search uses the current server time."
446
+ ),
447
+ )
448
+
441
449
  chat_history: MessageList | None = Field(
442
450
  None,
443
451
  description=(
@@ -608,6 +616,17 @@ class APIADDRequest(BaseRequest):
608
616
  description=("Whether this request represents user feedback. Default: False."),
609
617
  )
610
618
 
619
+ # ==== Upload skill flag ====
620
+ is_upload_skill: bool = Field(
621
+ False,
622
+ description=(
623
+ "Whether this request is an upload skill request. "
624
+ "When True, the messages field should contain file items "
625
+ "with zip file download URLs for pre-built skill packages. "
626
+ "Default: False."
627
+ ),
628
+ )
629
+
611
630
  # ==== Backward compatibility fields (will delete later) ====
612
631
  mem_cube_id: str | None = Field(
613
632
  None,
@@ -17,7 +17,7 @@ from memos.mem_reader.simple_struct import PROMPT_DICT, SimpleStructMemReader
17
17
  from memos.mem_reader.utils import parse_json_result
18
18
  from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata
19
19
  from memos.plugins.hook_defs import H
20
- from memos.plugins.hooks import trigger_single_hook
20
+ from memos.plugins.hooks import trigger_hook, trigger_single_hook
21
21
  from memos.templates.mem_reader_prompts import MEMORY_MERGE_PROMPT_EN, MEMORY_MERGE_PROMPT_ZH
22
22
  from memos.templates.tool_mem_prompts import TOOL_TRAJECTORY_PROMPT_EN, TOOL_TRAJECTORY_PROMPT_ZH
23
23
  from memos.types import MessagesType
@@ -785,6 +785,14 @@ class MultiModalStructMemReader(SimpleStructMemReader):
785
785
  )
786
786
  rawfile_node.metadata.summary_ids = [mem_node.id for mem_node in fine_items]
787
787
  fine_items.append(rawfile_node)
788
+ enriched_items = trigger_hook(
789
+ H.MEMORY_ITEMS_AFTER_FINE_EXTRACT,
790
+ items=fine_items,
791
+ user_context=kwargs.get("user_context"),
792
+ mem_reader=self,
793
+ extract_mode="fine",
794
+ )
795
+ fine_items = enriched_items if enriched_items is not None else fine_items
788
796
  return fine_items
789
797
 
790
798
  fine_memory_items: list[TextualMemoryItem] = []
@@ -993,6 +1001,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
993
1001
  return fast_memory_items
994
1002
 
995
1003
  # Stage: llm_extract — fine mode 4-way parallel LLM + per-source serial
1004
+ is_upload_skill = kwargs.pop("is_upload_skill", False)
996
1005
  non_file_url_fast_items = [
997
1006
  item for item in fast_memory_items if not self._is_file_url_only_item(item)
998
1007
  ]
@@ -1009,7 +1018,9 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1009
1018
  )
1010
1019
  future_skill = executor.submit(
1011
1020
  process_skill_memory_fine,
1012
- fast_memory_items=non_file_url_fast_items,
1021
+ fast_memory_items=fast_memory_items
1022
+ if is_upload_skill
1023
+ else non_file_url_fast_items,
1013
1024
  info=info,
1014
1025
  searcher=self.searcher,
1015
1026
  graph_db=self.graph_db,
@@ -1017,6 +1028,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1017
1028
  embedder=self.embedder,
1018
1029
  oss_config=self.oss_config,
1019
1030
  skills_dir_config=self.skills_dir_config,
1031
+ is_upload_skill=is_upload_skill,
1020
1032
  **kwargs,
1021
1033
  )
1022
1034
  future_pref = executor.submit(
@@ -1039,6 +1051,10 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1039
1051
  fine_memory_items.extend(fine_memory_items_pref_parser)
1040
1052
 
1041
1053
  # Part B: per-source serial processing
1054
+ if is_upload_skill:
1055
+ # (skip for upload skill to avoid zip being parsed)
1056
+ return fine_memory_items
1057
+
1042
1058
  with timed_stage("add", "per_source") as ts_ps:
1043
1059
  for fast_item in fast_memory_items:
1044
1060
  sources = fast_item.metadata.sources
@@ -1072,6 +1088,8 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1072
1088
  logger.warning("[MultiModalStruct] No raw nodes found.")
1073
1089
  return []
1074
1090
 
1091
+ is_upload_skill = kwargs.pop("is_upload_skill", False)
1092
+
1075
1093
  # Extract info from raw_nodes (same as simple_struct.py)
1076
1094
  info = {
1077
1095
  "user_id": raw_nodes[0].metadata.user_id,
@@ -1093,7 +1111,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1093
1111
  )
1094
1112
  future_skill = executor.submit(
1095
1113
  process_skill_memory_fine,
1096
- non_file_url_nodes,
1114
+ raw_nodes if is_upload_skill else non_file_url_nodes,
1097
1115
  info,
1098
1116
  searcher=self.searcher,
1099
1117
  llm=self.general_llm,
@@ -1101,6 +1119,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1101
1119
  graph_db=self.graph_db,
1102
1120
  oss_config=self.oss_config,
1103
1121
  skills_dir_config=self.skills_dir_config,
1122
+ is_upload_skill=is_upload_skill,
1104
1123
  **kwargs,
1105
1124
  )
1106
1125
  # Add preference memory extraction
@@ -1125,6 +1144,9 @@ class MultiModalStructMemReader(SimpleStructMemReader):
1125
1144
  fine_memory_items.extend(fine_memory_items_pref_parser)
1126
1145
 
1127
1146
  # Part B: get fine multimodal items
1147
+ if is_upload_skill:
1148
+ # (skip for upload skill to avoid zip being parsed)
1149
+ return fine_memory_items
1128
1150
  for raw_node in raw_nodes:
1129
1151
  sources = raw_node.metadata.sources
1130
1152
  for source in sources:
@@ -252,36 +252,6 @@ def _batch_generate_skill_details(
252
252
  return [item[0] for item in raw_skills_data]
253
253
 
254
254
 
255
- def add_id_to_mysql(memory_id: str, mem_cube_id: str):
256
- """Add id to mysql, will deprecate this function in the future"""
257
- # TODO: tmp function, deprecate soon
258
- import requests
259
-
260
- skill_mysql_url = os.getenv("SKILLS_MYSQL_URL", "")
261
- skill_mysql_bearer = os.getenv("SKILLS_MYSQL_BEARER", "")
262
-
263
- if not skill_mysql_url or not skill_mysql_bearer:
264
- logger.warning("[PROCESS_SKILLS] SKILLS_MYSQL_URL or SKILLS_MYSQL_BEARER is not set")
265
- return None
266
- headers = {"Authorization": skill_mysql_bearer, "Content-Type": "application/json"}
267
- data = {"memCubeId": mem_cube_id, "skillId": memory_id}
268
- try:
269
- response = requests.post(skill_mysql_url, headers=headers, json=data)
270
-
271
- logger.info(f"[PROCESS_SKILLS] response: \n\n{response.json()}")
272
- logger.info(f"[PROCESS_SKILLS] memory_id: \n\n{memory_id}")
273
- logger.info(f"[PROCESS_SKILLS] mem_cube_id: \n\n{mem_cube_id}")
274
- logger.info(f"[PROCESS_SKILLS] skill_mysql_url: \n\n{skill_mysql_url}")
275
- logger.info(f"[PROCESS_SKILLS] skill_mysql_bearer: \n\n{skill_mysql_bearer}")
276
- logger.info(f"[PROCESS_SKILLS] headers: \n\n{headers}")
277
- logger.info(f"[PROCESS_SKILLS] data: \n\n{data}")
278
-
279
- return response.json()
280
- except Exception as e:
281
- logger.warning(f"[PROCESS_SKILLS] Error adding id to mysql: {e}")
282
- return None
283
-
284
-
285
255
  @require_python_package(
286
256
  import_name="alibabacloud_oss_v2",
287
257
  install_command="pip install alibabacloud-oss-v2",
@@ -948,6 +918,7 @@ def create_skill_memory_item(
948
918
  scripts=skill_memory.get("scripts"),
949
919
  others=skill_memory.get("others"),
950
920
  url=skill_memory.get("url", ""),
921
+ skill_source=skill_memory.get("skill_source"),
951
922
  manager_user_id=manager_user_id,
952
923
  project_id=project_id,
953
924
  )
@@ -1024,6 +995,21 @@ def process_skill_memory_fine(
1024
995
  complete_skill_memory: bool = True,
1025
996
  **kwargs,
1026
997
  ) -> list[TextualMemoryItem]:
998
+ is_upload_skill = kwargs.pop("is_upload_skill", False)
999
+ if is_upload_skill:
1000
+ from memos.mem_reader.read_skill_memory.upload_skill_memory import (
1001
+ process_upload_skill_memory,
1002
+ )
1003
+
1004
+ return process_upload_skill_memory(
1005
+ fast_memory_items=fast_memory_items,
1006
+ info=info,
1007
+ embedder=embedder,
1008
+ oss_config=oss_config,
1009
+ skills_dir_config=skills_dir_config,
1010
+ **kwargs,
1011
+ )
1012
+
1027
1013
  skills_repo_backend = _get_skill_file_storage_location()
1028
1014
  oss_client, _missing_keys, flag = _skill_init(
1029
1015
  skills_repo_backend, oss_config, skills_dir_config
@@ -1252,6 +1238,7 @@ def process_skill_memory_fine(
1252
1238
  if source:
1253
1239
  skill_sources.append(source)
1254
1240
 
1241
+ skill_memory["skill_source"] = "auto_create"
1255
1242
  memory_item = create_skill_memory_item(
1256
1243
  skill_memory, info, embedder, sources=skill_sources, **kwargs
1257
1244
  )
@@ -1260,12 +1247,4 @@ def process_skill_memory_fine(
1260
1247
  logger.warning(f"[PROCESS_SKILLS] Error creating skill memory item: {e}")
1261
1248
  continue
1262
1249
 
1263
- # TODO: deprecate this funtion and call
1264
- for skill_memory, skill_memory_item in zip(skill_memories, skill_memory_items, strict=False):
1265
- if skill_memory.get("update", False) and skill_memory.get("old_memory_id", ""):
1266
- continue
1267
- add_id_to_mysql(
1268
- memory_id=skill_memory_item.id,
1269
- mem_cube_id=kwargs.get("user_name", info.get("user_id", "")),
1270
- )
1271
1250
  return skill_memory_items
@@ -0,0 +1,312 @@
1
+ import re
2
+ import shutil
3
+ import tempfile
4
+ import zipfile
5
+
6
+ from pathlib import Path
7
+ from typing import Any
8
+ from urllib.parse import urlparse
9
+ from uuid import uuid4
10
+
11
+ import requests
12
+
13
+ from memos.embedders.base import BaseEmbedder
14
+ from memos.log import get_logger
15
+ from memos.mem_reader.read_skill_memory.process_skill_memory import (
16
+ create_skill_memory_item,
17
+ )
18
+ from memos.memories.textual.item import TextualMemoryItem
19
+ from memos.utils import timed
20
+
21
+
22
+ logger = get_logger(__name__)
23
+
24
+ _TEXT_MAX_LEN = 20
25
+
26
+
27
+ def _truncate(text: str) -> str:
28
+ """Truncate a string to at most ``_TEXT_MAX_LEN`` characters."""
29
+ return text[:_TEXT_MAX_LEN]
30
+
31
+
32
+ def _extract_zip_url_from_items(items: list[TextualMemoryItem]) -> str | None:
33
+ """
34
+ Extract the zip download URL from fast-stage memory items.
35
+
36
+ FileContentParser.parse_fast stores the URL in source.file_info["file_data"].
37
+ Each upload-skill request contains exactly one zip URL.
38
+ """
39
+ for item in items:
40
+ for source in getattr(item.metadata, "sources", None) or []:
41
+ file_info = getattr(source, "file_info", None)
42
+ if not isinstance(file_info, dict):
43
+ continue
44
+ file_data = file_info.get("file_data", "")
45
+ if isinstance(file_data, str) and file_data.startswith(("http://", "https://")):
46
+ url_path = urlparse(file_data).path
47
+ if url_path.lower().endswith(".zip"):
48
+ return file_data
49
+ return None
50
+
51
+
52
+ def _extract_file_ids_from_items(items: list[TextualMemoryItem]) -> list[str]:
53
+ """Extract uploaded file ids from fast-stage memory metadata and sources."""
54
+ file_ids: list[str] = []
55
+
56
+ def _append_file_id(file_id: Any) -> None:
57
+ if isinstance(file_id, str) and file_id and file_id not in file_ids:
58
+ file_ids.append(file_id)
59
+
60
+ for item in items:
61
+ metadata = getattr(item, "metadata", None)
62
+ metadata_file_ids = getattr(metadata, "file_ids", None) if metadata else None
63
+ if isinstance(metadata_file_ids, list):
64
+ for file_id in metadata_file_ids:
65
+ _append_file_id(file_id)
66
+
67
+ for source in getattr(metadata, "sources", None) or []:
68
+ file_info = getattr(source, "file_info", None)
69
+ if isinstance(file_info, dict):
70
+ _append_file_id(file_info.get("file_id"))
71
+
72
+ return file_ids
73
+
74
+
75
+ def _download_zip(url: str, tmp_dir: Path) -> Path:
76
+ """Download a zip file to a local temporary directory."""
77
+ try:
78
+ resp = requests.get(url, stream=True, timeout=60)
79
+ resp.raise_for_status()
80
+ except Exception as e:
81
+ raise ValueError(f"Failed to download zip from {url}: {e}") from e
82
+
83
+ zip_path = tmp_dir / f"{uuid4()}.zip"
84
+ with open(zip_path, "wb") as f:
85
+ for chunk in resp.iter_content(chunk_size=8192):
86
+ f.write(chunk)
87
+
88
+ if not zipfile.is_zipfile(zip_path):
89
+ raise ValueError(f"Downloaded file is not a valid zip: {url}")
90
+
91
+ return zip_path
92
+
93
+
94
+ def _extract_and_parse_skill_zip(zip_path: Path) -> dict[str, Any]:
95
+ """
96
+ Extract a skill zip and parse SKILL.md + directory contents into a skill_memory dict.
97
+
98
+ The SKILL.md format mirrors the output of ``_write_skills_to_file`` in
99
+ ``process_skill_memory.py``. Section headings at any level (``#`` through
100
+ ``######``) are matched by title text (case-insensitive).
101
+ """
102
+ # Step 1: extract & locate SKILL.md
103
+ extract_dir = zip_path.parent / zip_path.stem
104
+ with zipfile.ZipFile(zip_path, "r") as zf:
105
+ zf.extractall(extract_dir)
106
+
107
+ skill_md_path = None
108
+ for candidate in extract_dir.rglob("SKILL.md"):
109
+ skill_md_path = candidate
110
+ break
111
+
112
+ if skill_md_path is None:
113
+ raise FileNotFoundError(f"SKILL.md not found in zip: {zip_path.name}")
114
+
115
+ skill_root = skill_md_path.parent
116
+ raw_text = skill_md_path.read_text(encoding="utf-8")
117
+
118
+ # Step 2: parse frontmatter → name, description
119
+ name = ""
120
+ description = ""
121
+ fm_match = re.match(r"^---\s*\n(.*?)\n---", raw_text, re.DOTALL)
122
+ if fm_match:
123
+ for line in fm_match.group(1).splitlines():
124
+ if line.startswith("name:"):
125
+ name = line[len("name:") :].strip()
126
+ elif line.startswith("description:"):
127
+ description = line[len("description:") :].strip()
128
+
129
+ if not name:
130
+ name = zip_path.stem
131
+
132
+ # Step 3: split body by any-level heading and parse each section
133
+ trigger: str = ""
134
+ procedure: str = ""
135
+ experience: list[str] = []
136
+ preference: list[str] = []
137
+ examples: list[str] = []
138
+ tool: str | None = None
139
+ others_inline: dict[str, str] = {}
140
+
141
+ known_sections = {
142
+ "trigger",
143
+ "procedure",
144
+ "experience",
145
+ "user preferences",
146
+ "examples",
147
+ "scripts",
148
+ "tool usage",
149
+ "additional information",
150
+ }
151
+
152
+ body = raw_text[fm_match.end() :] if fm_match else raw_text
153
+ sections = re.split(r"\n(?=#{1,6}\s)", body)
154
+
155
+ for section in sections:
156
+ section = section.strip()
157
+ if not section:
158
+ continue
159
+
160
+ heading_match = re.match(r"^(#{1,6})\s+(.*)", section)
161
+ if not heading_match:
162
+ continue
163
+
164
+ title = heading_match.group(2).strip()
165
+ content = section[heading_match.end() :].strip()
166
+ title_lower = title.lower()
167
+
168
+ if title_lower not in known_sections:
169
+ logger.warning("[UPLOAD_SKILL] Unknown section '%s' in SKILL.md, skipping", title)
170
+ continue
171
+
172
+ if title_lower == "trigger":
173
+ trigger = content
174
+
175
+ elif title_lower == "procedure":
176
+ procedure = content
177
+
178
+ elif title_lower == "experience":
179
+ items = re.findall(r"^\d+\.\s+(.+)$", content, re.MULTILINE)
180
+ experience = [item.strip() for item in items] if items else []
181
+
182
+ elif title_lower == "user preferences":
183
+ items = re.findall(r"^-\s+(.+)$", content, re.MULTILINE)
184
+ preference = [item.strip() for item in items] if items else []
185
+
186
+ elif title_lower == "examples":
187
+ blocks = re.findall(r"```markdown\n(.*?)\n```", content, re.DOTALL)
188
+ examples = [b.strip() for b in blocks]
189
+
190
+ elif title_lower == "scripts":
191
+ pass
192
+
193
+ elif title_lower == "tool usage":
194
+ tool = content.strip() if content.strip() else None
195
+
196
+ elif title_lower == "additional information":
197
+ sub_sections = re.split(r"\n(?=#{1,6}\s)", content)
198
+ for sub in sub_sections:
199
+ sub = sub.strip()
200
+ if not sub or sub.startswith("See also:"):
201
+ continue
202
+ sub_heading = re.match(r"^(#{1,6})\s+(.*)", sub)
203
+ if not sub_heading:
204
+ continue
205
+ sub_key = sub_heading.group(2).strip()
206
+ sub_val = sub[sub_heading.end() :].strip()
207
+ if sub_val:
208
+ others_inline[sub_key] = sub_val
209
+
210
+ # Step 4: read scripts/ directory
211
+ scripts: dict[str, str] | None = None
212
+ scripts_dir = skill_root / "scripts"
213
+ if scripts_dir.is_dir():
214
+ scripts = {}
215
+ for py_file in scripts_dir.glob("*.py"):
216
+ scripts[py_file.name] = py_file.read_text(encoding="utf-8")
217
+
218
+ # Step 5: read reference/ directory → merge into others
219
+ others = dict(others_inline)
220
+ reference_dir = skill_root / "reference"
221
+ if reference_dir.is_dir():
222
+ for md_file in reference_dir.glob("*.md"):
223
+ others[md_file.name] = md_file.read_text(encoding="utf-8")
224
+
225
+ # Step 6: truncate text fields & assemble return dict
226
+ truncated_trigger = _truncate(trigger)
227
+
228
+ result: dict[str, Any] = {
229
+ "name": name,
230
+ "description": description,
231
+ "tags": [truncated_trigger] if truncated_trigger else [],
232
+ "procedure": _truncate(procedure),
233
+ "experience": [_truncate(e) for e in experience],
234
+ "preference": [_truncate(p) for p in preference],
235
+ "examples": [_truncate(e) for e in examples],
236
+ "tool": _truncate(tool) if tool else None,
237
+ "scripts": {k: _truncate(v) for k, v in scripts.items()} if scripts else None,
238
+ "others": {k: _truncate(v) for k, v in others.items()} if others else None,
239
+ }
240
+ # Only include trigger when non-empty; create_skill_memory_item uses
241
+ # `skill_memory.get("tags") or skill_memory.get("trigger", [])`,
242
+ # an empty-string trigger would override the correct [] fallback.
243
+ if truncated_trigger:
244
+ result["trigger"] = truncated_trigger
245
+ return result
246
+
247
+
248
+ @timed
249
+ def process_upload_skill_memory(
250
+ fast_memory_items: list[TextualMemoryItem],
251
+ info: dict[str, Any],
252
+ embedder: BaseEmbedder | None = None,
253
+ oss_config: dict[str, Any] | None = None,
254
+ skills_dir_config: dict[str, Any] | None = None,
255
+ **kwargs,
256
+ ) -> list[TextualMemoryItem]:
257
+ """
258
+ Process a user-uploaded skill zip, parse it, and build a SkillMemory node.
259
+
260
+ The zip URL is taken from the fast-stage ``TextualMemoryItem`` sources
261
+ (``source.file_info["file_data"]``), consistent with both sync-fine and
262
+ async-transfer paths.
263
+ """
264
+ zip_url = _extract_zip_url_from_items(fast_memory_items)
265
+ if not zip_url:
266
+ logger.warning("[UPLOAD_SKILL] No zip URL found in fast_memory_items")
267
+ return []
268
+ file_ids = _extract_file_ids_from_items(fast_memory_items)
269
+
270
+ tmp_dir = Path(tempfile.mkdtemp(prefix="upload_skill_"))
271
+ try:
272
+ zip_path = _download_zip(zip_url, tmp_dir)
273
+ except Exception as e:
274
+ logger.warning("[UPLOAD_SKILL] Failed to download zip: %s", e)
275
+ shutil.rmtree(tmp_dir, ignore_errors=True)
276
+ return []
277
+
278
+ try:
279
+ skill_memory = _extract_and_parse_skill_zip(zip_path)
280
+ except FileNotFoundError as e:
281
+ logger.warning("[UPLOAD_SKILL] %s", e)
282
+ shutil.rmtree(tmp_dir, ignore_errors=True)
283
+ return []
284
+ except Exception as e:
285
+ logger.error("[UPLOAD_SKILL] Failed to parse skill zip: %s", e)
286
+ shutil.rmtree(tmp_dir, ignore_errors=True)
287
+ return []
288
+
289
+ skill_memory["url"] = zip_url
290
+ skill_memory["skill_source"] = "user_upload"
291
+
292
+ try:
293
+ skill_memory_item = create_skill_memory_item(skill_memory, info, embedder, **kwargs)
294
+ if file_ids:
295
+ skill_memory_item.metadata.file_ids = file_ids
296
+ metadata_info = dict(skill_memory_item.metadata.info or {})
297
+ metadata_info.setdefault("file_id", file_ids[0])
298
+ skill_memory_item.metadata.info = metadata_info
299
+ except Exception as e:
300
+ logger.error("[UPLOAD_SKILL] Failed to create skill memory item: %s", e)
301
+ shutil.rmtree(tmp_dir, ignore_errors=True)
302
+ return []
303
+
304
+ # Cleanup temp files
305
+ shutil.rmtree(tmp_dir, ignore_errors=True)
306
+
307
+ logger.info(
308
+ "[UPLOAD_SKILL] Successfully created SkillMemory from uploaded zip: name=%s, id=%s",
309
+ skill_memory.get("name"),
310
+ skill_memory_item.id,
311
+ )
312
+ return [skill_memory_item]
@@ -165,6 +165,9 @@ class MemReadMessageHandler(BaseSchedulerHandler):
165
165
 
166
166
  logger.info("Processing %s memories with mem_reader", len(memory_items))
167
167
 
168
+ info = dict(info or {})
169
+ is_upload_skill = info.pop("is_upload_skill", False)
170
+
168
171
  try:
169
172
  processed_memories = mem_reader.fine_transfer_simple_mem(
170
173
  memory_items,
@@ -173,6 +176,7 @@ class MemReadMessageHandler(BaseSchedulerHandler):
173
176
  user_name=user_name,
174
177
  chat_history=chat_history,
175
178
  user_context=user_context,
179
+ is_upload_skill=is_upload_skill,
176
180
  )
177
181
  except Exception as e:
178
182
  logger.warning("%s: Fail to transfer mem: %s", e, memory_items)
@@ -81,6 +81,14 @@ class ArchivedTextualMemory(BaseModel):
81
81
  default_factory=lambda: datetime.now().isoformat(),
82
82
  description="The time the memory was created.",
83
83
  )
84
+ timespec: dict[str, Any] | None = Field(
85
+ default=None,
86
+ description="Compact temporal index snapshot for this archived version, used by retrieval-side version selection.",
87
+ )
88
+ memory_form: Literal["state", "event"] | None = Field(
89
+ default=None,
90
+ description="Internal memory form snapshot for this archived version, used by retrieval-side routing.",
91
+ )
84
92
 
85
93
 
86
94
  class TextualMemoryMetadata(BaseModel):