memu-cli 0.4.0__tar.gz → 0.5.0__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 (226) hide show
  1. {memu_cli-0.4.0 → memu_cli-0.5.0}/INSTALL-LATEST.md +1 -1
  2. {memu_cli-0.4.0 → memu_cli-0.5.0}/PKG-INFO +47 -105
  3. memu_cli-0.5.0/README.md +145 -0
  4. {memu_cli-0.4.0 → memu_cli-0.5.0}/SKILL.md +4 -5
  5. memu_cli-0.5.0/assets/skill-extraction.png +0 -0
  6. memu_cli-0.5.0/assets/structure-v2.png +0 -0
  7. memu_cli-0.5.0/docs/adr/0012-cloud-backed-agentic-backend.md +108 -0
  8. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/README.md +1 -0
  9. {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/README.md +10 -1
  10. {memu_cli-0.4.0 → memu_cli-0.5.0}/pyproject.toml +1 -1
  11. memu_cli-0.5.0/src/memu/agentic_backend.py +31 -0
  12. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/agentic.py +26 -41
  13. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/cli.py +20 -22
  14. memu_cli-0.5.0/src/memu/cloud.py +286 -0
  15. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/__init__.py +0 -4
  16. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/__init__.py +0 -2
  17. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/models.py +2 -11
  18. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repo.py +1 -12
  19. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/__init__.py +0 -6
  20. memu_cli-0.5.0/src/memu/database/inmemory/repositories/recall_file_repo.py +100 -0
  21. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/interfaces.py +1 -6
  22. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/models.py +1 -10
  23. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/versions/20260703_0001_initial_schema.py +0 -22
  24. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/models.py +2 -15
  25. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/postgres.py +2 -18
  26. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/__init__.py +0 -2
  27. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/recall_file_repo.py +32 -32
  28. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/schema.py +0 -9
  29. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/__init__.py +0 -2
  30. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/recall_file.py +7 -7
  31. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/models.py +2 -13
  32. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/__init__.py +0 -2
  33. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/recall_file_repo.py +40 -40
  34. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/schema.py +2 -11
  35. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/sqlite.py +5 -21
  36. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/state.py +1 -3
  37. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/env.py +74 -7
  38. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/pipeline.py +6 -6
  39. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/recall_files.py +39 -3
  40. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/BRIDGING_TASK.md +55 -5
  41. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/INSTALL.md +43 -15
  42. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/UNINSTALL.md +9 -1
  43. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/cli.py +8 -0
  44. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/BRIDGING_TASK.md +16 -12
  45. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/INSTALL.md +44 -14
  46. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/UNINSTALL.md +9 -8
  47. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/cli.py +0 -3
  48. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/BRIDGING_TASK.md +10 -5
  49. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/INSTALL.md +46 -16
  50. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/BRIDGING_TASK.md +7 -3
  51. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/INSTALL.md +40 -8
  52. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/BRIDGING_TASK.md +9 -5
  53. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/INSTALL.md +45 -15
  54. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/host_cli.py +95 -9
  55. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/instruction.py +8 -5
  56. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/BRIDGING_TASK.md +9 -4
  57. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/INSTALL.md +46 -16
  58. memu_cli-0.5.0/src/memu/hosts/retrieval.py +131 -0
  59. memu_cli-0.5.0/src/memu/hosts/scheduling/__init__.py +18 -0
  60. memu_cli-0.5.0/src/memu/hosts/scheduling/prompt.py +54 -0
  61. memu_cli-0.5.0/src/memu/hosts/scheduling/windows.py +353 -0
  62. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/BRIDGING_TASK.md +10 -5
  63. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/INSTALL.md +43 -15
  64. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_agentic.py +54 -3
  65. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_bridging_promotion.py +2 -2
  66. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_cli.py +55 -0
  67. memu_cli-0.5.0/tests/test_cloud.py +339 -0
  68. memu_cli-0.5.0/tests/test_host_retrieval.py +102 -0
  69. memu_cli-0.5.0/tests/test_scheduling_windows.py +220 -0
  70. {memu_cli-0.4.0 → memu_cli-0.5.0}/uv.lock +2 -2
  71. memu_cli-0.4.0/README.md +0 -203
  72. memu_cli-0.4.0/assets/structure-v2.png +0 -0
  73. memu_cli-0.4.0/src/memu/database/inmemory/repositories/recall_file_repo.py +0 -94
  74. memu_cli-0.4.0/src/memu/database/inmemory/repositories/recall_file_resource_repo.py +0 -67
  75. memu_cli-0.4.0/src/memu/database/postgres/repositories/recall_file_resource_repo.py +0 -149
  76. memu_cli-0.4.0/src/memu/database/repositories/recall_file_resource.py +0 -33
  77. memu_cli-0.4.0/src/memu/database/sqlite/repositories/recall_file_resource_repo.py +0 -215
  78. memu_cli-0.4.0/src/memu/hosts/retrieval.py +0 -49
  79. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  80. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  81. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  82. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/hackathon_task.yml +0 -0
  83. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/improvement_suggestion.yml +0 -0
  84. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  85. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/build.yml +0 -0
  86. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/pr-title.yml +0 -0
  87. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/publish-memu-cli.yml +0 -0
  88. {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/release-please.yml +0 -0
  89. {memu_cli-0.4.0 → memu_cli-0.5.0}/.gitignore +0 -0
  90. {memu_cli-0.4.0 → memu_cli-0.5.0}/.pre-commit-config.yaml +0 -0
  91. {memu_cli-0.4.0 → memu_cli-0.5.0}/.python-version +0 -0
  92. {memu_cli-0.4.0 → memu_cli-0.5.0}/AGENTS.md +0 -0
  93. {memu_cli-0.4.0 → memu_cli-0.5.0}/CHANGELOG.md +0 -0
  94. {memu_cli-0.4.0 → memu_cli-0.5.0}/CONTRIBUTING.md +0 -0
  95. {memu_cli-0.4.0 → memu_cli-0.5.0}/Cargo.lock +0 -0
  96. {memu_cli-0.4.0 → memu_cli-0.5.0}/Cargo.toml +0 -0
  97. {memu_cli-0.4.0 → memu_cli-0.5.0}/LICENSE.txt +0 -0
  98. {memu_cli-0.4.0 → memu_cli-0.5.0}/MANIFEST.in +0 -0
  99. {memu_cli-0.4.0 → memu_cli-0.5.0}/Makefile +0 -0
  100. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/banner.png +0 -0
  101. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/benchmark.png +0 -0
  102. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/memUbot.png +0 -0
  103. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/memorize.png +0 -0
  104. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/Clawdchat.png +0 -0
  105. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/LazyLLM.png +0 -0
  106. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/buddie.png +0 -0
  107. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/bytebase.png +0 -0
  108. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/jazz.png +0 -0
  109. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/openagents.png +0 -0
  110. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/xroute.png +0 -0
  111. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/qrcode.png +0 -0
  112. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/retrieve.png +0 -0
  113. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/star.gif +0 -0
  114. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/structure.png +0 -0
  115. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_companion-0000.jpg +0 -0
  116. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_creation-0000.jpg +0 -0
  117. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_edu-0000.jpg +0 -0
  118. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_ip-0000.png +0 -0
  119. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_robot-0000.jpg +0 -0
  120. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_role_play-0000.jpg +0 -0
  121. {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_therapy-0000.jpg +0 -0
  122. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0001-workflow-pipeline-architecture.md +0 -0
  123. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0002-pluggable-storage-and-vector-strategy.md +0 -0
  124. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0003-user-scope-in-data-model.md +0 -0
  125. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0004-workspace-memorize-and-memory-file-system.md +0 -0
  126. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0005-dedicated-embedding-package.md +0 -0
  127. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0006-from-memory-item-category-to-tracked-workspace-memorization.md +0 -0
  128. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0007-three-independent-memory-lines-wiki-graph.md +0 -0
  129. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0008-two-integration-surfaces-hooks-and-api.md +0 -0
  130. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0009-codex-packaging-cli-and-config.md +0 -0
  131. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0010-multi-host-adapters.md +0 -0
  132. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0011-generic-host-adapter.md +0 -0
  133. {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/sqlite.md +0 -0
  134. {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/bin/memu.js +0 -0
  135. {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/package.json +0 -0
  136. {memu_cli-0.4.0 → memu_cli-0.5.0}/scripts/db.py +0 -0
  137. {memu_cli-0.4.0 → memu_cli-0.5.0}/setup.cfg +0 -0
  138. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/lib.rs +0 -0
  139. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/__init__.py +0 -0
  140. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/__main__.py +0 -0
  141. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/_core.pyi +0 -0
  142. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/__init__.py +0 -0
  143. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/client_pool.py +0 -0
  144. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/service.py +0 -0
  145. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/settings.py +0 -0
  146. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/factory.py +0 -0
  147. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/filter.py +0 -0
  148. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/recall_file_segment_repo.py +0 -0
  149. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/resource_repo.py +0 -0
  150. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/state.py +0 -0
  151. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/vector.py +0 -0
  152. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/__init__.py +0 -0
  153. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migration.py +0 -0
  154. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/__init__.py +0 -0
  155. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/env.py +0 -0
  156. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/script.py.mako +0 -0
  157. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/base.py +0 -0
  158. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/recall_file_segment_repo.py +0 -0
  159. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/resource_repo.py +0 -0
  160. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/session.py +0 -0
  161. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/recall_file_segment.py +0 -0
  162. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/resource.py +0 -0
  163. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/__init__.py +0 -0
  164. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/base.py +0 -0
  165. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/recall_file_segment_repo.py +0 -0
  166. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/resource_repo.py +0 -0
  167. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/session.py +0 -0
  168. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/__init__.py +0 -0
  169. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/__init__.py +0 -0
  170. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/base.py +0 -0
  171. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/doubao.py +0 -0
  172. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/jina.py +0 -0
  173. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/openai.py +0 -0
  174. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/openrouter.py +0 -0
  175. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/voyage.py +0 -0
  176. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/base.py +0 -0
  177. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/defaults.py +0 -0
  178. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/gateway.py +0 -0
  179. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/http_client.py +0 -0
  180. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/openai_sdk.py +0 -0
  181. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/__init__.py +0 -0
  182. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/base.py +0 -0
  183. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/__init__.py +0 -0
  184. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/instructions.py +0 -0
  185. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/layout.py +0 -0
  186. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/manifest.py +0 -0
  187. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/resources.py +0 -0
  188. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/transcripts.py +0 -0
  189. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/__init__.py +0 -0
  190. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/sessions.py +0 -0
  191. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/__init__.py +0 -0
  192. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/sessions.py +0 -0
  193. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/UNINSTALL.md +0 -0
  194. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/__init__.py +0 -0
  195. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/cli.py +0 -0
  196. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/sessions.py +0 -0
  197. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/UNINSTALL.md +0 -0
  198. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/__init__.py +0 -0
  199. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/cli.py +0 -0
  200. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/detect.py +0 -0
  201. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/sessions.py +0 -0
  202. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/UNINSTALL.md +0 -0
  203. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/__init__.py +0 -0
  204. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/cli.py +0 -0
  205. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/sessions.py +0 -0
  206. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/UNINSTALL.md +0 -0
  207. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/__init__.py +0 -0
  208. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/cli.py +0 -0
  209. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/sessions.py +0 -0
  210. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/UNINSTALL.md +0 -0
  211. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/__init__.py +0 -0
  212. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/cli.py +0 -0
  213. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/sessions.py +0 -0
  214. {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/vector.py +0 -0
  215. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/__init__.py +0 -0
  216. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/rust_entry_test.py +0 -0
  217. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_cli_stdio.py +0 -0
  218. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_doctor_proxy_hint.py +0 -0
  219. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_embedding.py +0 -0
  220. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_embedding_proxy.py +0 -0
  221. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_env_passthrough.py +0 -0
  222. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_generic.py +0 -0
  223. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_instruction.py +0 -0
  224. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_sessions.py +0 -0
  225. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_postgres_migration_config.py +0 -0
  226. {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_vector.py +0 -0
@@ -121,7 +121,7 @@ Then print your host's packaged guide and follow it to the letter:
121
121
  memu-<your-host> docs install
122
122
  ```
123
123
 
124
- It walks you through configuring the store in `~/.memu/config.env`, registering
124
+ It walks you through selecting the local or cloud backend in `~/.memu/config.env`, registering
125
125
  the scheduled bridging task, and patching your instruction file, each behind a
126
126
  verify gate.
127
127
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memu-cli
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Operating System :: OS Independent
@@ -32,7 +32,7 @@ Project-URL: Homepage, https://github.com/NevaMind-AI/MemU
32
32
 
33
33
  # memU
34
34
 
35
- ### Personal memory, stored as files
35
+ ### Personal memory, stored as Wiki
36
36
 
37
37
  **Across Sessions. Across Agents. Across Devices.**
38
38
 
@@ -48,90 +48,44 @@ Project-URL: Homepage, https://github.com/NevaMind-AI/MemU
48
48
 
49
49
  ---
50
50
 
51
- memU is a 500-line memory system for AI agents. Agents write what's worth keeping as Markdown; memU stores it, embeds it, and retrieves ranked context in a single call embeddings are the only model calls it makes. The entire memory logic lives in [`agentic.py`](src/memu/app/agentic.py) + [`service.py`](src/memu/app/service.py); everything else is pluggable storage and embedding transport.
52
-
53
- **Installation is agent-driven.** The guides are written for the agent, not for you. One message is the whole setup — tell your agent:
54
-
55
- > Read https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md and follow it to install memU.
56
-
57
- It works for Codex, Claude Code, Cursor, OpenClaw, Hermes, WorkBuddy — and any other agent, via detection. Details in [Host adapters](#host-adapters-memory-for-desktop-coding-agents).
58
-
59
- Want to follow the latest development instead? Install from the newest source (git `main`) — tell your agent:
60
-
61
- > Read https://raw.githubusercontent.com/NevaMind-AI/MemU/main/INSTALL-LATEST.md and follow it to install the latest memU.
51
+ memU is a lightweight, agent-driven memory system that gives users a shared LLM wiki across sessions, agents, and devices. It automatically distills your own reusable skills from your agent history. Its core memory logic is only 500 lines compact enough to inspect, understand, and adapt.
62
52
 
63
53
  ## Quick start
64
54
 
65
- ```python
66
- from memu.app import MemoryService
55
+ memU works with Codex, Claude Code, Cursor, OpenClaw, Hermes, WorkBuddy, and more. See [Host adapters](#host-adapters-memory-for-desktop-coding-agents).
67
56
 
68
- service = MemoryService(
69
- database_config={"metadata_store": {"provider": "sqlite", "dsn": "sqlite:///memu.sqlite3"}},
70
- )
57
+ Choose Cloud or Local, then send the corresponding message to your agent.
71
58
 
72
- # 1. Persist agent-prepared memory: recall files (memory/skill tracks) + resources
73
- await service.commit_results(
74
- recall_files=[
75
- {
76
- "name": "Profile",
77
- "track": "memory",
78
- "description": "who the user is",
79
- "content": "# Profile\n- prefers dark roast coffee\n- ships on Fridays",
80
- },
81
- {
82
- "name": "deploy-checklist",
83
- "track": "skill",
84
- "description": "how to deploy this repo",
85
- "content": "1. run tests\n2. tag\n3. push",
86
- },
87
- ],
88
- resource=[{"path": "/abs/path/notes.md", "description": "meeting notes from the launch review"}],
89
- )
59
+ ### Cloud (coming soon)
90
60
 
91
- # 2. See what is stored, across every track
92
- files = await service.list_all_recall_files()
61
+ **Cross-device · Free · Unlimited · [View online](https://memu.so)**
93
62
 
94
- # 3. Single-shot embedding retrieval over segments / files / resources
95
- context = await service.progressive_retrieve("What should I know about this user's launch preferences?")
96
- ```
63
+ > Read [https://memu.pro/SKILL.md](https://memu.pro/SKILL.md) and follow it to install memU.
97
64
 
98
- Or straight from the terminal — no code:
65
+ ### Local / self-hosted
99
66
 
100
- ```bash
101
- export OPENAI_API_KEY=sk-... # embedding API key — the only model calls memU makes
67
+ **Private · Single-device · Embedding key required**
102
68
 
103
- npx memu-cli commit results.json # {"recall_files": [...], "resource": [...]}
104
- npx memu-cli list-files
105
- npx memu-cli retrieve "What should I know about this user's launch preferences?"
106
- ```
107
-
108
- State persists in a local SQLite database (`./data/memu.sqlite3` by default), so commit in one invocation and retrieve in the next.
69
+ > Read [https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md](https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md) and follow it to install memU.
109
70
 
110
71
  ## How it works
111
72
 
112
73
  ![memU memory system architecture](assets/structure-v2.png)
113
74
 
114
- ### The data model
115
-
116
- Memory is a set of **recall files** — one Markdown document per topic (`track="memory"`) or per learned skill (`track="skill"`). Committing a file also writes its search index:
117
-
118
- | Record | What it is | How it's embedded |
119
- |---|---|---|
120
- | **RecallFile** | The Markdown document itself (`name`, `track`, `description`, `content`) | `name: description`, once at creation |
121
- | **RecallFileSegment** | Searchable slices of a file | memory track: one per content line (headings skipped); skill track: one `name: description` segment per skill |
122
- | **Resource** | A raw source on disk (`url`, `caption`) | its one-line caption |
123
-
124
- Segments are reconciled on every commit: lines that disappeared are deleted, only genuinely new lines are embedded, unchanged lines keep their vectors — so re-committing a lightly edited file is nearly free.
75
+ ## Automatic skill extraction
125
76
 
126
- ### Retrieval
77
+ Once the scheduled bridging task is installed, memU can turn useful agent history into reusable Markdown skills automatically.
127
78
 
128
- `progressive_retrieve(query)` embeds the query **once** and returns three ranked layers:
79
+ ![How memU turns agent history into reusable skills](assets/skill-extraction.png)
129
80
 
130
- - `segments` the matched slices, narrowest and usually most on-point, each with a `score`
131
- - `files` the documents those segments belong to (usually what you want), each scored by its best segment and carrying its linked `resource_urls`
132
- - `resources` matching raw sources, for when summaries are not enough
81
+ 1. **Capture new sessions.** The host adapter reads new session history, including messages and tool calls.
82
+ 2. **Prepare self-evolve jobs.** `prepare` slices each session into a self-contained job with the paths and context the agent needs.
83
+ 3. **Let the agent decide.** The agent reads related existing skills, then chooses to do nothing, patch an existing skill, or create a new one.
84
+ 4. **Write readable skill Markdown.** Each skill has a name, description, and reusable workflow, including useful branches, edge cases, and pitfalls.
85
+ 5. **Commit and index.** `commit` submits changed skill files through `commit_results`; memU embeds the skill name and description and stores it under the `skill` track.
86
+ 6. **Retrieve it later.** On a similar future task, memU returns the relevant skill so any connected agent can use the learned workflow.
133
87
 
134
- There is no intention routing, sufficiency checking, or summarization one embedding call in, ranked context out.
88
+ The judgment and synthesis stay inside the agent. `MemoryService` makes no LLM or chat calls; it stores, embeds, and retrieves the skill Markdown the agent prepared.
135
89
 
136
90
  ## Host adapters: memory for desktop coding agents
137
91
 
@@ -152,15 +106,28 @@ memU runs as a sidecar to a desktop agent (ADR 0008/0009/0010), one binary per h
152
106
 
153
107
  For agents without a dedicated binary, `memu-agent detect` probes the machine and reports per agent whether **memorization** works (a recognizable session log exists) and whether **retrieval** works (an instruction file exists to patch) — then the same verbs run against what it found.
154
108
 
155
- All hosts share one store and one embedding space via `~/.memu/config.env` — what one host's sessions taught memU, another host retrieves.
109
+ All hosts share one configured memory backend via `~/.memu/config.env` — local
110
+ or MemU Cloud. What one host's sessions taught memU, another host retrieves.
111
+
112
+ Installation is the one-message setup at the top of this README. [SKILL.md](SKILL.md) is the routing skill it hands your agent: install the package, identify which host you are (falling back to `memu-agent detect` for anything without a dedicated adapter), print that host's packaged install guide (`<binary> docs install`), and follow it — configure the memory backend, register the scheduled bridging task, patch the instruction file, each step behind a verify gate — then report which seams (memorization / retrieval) are now active.
113
+
114
+ Afterwards `<binary> doctor` proves the whole loop resolves: config, selected
115
+ mode, and a live retrieval.
116
+
117
+ Adding another host means implementing one `TranscriptSource` (where its session logs live, how its records are shaped) plus a `HostSpec`-sized CLI — the pipeline, verbs, and instruction text are shared.
118
+
119
+ ## CLI
156
120
 
157
- Installation is the one-message setup at the top of this README. [SKILL.md](SKILL.md) is the routing skill it hands your agent: install the package, identify which host you are (falling back to `memu-agent detect` for anything without a dedicated adapter), print that host's packaged install guide (`<binary> docs install`), and follow it configure the store, register the scheduled bridging task, patch the instruction file, each step behind a verify gate — then report which seams (memorization / retrieval) are now active.
121
+ With memU Cloud, sign in at [memu.so](https://memu.so) to view your memory files. With a local installation, memory lives in the shared store configured by `MEMU_DB` in `~/.memu/config.env` — typically `~/.memu/memu.sqlite3` for local SQLite, or a Postgres DSN.
158
122
 
159
- Afterwards `<binary> doctor` proves the whole loop resolves: config, store, and a live retrieval.
123
+ Once installed, your agent retrieves relevant memory automatically before answering. To retrieve manually, run the adapter for your host:
160
124
 
161
- Adding another host means implementing one `TranscriptSource` (where its session logs live, how its records are shaped) plus a `HostSpec`-sized CLI — the pipeline, verbs, and instruction text are shared (ADR 0010).
125
+ ```bash
126
+ memu-codex retrieve "What should I remember about this project?"
127
+ # or: memu-claude-code / memu-cursor / memu-openclaw / memu-hermes / memu-workbuddy / memu-agent
128
+ ```
162
129
 
163
- ## Installation
130
+ Install or invoke the CLI directly:
164
131
 
165
132
  ```bash
166
133
  pip install memu-cli # library + memu + memu-codex CLIs
@@ -170,7 +137,11 @@ uvx --from memu-cli memu # CLI via uv, no install
170
137
 
171
138
  ## Configuration
172
139
 
173
- Values resolve in order: process env → `~/.memu/config.env` → default. Every CLI flag has a matching variable:
140
+ Values resolve in order: process env → `~/.memu/config.env` → default. memU
141
+ supports Local and Cloud memory backends, selected by `MEMU_MEMORY_MODE`; an
142
+ unset mode remains Local for backward compatibility.
143
+
144
+ For Local / self-hosted installations, every CLI flag has a matching variable:
174
145
 
175
146
  | Setting | Env var | Default |
176
147
  |---|---|---|
@@ -180,6 +151,9 @@ Values resolve in order: process env → `~/.memu/config.env` → default. Every
180
151
  | Embedding model | `MEMU_EMBED_MODEL` | the provider's default |
181
152
  | Base URL | `MEMU_BASE_URL` | the provider's default |
182
153
 
154
+ Run `<binary> doctor` to display the resolved mode and verify the same retrieval
155
+ path the host uses.
156
+
183
157
  ### Storage backends
184
158
 
185
159
  | Provider | DSN | Vector search | Use for |
@@ -194,38 +168,6 @@ service = MemoryService(
194
168
  embedding_profiles={"default": {"provider": "jina"}},
195
169
  )
196
170
  ```
197
-
198
- ### Multi-tenancy
199
-
200
- Every record carries optional scope fields (`user_id`, `agent_id` by default). Pass `user=` on writes and `where=` on reads to partition one store:
201
-
202
- ```python
203
- await service.commit_results(recall_files=[...], user={"user_id": "alice"})
204
- await service.progressive_retrieve("launch preferences", where={"user_id": "alice"})
205
- ```
206
-
207
- Need different scope fields? Supply your own model — filters are validated against it, unknown fields raise:
208
-
209
- ```python
210
- from pydantic import BaseModel
211
-
212
- class TeamScope(BaseModel):
213
- team_id: str | None = None
214
- user_id: str | None = None
215
-
216
- service = MemoryService(user_config={"model": TeamScope})
217
- ```
218
-
219
- ## Development
220
-
221
- ```bash
222
- make install # uv sync + pre-commit hooks
223
- make test # pytest with coverage
224
- make check # lock check, pre-commit, mypy, deptry
225
- ```
226
-
227
- Architecture decisions live in [`docs/adr/`](docs/adr/) — notably tracked workspace memorization (ADR 0006), the segment/file/resource retrieval lines (ADR 0007), and the host-adapter seams (ADR 0008/0009).
228
-
229
171
  ## License
230
172
 
231
173
  Apache-2.0
@@ -0,0 +1,145 @@
1
+ ![memU Banner](assets/banner.png)
2
+
3
+ <div align="center">
4
+
5
+ # memU
6
+
7
+ ### Personal memory, stored as Wiki
8
+
9
+ **Across Sessions. Across Agents. Across Devices.**
10
+
11
+ [![PyPI version](https://badge.fury.io/py/memu-cli.svg)](https://badge.fury.io/py/memu-cli)
12
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
+ [![Python 3.13+](https://img.shields.io/badge/python-3.13+-blue.svg)](https://www.python.org/downloads/)
14
+ [![Discord](https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord&logoColor=white)](https://discord.com/invite/hQZntfGsbJ)
15
+ [![Twitter](https://img.shields.io/badge/Twitter-Follow-1DA1F2?logo=x&logoColor=white)](https://x.com/memU_ai)
16
+
17
+ <a href="https://trendshift.io/repositories/17374" target="_blank"><img src="https://trendshift.io/api/badge/repositories/17374" alt="NevaMind-AI%2FmemU | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ memU is a lightweight, agent-driven memory system that gives users a shared LLM wiki across sessions, agents, and devices. It automatically distills your own reusable skills from your agent history. Its core memory logic is only 500 lines — compact enough to inspect, understand, and adapt.
24
+
25
+ ## Quick start
26
+
27
+ memU works with Codex, Claude Code, Cursor, OpenClaw, Hermes, WorkBuddy, and more. See [Host adapters](#host-adapters-memory-for-desktop-coding-agents).
28
+
29
+ Choose Cloud or Local, then send the corresponding message to your agent.
30
+
31
+ ### Cloud (coming soon)
32
+
33
+ **Cross-device · Free · Unlimited · [View online](https://memu.so)**
34
+
35
+ > Read [https://memu.pro/SKILL.md](https://memu.pro/SKILL.md) and follow it to install memU.
36
+
37
+ ### Local / self-hosted
38
+
39
+ **Private · Single-device · Embedding key required**
40
+
41
+ > Read [https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md](https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md) and follow it to install memU.
42
+
43
+ ## How it works
44
+
45
+ ![memU memory system architecture](assets/structure-v2.png)
46
+
47
+ ## Automatic skill extraction
48
+
49
+ Once the scheduled bridging task is installed, memU can turn useful agent history into reusable Markdown skills automatically.
50
+
51
+ ![How memU turns agent history into reusable skills](assets/skill-extraction.png)
52
+
53
+ 1. **Capture new sessions.** The host adapter reads new session history, including messages and tool calls.
54
+ 2. **Prepare self-evolve jobs.** `prepare` slices each session into a self-contained job with the paths and context the agent needs.
55
+ 3. **Let the agent decide.** The agent reads related existing skills, then chooses to do nothing, patch an existing skill, or create a new one.
56
+ 4. **Write readable skill Markdown.** Each skill has a name, description, and reusable workflow, including useful branches, edge cases, and pitfalls.
57
+ 5. **Commit and index.** `commit` submits changed skill files through `commit_results`; memU embeds the skill name and description and stores it under the `skill` track.
58
+ 6. **Retrieve it later.** On a similar future task, memU returns the relevant skill so any connected agent can use the learned workflow.
59
+
60
+ The judgment and synthesis stay inside the agent. `MemoryService` makes no LLM or chat calls; it stores, embeds, and retrieves the skill Markdown the agent prepared.
61
+
62
+ ## Host adapters: memory for desktop coding agents
63
+
64
+ memU runs as a sidecar to a desktop agent (ADR 0008/0009/0010), one binary per host. Each binds two seams:
65
+
66
+ - **record** — a scheduled bridging task slices new session logs into self-contained job files; the agent itself distills them into memory/skill Markdown; `commit` submits whatever the agent left on disk back through `commit_results`.
67
+ - **inject** — a standing instruction in the host's instruction file tells the agent to run `<binary> retrieve` (→ `progressive_retrieve`) before answering.
68
+
69
+ | Host | Binary | Session log it mines | Instruction file it patches |
70
+ | --- | --- | --- | --- |
71
+ | Codex | `memu-codex` | `~/.codex/sessions/**/*.jsonl` | `~/.codex/AGENTS.md` |
72
+ | Claude Code | `memu-claude-code` | `~/.claude/projects/<project>/<session>.jsonl` | `~/.claude/CLAUDE.md` |
73
+ | Cursor (Agent/CLI) | `memu-cursor` | `~/.cursor/projects/<project>/agent-transcripts/**.jsonl` | `./AGENTS.md` (per project) |
74
+ | OpenClaw | `memu-openclaw` | `~/.openclaw/agents/<agentId>/sessions/*.jsonl` | `~/.openclaw/workspace/AGENTS.md` |
75
+ | Hermes Agent | `memu-hermes` | `~/.hermes/state.db` (SQLite, read-only) | `~/.hermes/SOUL.md` |
76
+ | WorkBuddy | `memu-workbuddy` | `~/.workbuddy/projects/<project>/<session>.jsonl` | `~/.workbuddy/MEMORY.md` |
77
+ | **any other agent** | `memu-agent` | found by `memu-agent detect` (JSONL dialect sniffed) | found by `detect` (AGENTS.md / CLAUDE.md / SOUL.md / …) |
78
+
79
+ For agents without a dedicated binary, `memu-agent detect` probes the machine and reports per agent whether **memorization** works (a recognizable session log exists) and whether **retrieval** works (an instruction file exists to patch) — then the same verbs run against what it found.
80
+
81
+ All hosts share one configured memory backend via `~/.memu/config.env` — local
82
+ or MemU Cloud. What one host's sessions taught memU, another host retrieves.
83
+
84
+ Installation is the one-message setup at the top of this README. [SKILL.md](SKILL.md) is the routing skill it hands your agent: install the package, identify which host you are (falling back to `memu-agent detect` for anything without a dedicated adapter), print that host's packaged install guide (`<binary> docs install`), and follow it — configure the memory backend, register the scheduled bridging task, patch the instruction file, each step behind a verify gate — then report which seams (memorization / retrieval) are now active.
85
+
86
+ Afterwards `<binary> doctor` proves the whole loop resolves: config, selected
87
+ mode, and a live retrieval.
88
+
89
+ Adding another host means implementing one `TranscriptSource` (where its session logs live, how its records are shaped) plus a `HostSpec`-sized CLI — the pipeline, verbs, and instruction text are shared.
90
+
91
+ ## CLI
92
+
93
+ With memU Cloud, sign in at [memu.so](https://memu.so) to view your memory files. With a local installation, memory lives in the shared store configured by `MEMU_DB` in `~/.memu/config.env` — typically `~/.memu/memu.sqlite3` for local SQLite, or a Postgres DSN.
94
+
95
+ Once installed, your agent retrieves relevant memory automatically before answering. To retrieve manually, run the adapter for your host:
96
+
97
+ ```bash
98
+ memu-codex retrieve "What should I remember about this project?"
99
+ # or: memu-claude-code / memu-cursor / memu-openclaw / memu-hermes / memu-workbuddy / memu-agent
100
+ ```
101
+
102
+ Install or invoke the CLI directly:
103
+
104
+ ```bash
105
+ pip install memu-cli # library + memu + memu-codex CLIs
106
+ npx memu-cli --help # CLI via npm launcher (engine: PyPI package memu-cli)
107
+ uvx --from memu-cli memu # CLI via uv, no install
108
+ ```
109
+
110
+ ## Configuration
111
+
112
+ Values resolve in order: process env → `~/.memu/config.env` → default. memU
113
+ supports Local and Cloud memory backends, selected by `MEMU_MEMORY_MODE`; an
114
+ unset mode remains Local for backward compatibility.
115
+
116
+ For Local / self-hosted installations, every CLI flag has a matching variable:
117
+
118
+ | Setting | Env var | Default |
119
+ |---|---|---|
120
+ | Store | `MEMU_DB` | `./data/memu.sqlite3` (CLI); **required** for host adapters |
121
+ | Embedding provider | `MEMU_EMBED_PROVIDER` | `openai` (also: `jina`, `voyage`, `doubao`, `openrouter`); legacy `MEMU_LLM_PROVIDER` still read |
122
+ | API key | `MEMU_API_KEY` | the provider's env var, e.g. `OPENAI_API_KEY` |
123
+ | Embedding model | `MEMU_EMBED_MODEL` | the provider's default |
124
+ | Base URL | `MEMU_BASE_URL` | the provider's default |
125
+
126
+ Run `<binary> doctor` to display the resolved mode and verify the same retrieval
127
+ path the host uses.
128
+
129
+ ### Storage backends
130
+
131
+ | Provider | DSN | Vector search | Use for |
132
+ |---|---|---|---|
133
+ | `inmemory` | — | brute-force cosine | tests, throwaway sessions |
134
+ | `sqlite` | `sqlite:///path.sqlite3` | brute-force cosine | local/default, single writer |
135
+ | `postgres` | `postgresql://...` | pgvector | concurrent access, large stores (`pip install "memu-cli[postgres]"`) |
136
+
137
+ ```python
138
+ service = MemoryService(
139
+ database_config={"metadata_store": {"provider": "postgres", "dsn": "postgresql://..."}},
140
+ embedding_profiles={"default": {"provider": "jina"}},
141
+ )
142
+ ```
143
+ ## License
144
+
145
+ Apache-2.0
@@ -62,16 +62,15 @@ binary if your host turns out to have one.
62
62
  ```
63
63
 
64
64
  Read what it prints, top to bottom, and follow it exactly. Every guide has the
65
- same shape — configure the store once in `~/.memu/config.env`, register the
65
+ same shape — select the local or cloud backend once in `~/.memu/config.env`, register the
66
66
  scheduled bridging task (record), patch your instruction file (inject) — and
67
67
  every part ends with a **verify gate**; do not proceed past a failing one.
68
68
 
69
69
  Two rules that hold for every host:
70
70
 
71
- - **One store.** If `~/.memu/config.env` already exists (another agent on this
72
- machine is already integrated), reuse it as is. A second store would split
73
- the embedding space and both installs would silently retrieve nothing from
74
- each other.
71
+ - **One backend.** If `~/.memu/config.env` already exists (another agent on this
72
+ machine is already integrated), reuse it as is. A second mode or local store
73
+ would split record and retrieval so the two installs no longer share memory.
75
74
  - **Report the outcome.** When done, tell the user which seams are now active —
76
75
  memorization, retrieval, or both — and where (the session log being mined,
77
76
  the instruction file patched). For `memu-agent`, the detect report decides
Binary file
@@ -0,0 +1,108 @@
1
+ ADR 0012: Cloud-Backed Memory Behind the Existing CLI
2
+
3
+ - Status: Accepted
4
+ - Date: 2026-07-24
5
+ - Builds on: ADR 0008 (two host seams), ADR 0009 (one CLI/config surface)
6
+ - Scope: selecting local or hosted execution for the three agentic memory
7
+ operations. It does not change `MemoryService`, storage repositories, or the
8
+ host command surface.
9
+
10
+ ## Context
11
+
12
+ Every `memu` and `memu-<host>` operation currently constructs a local
13
+ `MemoryService`. That requires a local database plus an embedding provider even
14
+ when the hosted memU service already exposes the same three operations over its
15
+ API-key-authenticated v4 API.
16
+
17
+ Creating separate cloud binaries would duplicate every host command, retrieval
18
+ instruction, scheduled task, and installation path. Adding HTTP behavior to
19
+ `MemoryService` would instead turn the local composition root into two unrelated
20
+ runtime roles and weaken its embedding-only, storage-pluggable boundary.
21
+
22
+ ## Decision
23
+
24
+ ### One structural capability boundary
25
+
26
+ `AgenticMemoryBackend` is a structural protocol containing exactly
27
+ `list_all_recall_files`, `progressive_retrieve`, and `commit_results`.
28
+ `MemoryService` already satisfies it and remains the local in-process
29
+ implementation. `CloudMemoryClient` implements it by forwarding requests to:
30
+
31
+ - `GET /api/v4/memory/`
32
+ - `POST /api/v4/memory/search`
33
+ - `POST /api/v4/memory/`
34
+
35
+ The cloud client returns successful response dictionaries unchanged. It owns
36
+ Bearer authentication, explicit timeouts, structured cloud errors, and bounded
37
+ retries for transient failures. None of those concerns enter `memu.app`.
38
+
39
+ ### One selector for every caller
40
+
41
+ `build_agentic_memory_backend_from_env()` is the only backend selector used by
42
+ the main CLI, host retrieval, bridging prepare/commit, and doctor.
43
+ `MEMU_MEMORY_MODE` accepts `local` or `cloud`; absent means `local`, preserving
44
+ existing installs.
45
+
46
+ Cloud configuration is separate from local embedding configuration:
47
+
48
+ ```env
49
+ MEMU_MEMORY_MODE=cloud
50
+ MEMU_CLOUD_API_KEY=<memu-api-key>
51
+ MEMU_CLOUD_BASE_URL=https://api.memu.so/api/v4/memory/
52
+ ```
53
+
54
+ The base URL has the production value above as its default and remains
55
+ overridable for compatible deployments. Users obtain a memU API key by
56
+ registering at [memu.so](https://memu.so). `MEMU_BASE_URL` and `MEMU_API_KEY`
57
+ keep their existing local-embedding meaning.
58
+
59
+ The main `memu` CLI retains its local database/embedding flags. They are passed
60
+ as local-mode overrides to the shared selector; cloud mode does not construct a
61
+ local store as a side effect.
62
+
63
+ ### Explicit default owner scope
64
+
65
+ Cloud requests always send both `user_id` and `agent_id`. Missing, blank, or
66
+ `None` values become the literal `default`. Cloud reads accept only exact
67
+ `user_id` and `agent_id` filters because the public API cannot represent local
68
+ repository operators such as `user_id__in`; unsupported filters fail rather
69
+ than silently widening scope.
70
+
71
+ ### Resource compatibility is visible, not forked
72
+
73
+ The bridging pipeline remains identical in both modes: it prepares resource
74
+ work and submits `commit_results.resource`. The current cloud API accepts that
75
+ field for wire compatibility but returns an empty `resources` list because it
76
+ does not persist workspace resources yet. Doctor and installation documentation
77
+ state this limitation explicitly; memory and skill recall files are durable.
78
+
79
+ ## Consequences
80
+
81
+ Positive:
82
+
83
+ - Existing agent commands, scheduled tasks, and retrieval instructions work in
84
+ either mode without rewrites.
85
+ - `MemoryService` keeps its three-method public surface and remains free of HTTP
86
+ and authentication behavior.
87
+ - Cloud credentials cannot be confused with embedding-provider credentials.
88
+ - An old config with no mode keeps its local database and embedding space.
89
+
90
+ Costs:
91
+
92
+ - The cloud client has a deliberately narrower `where` vocabulary than a custom
93
+ local `UserConfig.model`.
94
+ - Resource-description jobs still run in cloud mode even though the service
95
+ currently does not persist their output. This preserves one bridging
96
+ pipeline at the cost of temporary redundant work.
97
+ - The project API key may be stored as plaintext in `~/.memu/config.env`; guides
98
+ require user-only file permissions and process-environment overrides remain
99
+ available.
100
+
101
+ ## Out of scope
102
+
103
+ - Dashboard cookie/CSRF APIs
104
+ - OAuth, browser login, or OS keychain integration
105
+ - Local-to-cloud memory migration
106
+ - Cloud resource persistence
107
+ - New CLI binaries
108
+ - Storage protocol, backend, or migration changes
@@ -11,3 +11,4 @@
11
11
  - [0009: Packaging the Codex Integration — pip, a CLI Seam, and One Config Loader](0009-codex-packaging-cli-and-config.md)
12
12
  - [0010: Multi-Host Adapters — Claude Code, Cursor, OpenClaw, and Hermes](0010-multi-host-adapters.md)
13
13
  - [0011: A Generic Host Adapter — Detect First, Then Bind What Works](0011-generic-host-adapter.md)
14
+ - [0012: Cloud-Backed Memory Behind the Existing CLI](0012-cloud-backed-agentic-backend.md)
@@ -26,7 +26,16 @@ npx memu-cli list-files
26
26
  npx memu-cli retrieve "deploy checklist"
27
27
  ```
28
28
 
29
- State persists in a local SQLite database (`./data/memu.sqlite3` by default), so commit in one invocation and retrieve in the next. Every flag has a `MEMU_*` environment variable (`--provider`/`MEMU_EMBED_PROVIDER`, `--embed-model`/`MEMU_EMBED_MODEL`, `--db`/`MEMU_DB`, ...) — run `npx memu-cli <command> --help` for the full list.
29
+ By default, state persists in a local SQLite database
30
+ (`./data/memu.sqlite3`). Set `MEMU_MEMORY_MODE=cloud` and
31
+ `MEMU_CLOUD_API_KEY=<memu-api-key>` to run the same commands through MemU Cloud
32
+ instead. Register at [memu.so](https://memu.so) to obtain a memU API key. The
33
+ production API base defaults to `https://api.memu.so/api/v4/memory/` and can be
34
+ overridden with `MEMU_CLOUD_BASE_URL` for compatible deployments. Local
35
+ embedding settings remain separate (`MEMU_EMBED_PROVIDER`, `MEMU_EMBED_MODEL`,
36
+ `MEMU_DB`, ...). Cloud currently persists memory and skill recall files but not
37
+ submitted workspace resources. Run `npx memu-cli <command> --help` for the
38
+ local-mode flags.
30
39
 
31
40
  ## Commands
32
41
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "memu-cli"
3
- version = "0.4.0"
3
+ version = "0.5.0"
4
4
  authors = [
5
5
  {name = "MemU Team", email = "contact@nevamind.ai"},
6
6
  ]
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Protocol
4
+
5
+
6
+ class AgenticMemoryBackend(Protocol):
7
+ """The three memory capabilities consumed by CLIs and host adapters.
8
+
9
+ ``MemoryService`` satisfies this protocol structurally for local execution.
10
+ Remote implementations can provide the same surface without adding transport
11
+ concerns to the local service composition root.
12
+ """
13
+
14
+ async def list_all_recall_files(
15
+ self,
16
+ where: dict[str, Any] | None = None,
17
+ ) -> dict[str, Any]: ...
18
+
19
+ async def progressive_retrieve(
20
+ self,
21
+ query: str,
22
+ where: dict[str, Any] | None = None,
23
+ ) -> dict[str, Any]: ...
24
+
25
+ async def commit_results(
26
+ self,
27
+ *,
28
+ recall_files: list[dict[str, Any]] | None = None,
29
+ resource: list[dict[str, Any]] | None = None,
30
+ user: dict[str, Any] | None = None,
31
+ ) -> dict[str, Any]: ...