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.
- {memu_cli-0.4.0 → memu_cli-0.5.0}/INSTALL-LATEST.md +1 -1
- {memu_cli-0.4.0 → memu_cli-0.5.0}/PKG-INFO +47 -105
- memu_cli-0.5.0/README.md +145 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/SKILL.md +4 -5
- memu_cli-0.5.0/assets/skill-extraction.png +0 -0
- memu_cli-0.5.0/assets/structure-v2.png +0 -0
- memu_cli-0.5.0/docs/adr/0012-cloud-backed-agentic-backend.md +108 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/README.md +1 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/README.md +10 -1
- {memu_cli-0.4.0 → memu_cli-0.5.0}/pyproject.toml +1 -1
- memu_cli-0.5.0/src/memu/agentic_backend.py +31 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/agentic.py +26 -41
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/cli.py +20 -22
- memu_cli-0.5.0/src/memu/cloud.py +286 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/__init__.py +0 -4
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/__init__.py +0 -2
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/models.py +2 -11
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repo.py +1 -12
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/__init__.py +0 -6
- memu_cli-0.5.0/src/memu/database/inmemory/repositories/recall_file_repo.py +100 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/interfaces.py +1 -6
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/models.py +1 -10
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/versions/20260703_0001_initial_schema.py +0 -22
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/models.py +2 -15
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/postgres.py +2 -18
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/__init__.py +0 -2
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/recall_file_repo.py +32 -32
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/schema.py +0 -9
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/__init__.py +0 -2
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/recall_file.py +7 -7
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/models.py +2 -13
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/__init__.py +0 -2
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/recall_file_repo.py +40 -40
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/schema.py +2 -11
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/sqlite.py +5 -21
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/state.py +1 -3
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/env.py +74 -7
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/pipeline.py +6 -6
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/recall_files.py +39 -3
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/BRIDGING_TASK.md +55 -5
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/INSTALL.md +43 -15
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/UNINSTALL.md +9 -1
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/cli.py +8 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/BRIDGING_TASK.md +16 -12
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/INSTALL.md +44 -14
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/UNINSTALL.md +9 -8
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/cli.py +0 -3
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/BRIDGING_TASK.md +10 -5
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/INSTALL.md +46 -16
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/BRIDGING_TASK.md +7 -3
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/INSTALL.md +40 -8
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/BRIDGING_TASK.md +9 -5
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/INSTALL.md +45 -15
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/host_cli.py +95 -9
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/instruction.py +8 -5
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/BRIDGING_TASK.md +9 -4
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/INSTALL.md +46 -16
- memu_cli-0.5.0/src/memu/hosts/retrieval.py +131 -0
- memu_cli-0.5.0/src/memu/hosts/scheduling/__init__.py +18 -0
- memu_cli-0.5.0/src/memu/hosts/scheduling/prompt.py +54 -0
- memu_cli-0.5.0/src/memu/hosts/scheduling/windows.py +353 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/BRIDGING_TASK.md +10 -5
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/INSTALL.md +43 -15
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_agentic.py +54 -3
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_bridging_promotion.py +2 -2
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_cli.py +55 -0
- memu_cli-0.5.0/tests/test_cloud.py +339 -0
- memu_cli-0.5.0/tests/test_host_retrieval.py +102 -0
- memu_cli-0.5.0/tests/test_scheduling_windows.py +220 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/uv.lock +2 -2
- memu_cli-0.4.0/README.md +0 -203
- memu_cli-0.4.0/assets/structure-v2.png +0 -0
- memu_cli-0.4.0/src/memu/database/inmemory/repositories/recall_file_repo.py +0 -94
- memu_cli-0.4.0/src/memu/database/inmemory/repositories/recall_file_resource_repo.py +0 -67
- memu_cli-0.4.0/src/memu/database/postgres/repositories/recall_file_resource_repo.py +0 -149
- memu_cli-0.4.0/src/memu/database/repositories/recall_file_resource.py +0 -33
- memu_cli-0.4.0/src/memu/database/sqlite/repositories/recall_file_resource_repo.py +0 -215
- memu_cli-0.4.0/src/memu/hosts/retrieval.py +0 -49
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/hackathon_task.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/ISSUE_TEMPLATE/improvement_suggestion.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/build.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/pr-title.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/publish-memu-cli.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.github/workflows/release-please.yml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.gitignore +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.pre-commit-config.yaml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/.python-version +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/AGENTS.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/CHANGELOG.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/CONTRIBUTING.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/Cargo.lock +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/Cargo.toml +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/LICENSE.txt +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/MANIFEST.in +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/Makefile +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/banner.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/benchmark.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/memUbot.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/memorize.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/Clawdchat.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/LazyLLM.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/buddie.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/bytebase.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/jazz.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/openagents.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/partners/xroute.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/qrcode.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/retrieve.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/star.gif +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/structure.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_companion-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_creation-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_edu-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_ip-0000.png +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_robot-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_role_play-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/assets/usecase/ai_therapy-0000.jpg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0001-workflow-pipeline-architecture.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0002-pluggable-storage-and-vector-strategy.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0003-user-scope-in-data-model.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0004-workspace-memorize-and-memory-file-system.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0005-dedicated-embedding-package.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0006-from-memory-item-category-to-tracked-workspace-memorization.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0007-three-independent-memory-lines-wiki-graph.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0008-two-integration-surfaces-hooks-and-api.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0009-codex-packaging-cli-and-config.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0010-multi-host-adapters.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/adr/0011-generic-host-adapter.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/docs/sqlite.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/bin/memu.js +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/npm/package.json +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/scripts/db.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/setup.cfg +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/lib.rs +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/__main__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/_core.pyi +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/client_pool.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/service.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/app/settings.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/factory.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/filter.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/recall_file_segment_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/repositories/resource_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/state.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/inmemory/vector.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migration.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/env.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/migrations/script.py.mako +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/base.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/recall_file_segment_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/repositories/resource_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/postgres/session.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/recall_file_segment.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/repositories/resource.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/base.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/recall_file_segment_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/repositories/resource_repo.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/database/sqlite/session.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/base.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/doubao.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/jina.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/openai.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/openrouter.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/backends/voyage.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/base.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/defaults.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/gateway.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/http_client.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/embedding/openai_sdk.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/base.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/instructions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/layout.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/manifest.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/resources.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/bridging/transcripts.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/claude_code/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/codex/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/UNINSTALL.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/cli.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/cursor/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/UNINSTALL.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/cli.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/detect.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/generic/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/UNINSTALL.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/cli.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/hermes/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/UNINSTALL.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/cli.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/openclaw/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/UNINSTALL.md +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/cli.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/hosts/workbuddy/sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/src/memu/vector.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/__init__.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/rust_entry_test.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_cli_stdio.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_doctor_proxy_hint.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_embedding.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_embedding_proxy.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_env_passthrough.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_generic.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_instruction.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_host_sessions.py +0 -0
- {memu_cli-0.4.0 → memu_cli-0.5.0}/tests/test_postgres_migration_config.py +0 -0
- {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
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
92
|
-
files = await service.list_all_recall_files()
|
|
61
|
+
**Cross-device · Free · Unlimited · [View online](https://memu.so)**
|
|
93
62
|
|
|
94
|
-
|
|
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
|
-
|
|
65
|
+
### Local / self-hosted
|
|
99
66
|
|
|
100
|
-
|
|
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
|
-
|
|
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
|

|
|
113
74
|
|
|
114
|
-
|
|
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
|
-
|
|
77
|
+
Once the scheduled bridging task is installed, memU can turn useful agent history into reusable Markdown skills automatically.
|
|
127
78
|
|
|
128
|
-
|
|
79
|
+

|
|
129
80
|
|
|
130
|
-
|
|
131
|
-
- `
|
|
132
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
123
|
+
Once installed, your agent retrieves relevant memory automatically before answering. To retrieve manually, run the adapter for your host:
|
|
160
124
|
|
|
161
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
memu_cli-0.5.0/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+

|
|
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
|
+
[](https://badge.fury.io/py/memu-cli)
|
|
12
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
|
+
[](https://www.python.org/downloads/)
|
|
14
|
+
[](https://discord.com/invite/hQZntfGsbJ)
|
|
15
|
+
[](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
|
+

|
|
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
|
+

|
|
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 —
|
|
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
|
|
72
|
-
machine is already integrated), reuse it as is. A second
|
|
73
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
|
@@ -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]: ...
|