basic-memory 0.17.7__tar.gz → 0.17.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. {basic_memory-0.17.7 → basic_memory-0.17.9}/.gitignore +1 -0
  2. {basic_memory-0.17.7 → basic_memory-0.17.9}/CHANGELOG.md +46 -0
  3. {basic_memory-0.17.7 → basic_memory-0.17.9}/CLAUDE.md +2 -0
  4. {basic_memory-0.17.7 → basic_memory-0.17.9}/PKG-INFO +5 -24
  5. {basic_memory-0.17.7 → basic_memory-0.17.9}/README.md +4 -23
  6. {basic_memory-0.17.7 → basic_memory-0.17.9}/server.json +6 -3
  7. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/__init__.py +1 -1
  8. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/project_router.py +15 -3
  9. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/__init__.py +10 -0
  10. basic_memory-0.17.9/src/basic_memory/cli/commands/cloud/restore.py +159 -0
  11. basic_memory-0.17.9/src/basic_memory/cli/commands/cloud/schemas.py +55 -0
  12. basic_memory-0.17.9/src/basic_memory/cli/commands/cloud/snapshot.py +370 -0
  13. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/project_repository.py +1 -1
  14. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/project_service.py +7 -2
  15. basic_memory-0.17.9/tests/cli/test_restore_commands.py +409 -0
  16. basic_memory-0.17.9/tests/cli/test_snapshot_commands.py +529 -0
  17. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_project_repository.py +33 -0
  18. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_project_service.py +181 -0
  19. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/release/beta.md +0 -0
  20. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/release/changelog.md +0 -0
  21. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/release/release-check.md +0 -0
  22. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/release/release.md +0 -0
  23. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/spec.md +0 -0
  24. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/commands/test-live.md +0 -0
  25. {basic_memory-0.17.7 → basic_memory-0.17.9}/.claude/settings.json +0 -0
  26. {basic_memory-0.17.7 → basic_memory-0.17.9}/.dockerignore +0 -0
  27. {basic_memory-0.17.7 → basic_memory-0.17.9}/.env.example +0 -0
  28. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  30. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  31. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  32. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/dependabot.yml +0 -0
  33. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/claude-code-review.yml +0 -0
  34. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/claude-issue-triage.yml +0 -0
  35. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/claude.yml +0 -0
  36. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/dev-release.yml +0 -0
  37. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/docker.yml +0 -0
  38. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/pr-title.yml +0 -0
  39. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/release.yml +0 -0
  40. {basic_memory-0.17.7 → basic_memory-0.17.9}/.github/workflows/test.yml +0 -0
  41. {basic_memory-0.17.7 → basic_memory-0.17.9}/.python-version +0 -0
  42. {basic_memory-0.17.7 → basic_memory-0.17.9}/CITATION.cff +0 -0
  43. {basic_memory-0.17.7 → basic_memory-0.17.9}/CLA.md +0 -0
  44. {basic_memory-0.17.7 → basic_memory-0.17.9}/CODE_OF_CONDUCT.md +0 -0
  45. {basic_memory-0.17.7 → basic_memory-0.17.9}/CONTRIBUTING.md +0 -0
  46. {basic_memory-0.17.7 → basic_memory-0.17.9}/Dockerfile +0 -0
  47. {basic_memory-0.17.7 → basic_memory-0.17.9}/LICENSE +0 -0
  48. {basic_memory-0.17.7 → basic_memory-0.17.9}/SECURITY.md +0 -0
  49. {basic_memory-0.17.7 → basic_memory-0.17.9}/docker-compose-postgres.yml +0 -0
  50. {basic_memory-0.17.7 → basic_memory-0.17.9}/docker-compose.yml +0 -0
  51. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/ARCHITECTURE.md +0 -0
  52. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/Docker.md +0 -0
  53. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/ai-assistant-guide-extended.md +0 -0
  54. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/character-handling.md +0 -0
  55. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/cloud-cli.md +0 -0
  56. {basic_memory-0.17.7 → basic_memory-0.17.9}/docs/testing-coverage.md +0 -0
  57. {basic_memory-0.17.7 → basic_memory-0.17.9}/justfile +0 -0
  58. {basic_memory-0.17.7 → basic_memory-0.17.9}/llms-install.md +0 -0
  59. {basic_memory-0.17.7 → basic_memory-0.17.9}/pyproject.toml +0 -0
  60. {basic_memory-0.17.7 → basic_memory-0.17.9}/smithery.yaml +0 -0
  61. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/alembic.ini +0 -0
  62. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/env.py +0 -0
  63. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/migrations.py +0 -0
  64. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/script.py.mako +0 -0
  65. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  66. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  67. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  68. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  69. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  70. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  71. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  72. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  73. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  74. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  75. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  76. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  77. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  78. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  79. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/__init__.py +0 -0
  80. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/app.py +0 -0
  81. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/container.py +0 -0
  82. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/__init__.py +0 -0
  83. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/directory_router.py +0 -0
  84. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/importer_router.py +0 -0
  85. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/knowledge_router.py +0 -0
  86. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/management_router.py +0 -0
  87. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/memory_router.py +0 -0
  88. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/prompt_router.py +0 -0
  89. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/resource_router.py +0 -0
  90. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/search_router.py +0 -0
  91. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/routers/utils.py +0 -0
  92. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/template_loader.py +0 -0
  93. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/__init__.py +0 -0
  94. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  95. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  96. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  97. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  98. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  99. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  100. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  101. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  102. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  103. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/__init__.py +0 -0
  104. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/app.py +0 -0
  105. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/auth.py +0 -0
  106. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/__init__.py +0 -0
  107. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  108. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  109. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  110. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  111. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  112. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  113. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  114. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  115. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  116. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/command_utils.py +0 -0
  117. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/db.py +0 -0
  118. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/format.py +0 -0
  119. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  120. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  121. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  122. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  123. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/mcp.py +0 -0
  124. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/project.py +0 -0
  125. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/status.py +0 -0
  126. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/commands/tool.py +0 -0
  127. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/container.py +0 -0
  128. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/cli/main.py +0 -0
  129. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/config.py +0 -0
  130. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/db.py +0 -0
  131. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/__init__.py +0 -0
  132. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/config.py +0 -0
  133. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/db.py +0 -0
  134. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/importers.py +0 -0
  135. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/projects.py +0 -0
  136. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/repositories.py +0 -0
  137. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps/services.py +0 -0
  138. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/deps.py +0 -0
  139. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/file_utils.py +0 -0
  140. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/ignore_utils.py +0 -0
  141. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/__init__.py +0 -0
  142. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/base.py +0 -0
  143. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  144. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  145. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  146. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/memory_json_importer.py +0 -0
  147. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/importers/utils.py +0 -0
  148. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/__init__.py +0 -0
  149. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/entity_parser.py +0 -0
  150. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/markdown_processor.py +0 -0
  151. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/plugins.py +0 -0
  152. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/schemas.py +0 -0
  153. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/markdown/utils.py +0 -0
  154. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/__init__.py +0 -0
  155. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/async_client.py +0 -0
  156. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/__init__.py +0 -0
  157. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/directory.py +0 -0
  158. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  159. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/memory.py +0 -0
  160. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/project.py +0 -0
  161. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/resource.py +0 -0
  162. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/clients/search.py +0 -0
  163. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/container.py +0 -0
  164. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/project_context.py +0 -0
  165. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  166. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  167. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  168. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  169. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/search.py +0 -0
  170. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/prompts/utils.py +0 -0
  171. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  172. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/resources/project_info.py +0 -0
  173. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/server.py +0 -0
  174. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/__init__.py +0 -0
  175. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/build_context.py +0 -0
  176. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/canvas.py +0 -0
  177. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  178. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  179. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  180. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  181. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/move_note.py +0 -0
  182. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/project_management.py +0 -0
  183. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/read_content.py +0 -0
  184. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/read_note.py +0 -0
  185. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  186. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/search.py +0 -0
  187. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/utils.py +0 -0
  188. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/view_note.py +0 -0
  189. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/mcp/tools/write_note.py +0 -0
  190. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/models/__init__.py +0 -0
  191. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/models/base.py +0 -0
  192. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/models/knowledge.py +0 -0
  193. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/models/project.py +0 -0
  194. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/models/search.py +0 -0
  195. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/project_resolver.py +0 -0
  196. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/__init__.py +0 -0
  197. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/entity_repository.py +0 -0
  198. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/observation_repository.py +0 -0
  199. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  200. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/project_info_repository.py +0 -0
  201. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/relation_repository.py +0 -0
  202. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/repository.py +0 -0
  203. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/search_index_row.py +0 -0
  204. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/search_repository.py +0 -0
  205. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/search_repository_base.py +0 -0
  206. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  207. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/runtime.py +0 -0
  208. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/__init__.py +0 -0
  209. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/base.py +0 -0
  210. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/cloud.py +0 -0
  211. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/delete.py +0 -0
  212. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/directory.py +0 -0
  213. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/importer.py +0 -0
  214. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/memory.py +0 -0
  215. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/project_info.py +0 -0
  216. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/prompt.py +0 -0
  217. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/request.py +0 -0
  218. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/response.py +0 -0
  219. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/search.py +0 -0
  220. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/sync_report.py +0 -0
  221. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/v2/__init__.py +0 -0
  222. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/v2/entity.py +0 -0
  223. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/schemas/v2/resource.py +0 -0
  224. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/__init__.py +0 -0
  225. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/context_service.py +0 -0
  226. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/directory_service.py +0 -0
  227. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/entity_service.py +0 -0
  228. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/exceptions.py +0 -0
  229. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/file_service.py +0 -0
  230. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/initialization.py +0 -0
  231. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/link_resolver.py +0 -0
  232. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/search_service.py +0 -0
  233. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/services/service.py +0 -0
  234. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/sync/__init__.py +0 -0
  235. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/sync/background_sync.py +0 -0
  236. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/sync/coordinator.py +0 -0
  237. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/sync/sync_service.py +0 -0
  238. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/sync/watch_service.py +0 -0
  239. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  240. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/templates/prompts/search.hbs +0 -0
  241. {basic_memory-0.17.7 → basic_memory-0.17.9}/src/basic_memory/utils.py +0 -0
  242. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/BENCHMARKS.md +0 -0
  243. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/cli/test_project_commands_integration.py +0 -0
  244. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/cli/test_version_integration.py +0 -0
  245. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/conftest.py +0 -0
  246. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_build_context_underscore.py +0 -0
  247. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_build_context_validation.py +0 -0
  248. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  249. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  250. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_delete_note_integration.py +0 -0
  251. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_edit_note_integration.py +0 -0
  252. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  253. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_list_directory_integration.py +0 -0
  254. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_move_note_integration.py +0 -0
  255. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_project_management_integration.py +0 -0
  256. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  257. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_read_content_integration.py +0 -0
  258. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_read_note_integration.py +0 -0
  259. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_search_integration.py +0 -0
  260. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  261. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/mcp/test_write_note_integration.py +0 -0
  262. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/test_db_wal_mode.py +0 -0
  263. {basic_memory-0.17.7 → basic_memory-0.17.9}/test-int/test_disable_permalinks_integration.py +0 -0
  264. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/Non-MarkdownFileSupport.pdf +0 -0
  265. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/README.md +0 -0
  266. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/Screenshot.png +0 -0
  267. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/__init__.py +0 -0
  268. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/conftest.py +0 -0
  269. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_api_container.py +0 -0
  270. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_async_client.py +0 -0
  271. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_continue_conversation_template.py +0 -0
  272. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_directory_router.py +0 -0
  273. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_importer_router.py +0 -0
  274. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_knowledge_router.py +0 -0
  275. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_management_router.py +0 -0
  276. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_memory_router.py +0 -0
  277. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_project_router.py +0 -0
  278. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_project_router_operations.py +0 -0
  279. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_prompt_router.py +0 -0
  280. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_relation_background_resolution.py +0 -0
  281. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_resource_router.py +0 -0
  282. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_search_router.py +0 -0
  283. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_search_template.py +0 -0
  284. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_template_loader.py +0 -0
  285. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/test_template_loader_helpers.py +0 -0
  286. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/__init__.py +0 -0
  287. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/conftest.py +0 -0
  288. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_directory_router.py +0 -0
  289. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_importer_router.py +0 -0
  290. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_knowledge_router.py +0 -0
  291. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_memory_router.py +0 -0
  292. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_project_router.py +0 -0
  293. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_prompt_router.py +0 -0
  294. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_resource_router.py +0 -0
  295. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/api/v2/test_search_router.py +0 -0
  296. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  297. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  298. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/cloud/test_upload_path.py +0 -0
  299. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/conftest.py +0 -0
  300. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_auth_cli_auth.py +0 -0
  301. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_cli_container.py +0 -0
  302. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_cli_exit.py +0 -0
  303. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_cli_tool_exit.py +0 -0
  304. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_cli_tools.py +0 -0
  305. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_cloud_authentication.py +0 -0
  306. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_ignore_utils.py +0 -0
  307. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_import_chatgpt.py +0 -0
  308. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_import_claude_conversations.py +0 -0
  309. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_import_claude_projects.py +0 -0
  310. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_import_memory_json.py +0 -0
  311. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_project_add_with_local_path.py +0 -0
  312. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/cli/test_upload.py +0 -0
  313. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/conftest.py +0 -0
  314. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  315. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/importers/test_conversation_indexing.py +0 -0
  316. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/importers/test_importer_base.py +0 -0
  317. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/importers/test_importer_utils.py +0 -0
  318. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/__init__.py +0 -0
  319. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  320. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_entity_parser.py +0 -0
  321. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  322. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_markdown_plugins.py +0 -0
  323. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_markdown_processor.py +0 -0
  324. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_markdown_utils.py +0 -0
  325. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_observation_edge_cases.py +0 -0
  326. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_parser_edge_cases.py +0 -0
  327. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_relation_edge_cases.py +0 -0
  328. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/markdown/test_task_detection.py +0 -0
  329. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/clients/__init__.py +0 -0
  330. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/clients/test_clients.py +0 -0
  331. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/conftest.py +0 -0
  332. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_async_client_modes.py +0 -0
  333. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_mcp_container.py +0 -0
  334. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  335. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  336. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_project_context.py +0 -0
  337. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_prompts.py +0 -0
  338. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  339. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_resources.py +0 -0
  340. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_server_lifespan_branches.py +0 -0
  341. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_build_context.py +0 -0
  342. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_canvas.py +0 -0
  343. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_delete_note.py +0 -0
  344. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_edit_note.py +0 -0
  345. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_list_directory.py +0 -0
  346. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_move_note.py +0 -0
  347. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_project_management.py +0 -0
  348. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_read_content.py +0 -0
  349. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_read_note.py +0 -0
  350. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_recent_activity.py +0 -0
  351. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_resource.py +0 -0
  352. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_search.py +0 -0
  353. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_utils.py +0 -0
  354. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_view_note.py +0 -0
  355. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_write_note.py +0 -0
  356. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  357. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  358. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_entity_repository.py +0 -0
  359. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_entity_repository_upsert.py +0 -0
  360. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  361. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_observation_repository.py +0 -0
  362. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_postgres_search_repository.py +0 -0
  363. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_project_info_repository.py +0 -0
  364. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_relation_repository.py +0 -0
  365. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_repository.py +0 -0
  366. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_search_repository.py +0 -0
  367. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  368. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  369. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_memory_serialization.py +0 -0
  370. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_memory_url.py +0 -0
  371. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_memory_url_validation.py +0 -0
  372. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  373. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_schemas.py +0 -0
  374. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/schemas/test_search.py +0 -0
  375. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_context_service.py +0 -0
  376. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_directory_service.py +0 -0
  377. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_entity_service.py +0 -0
  378. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  379. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_file_service.py +0 -0
  380. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_initialization.py +0 -0
  381. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  382. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_link_resolver.py +0 -0
  383. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_project_removal_bug.py +0 -0
  384. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_project_service_operations.py +0 -0
  385. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/services/test_search_service.py +0 -0
  386. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_character_conflicts.py +0 -0
  387. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_coordinator.py +0 -0
  388. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_sync_service.py +0 -0
  389. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_sync_service_incremental.py +0 -0
  390. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_sync_wikilink_issue.py +0 -0
  391. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_tmp_files.py +0 -0
  392. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_watch_service.py +0 -0
  393. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  394. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_watch_service_edge_cases.py +0 -0
  395. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/sync/test_watch_service_reload.py +0 -0
  396. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_config.py +0 -0
  397. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_deps.py +0 -0
  398. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_production_cascade_delete.py +0 -0
  399. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_project_resolver.py +0 -0
  400. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_rclone_commands.py +0 -0
  401. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/test_runtime.py +0 -0
  402. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_file_utils.py +0 -0
  403. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  404. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_parse_tags.py +0 -0
  405. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_permalink_formatting.py +0 -0
  406. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_timezone_utils.py +0 -0
  407. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_utf8_handling.py +0 -0
  408. {basic_memory-0.17.7 → basic_memory-0.17.9}/tests/utils/test_validate_project_path.py +0 -0
  409. {basic_memory-0.17.7 → basic_memory-0.17.9}/uv.lock +0 -0
@@ -54,3 +54,4 @@ ENV/
54
54
  claude-output
55
55
  **/.claude/settings.local.json
56
56
  .mcp.json
57
+ .mcpregistry_*
@@ -1,5 +1,51 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.17.9 (2026-01-24)
4
+
5
+ ### Bug Fixes
6
+
7
+ - **#523**: Fix `remove_project()` checking stale config in cloud mode
8
+ ([`17c0e0a`](https://github.com/basicmachines-co/basic-memory/commit/17c0e0a))
9
+ - In cloud mode, only check database `is_default` field (source of truth)
10
+ - Config file can become stale when users set default project via v2 API
11
+
12
+ ## v0.17.8 (2026-01-24)
13
+
14
+ ### Bug Fixes
15
+
16
+ - **#521**: Fix `get_default_project()` returning multiple results
17
+ ([`6888eff`](https://github.com/basicmachines-co/basic-memory/commit/6888eff))
18
+ - Query incorrectly matched any project with non-NULL `is_default` (both True and False)
19
+ - Now correctly checks for `is_default=True` only
20
+
21
+ ## v0.17.7 (2026-01-24)
22
+
23
+ ### Features
24
+
25
+ - **#476**: Add SPEC-29 Phase 3 bucket snapshot CLI commands
26
+ ([`369ad37`](https://github.com/basicmachines-co/basic-memory/commit/369ad37))
27
+ - New `basic-memory cloud snapshot` commands for managing cloud snapshots
28
+ - Commands: `create`, `list`, `delete`, `show`, `browse`
29
+
30
+ - **#515**: Add MCP registry publication files
31
+ ([`7a502e6`](https://github.com/basicmachines-co/basic-memory/commit/7a502e6))
32
+
33
+ ### Bug Fixes
34
+
35
+ - **#520**: Read default project from database in cloud mode
36
+ ([`38616c3`](https://github.com/basicmachines-co/basic-memory/commit/38616c3))
37
+
38
+ - **#513**: Ensure external_id is set on entity creation
39
+ ([`c7835a9`](https://github.com/basicmachines-co/basic-memory/commit/c7835a9))
40
+
41
+ ### Internal
42
+
43
+ - **#514**: Remove OpenPanel telemetry
44
+ ([`85835ae`](https://github.com/basicmachines-co/basic-memory/commit/85835ae))
45
+
46
+ - Update README links to point to basicmemory.com
47
+ ([`2aaee73`](https://github.com/basicmachines-co/basic-memory/commit/2aaee73))
48
+
3
49
  ## v0.17.6 (2026-01-17)
4
50
 
5
51
  ### Bug Fixes
@@ -240,6 +240,8 @@ See SPEC-16 for full context manager refactor details.
240
240
  - Logout: `basic-memory cloud logout`
241
241
  - Check cloud status: `basic-memory cloud status`
242
242
  - Setup cloud sync: `basic-memory cloud setup`
243
+ - Manage snapshots: `basic-memory cloud snapshot [create|list|delete|show|browse]`
244
+ - Restore from snapshot: `basic-memory cloud restore <path> --snapshot <id>`
243
245
 
244
246
  ### MCP Capabilities
245
247
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.17.7
3
+ Version: 0.17.9
4
4
  Summary: Local-first knowledge management combining Zettelkasten with knowledge graphs
5
5
  Project-URL: Homepage, https://github.com/basicmachines-co/basic-memory
6
6
  Project-URL: Repository, https://github.com/basicmachines-co/basic-memory
@@ -54,7 +54,6 @@ Description-Content-Type: text/markdown
54
54
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
55
55
  ![](https://badge.mcpx.dev?type=server 'MCP Server')
56
56
  ![](https://badge.mcpx.dev?type=dev 'MCP Dev')
57
- [![smithery badge](https://smithery.ai/badge/@basicmachines-co/basic-memory)](https://smithery.ai/server/@basicmachines-co/basic-memory)
58
57
 
59
58
  ## 🚀 Basic Memory Cloud is Live!
60
59
 
@@ -62,7 +61,7 @@ Description-Content-Type: text/markdown
62
61
  - **Early Supporter Pricing:** Early users get 25% off forever.
63
62
  The open source project continues as always. Cloud just makes it work everywhere.
64
63
 
65
- [Sign up now →](https://basicmemory.com/beta)
64
+ [Sign up now →](https://basicmemory.com)
66
65
 
67
66
  with a 7 day free trial
68
67
 
@@ -72,8 +71,8 @@ Basic Memory lets you build persistent knowledge through natural conversations w
72
71
  Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
73
72
  enable any compatible LLM to read and write to your local knowledge base.
74
73
 
75
- - Website: https://basicmachines.co
76
- - Documentation: https://memory.basicmachines.co
74
+ - Website: https://basicmemory.com
75
+ - Documentation: https://docs.basicmemory.com
77
76
 
78
77
  ## Pick up your conversation right where you left off
79
78
 
@@ -111,24 +110,6 @@ uv tool install basic-memory
111
110
 
112
111
  You can view shared context via files in `~/basic-memory` (default directory location).
113
112
 
114
- ### Alternative Installation via Smithery
115
-
116
- You can use [Smithery](https://smithery.ai/server/@basicmachines-co/basic-memory) to automatically configure Basic
117
- Memory for Claude Desktop:
118
-
119
- ```bash
120
- npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
121
- ```
122
-
123
- This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
124
- Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
125
-
126
- ### Glama.ai
127
-
128
- <a href="https://glama.ai/mcp/servers/o90kttu9ym">
129
- <img width="380" height="200" src="https://glama.ai/mcp/servers/o90kttu9ym/badge" alt="basic-memory MCP server" />
130
- </a>
131
-
132
113
  ## Why Basic Memory?
133
114
 
134
115
  Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
@@ -474,7 +455,7 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
474
455
 
475
456
  ## Futher info
476
457
 
477
- See the [Documentation](https://memory.basicmachines.co/) for more info, including:
458
+ See the [Documentation](https://docs.basicmemory.com) for more info, including:
478
459
 
479
460
  - [Complete User Guide](https://docs.basicmemory.com/user-guide/)
480
461
  - [CLI tools](https://docs.basicmemory.com/guides/cli-reference/)
@@ -6,7 +6,6 @@
6
6
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
7
7
  ![](https://badge.mcpx.dev?type=server 'MCP Server')
8
8
  ![](https://badge.mcpx.dev?type=dev 'MCP Dev')
9
- [![smithery badge](https://smithery.ai/badge/@basicmachines-co/basic-memory)](https://smithery.ai/server/@basicmachines-co/basic-memory)
10
9
 
11
10
  ## 🚀 Basic Memory Cloud is Live!
12
11
 
@@ -14,7 +13,7 @@
14
13
  - **Early Supporter Pricing:** Early users get 25% off forever.
15
14
  The open source project continues as always. Cloud just makes it work everywhere.
16
15
 
17
- [Sign up now →](https://basicmemory.com/beta)
16
+ [Sign up now →](https://basicmemory.com)
18
17
 
19
18
  with a 7 day free trial
20
19
 
@@ -24,8 +23,8 @@ Basic Memory lets you build persistent knowledge through natural conversations w
24
23
  Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
25
24
  enable any compatible LLM to read and write to your local knowledge base.
26
25
 
27
- - Website: https://basicmachines.co
28
- - Documentation: https://memory.basicmachines.co
26
+ - Website: https://basicmemory.com
27
+ - Documentation: https://docs.basicmemory.com
29
28
 
30
29
  ## Pick up your conversation right where you left off
31
30
 
@@ -63,24 +62,6 @@ uv tool install basic-memory
63
62
 
64
63
  You can view shared context via files in `~/basic-memory` (default directory location).
65
64
 
66
- ### Alternative Installation via Smithery
67
-
68
- You can use [Smithery](https://smithery.ai/server/@basicmachines-co/basic-memory) to automatically configure Basic
69
- Memory for Claude Desktop:
70
-
71
- ```bash
72
- npx -y @smithery/cli install @basicmachines-co/basic-memory --client claude
73
- ```
74
-
75
- This installs and configures Basic Memory without requiring manual edits to the Claude Desktop configuration file. The
76
- Smithery server hosts the MCP server component, while your data remains stored locally as Markdown files.
77
-
78
- ### Glama.ai
79
-
80
- <a href="https://glama.ai/mcp/servers/o90kttu9ym">
81
- <img width="380" height="200" src="https://glama.ai/mcp/servers/o90kttu9ym/badge" alt="basic-memory MCP server" />
82
- </a>
83
-
84
65
  ## Why Basic Memory?
85
66
 
86
67
  Most LLM interactions are ephemeral - you ask a question, get an answer, and everything is forgotten. Each conversation
@@ -426,7 +407,7 @@ canvas(nodes, edges, title, folder) - Generate knowledge visualizations
426
407
 
427
408
  ## Futher info
428
409
 
429
- See the [Documentation](https://memory.basicmachines.co/) for more info, including:
410
+ See the [Documentation](https://docs.basicmemory.com) for more info, including:
430
411
 
431
412
  - [Complete User Guide](https://docs.basicmemory.com/user-guide/)
432
413
  - [CLI tools](https://docs.basicmemory.com/guides/cli-reference/)
@@ -6,14 +6,17 @@
6
6
  "url": "https://github.com/basicmachines-co/basic-memory.git",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.17.7",
9
+ "version": "0.17.9",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.17.7",
14
+ "version": "0.17.9",
15
15
  "runtimeHint": "uvx",
16
- "runtimeArguments": ["basic-memory", "mcp"],
16
+ "runtimeArguments": [
17
+ {"type": "positional", "value": "basic-memory"},
18
+ {"type": "positional", "value": "mcp"}
19
+ ],
17
20
  "transport": {
18
21
  "type": "stdio"
19
22
  }
@@ -1,7 +1,7 @@
1
1
  """basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
2
2
 
3
3
  # Package version - updated by release automation
4
- __version__ = "0.17.7"
4
+ __version__ = "0.17.9"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -322,7 +322,14 @@ async def remove_project(
322
322
  ) # pragma: no cover
323
323
 
324
324
  # Check if trying to delete the default project
325
- if name == project_service.default_project:
325
+ # In cloud mode, database is source of truth; in local mode, check config
326
+ config_default = project_service.default_project
327
+ db_default = await project_service.repository.get_default_project()
328
+
329
+ # Use database default if available, otherwise fall back to config default
330
+ default_project_name = db_default.name if db_default else config_default
331
+
332
+ if name == default_project_name:
326
333
  available_projects = await project_service.list_projects()
327
334
  other_projects = [p.name for p in available_projects if p.name != name]
328
335
  detail = f"Cannot delete default project '{name}'. "
@@ -418,8 +425,13 @@ async def get_default_project(
418
425
  Returns:
419
426
  Response with project default information
420
427
  """
421
- # Get the old default project
422
- default_name = project_service.default_project
428
+ # Get the default project
429
+ # In cloud mode, database is source of truth; in local mode, check config
430
+ config_default = project_service.default_project
431
+ db_default = await project_service.repository.get_default_project()
432
+
433
+ # Use database default if available, otherwise fall back to config default
434
+ default_name = db_default.name if db_default else config_default
423
435
  default_project = await project_service.get_project(default_name)
424
436
  if not default_project: # pragma: no cover
425
437
  raise HTTPException( # pragma: no cover
@@ -1,6 +1,16 @@
1
1
  """Cloud commands package."""
2
2
 
3
+ from basic_memory.cli.app import cloud_app
4
+
3
5
  # Import all commands to register them with typer
4
6
  from basic_memory.cli.commands.cloud.core_commands import * # noqa: F401,F403
5
7
  from basic_memory.cli.commands.cloud.api_client import get_authenticated_headers, get_cloud_config # noqa: F401
6
8
  from basic_memory.cli.commands.cloud.upload_command import * # noqa: F401,F403
9
+
10
+ # Register snapshot sub-command group
11
+ from basic_memory.cli.commands.cloud.snapshot import snapshot_app
12
+
13
+ cloud_app.add_typer(snapshot_app, name="snapshot")
14
+
15
+ # Register restore command (directly on cloud_app via decorator)
16
+ from basic_memory.cli.commands.cloud.restore import restore # noqa: F401, E402
@@ -0,0 +1,159 @@
1
+ """Restore CLI commands for Basic Memory Cloud.
2
+
3
+ SPEC-29 Phase 3: CLI commands for restoring files from Tigris bucket snapshots.
4
+ """
5
+
6
+ import asyncio
7
+
8
+ import typer
9
+ from rich.console import Console
10
+
11
+ from basic_memory.cli.app import cloud_app
12
+ from basic_memory.cli.commands.cloud.api_client import (
13
+ CloudAPIError,
14
+ SubscriptionRequiredError,
15
+ make_api_request,
16
+ )
17
+ from basic_memory.cli.commands.cloud.schemas import BucketSnapshotBrowseResponse
18
+ from basic_memory.config import ConfigManager
19
+
20
+ console = Console()
21
+
22
+
23
+ @cloud_app.command("restore")
24
+ def restore(
25
+ path: str = typer.Argument(
26
+ ...,
27
+ help="Path to restore (file or folder, e.g., 'notes/project.md' or 'research/')",
28
+ ),
29
+ snapshot_id: str = typer.Option(
30
+ ...,
31
+ "--snapshot",
32
+ "-s",
33
+ help="ID of the snapshot to restore from",
34
+ ),
35
+ force: bool = typer.Option(
36
+ False,
37
+ "--force",
38
+ "-f",
39
+ help="Skip confirmation prompt",
40
+ ),
41
+ ) -> None:
42
+ """Restore a file or folder from a snapshot.
43
+
44
+ This command restores files from a previous snapshot to the current bucket.
45
+ The restored files will overwrite any existing files at the same path.
46
+
47
+ Examples:
48
+ bm cloud restore notes/project.md --snapshot abc123
49
+ bm cloud restore research/ --snapshot abc123
50
+ bm cloud restore notes/project.md --snapshot abc123 --force
51
+ """
52
+
53
+ async def _restore():
54
+ try:
55
+ config_manager = ConfigManager()
56
+ config = config_manager.config
57
+ host_url = config.cloud_host.rstrip("/")
58
+
59
+ # Normalize path - remove leading slash if present
60
+ normalized_path = path.lstrip("/")
61
+
62
+ if not force:
63
+ # Show what will be restored
64
+ console.print(f"[blue]Preparing to restore from snapshot {snapshot_id}[/blue]")
65
+ console.print(f" Path: {normalized_path}")
66
+
67
+ # Try to browse the snapshot to show what files will be affected
68
+ try:
69
+ browse_url = f"{host_url}/api/bucket-snapshots/{snapshot_id}/browse"
70
+ if normalized_path:
71
+ browse_url += f"?prefix={normalized_path}"
72
+
73
+ response = await make_api_request(
74
+ method="GET",
75
+ url=browse_url,
76
+ )
77
+ browse_response = BucketSnapshotBrowseResponse.model_validate(response.json())
78
+
79
+ if browse_response.files:
80
+ if len(browse_response.files) <= 10:
81
+ console.print("\n Files to restore:")
82
+ for file_info in browse_response.files:
83
+ console.print(f" - {file_info.key}")
84
+ else:
85
+ console.print(
86
+ f"\n {len(browse_response.files)} files will be restored"
87
+ )
88
+ console.print(" First 5 files:")
89
+ for file_info in browse_response.files[:5]:
90
+ console.print(f" - {file_info.key}")
91
+ console.print(f" ... and {len(browse_response.files) - 5} more")
92
+ else:
93
+ console.print(
94
+ f"\n[yellow]No files found matching '{normalized_path}' "
95
+ f"in snapshot[/yellow]"
96
+ )
97
+ raise typer.Exit(0)
98
+
99
+ except CloudAPIError as browse_error:
100
+ if browse_error.status_code == 404:
101
+ console.print(f"[red]Snapshot not found: {snapshot_id}[/red]")
102
+ raise typer.Exit(1)
103
+ # If browse fails for other reasons, proceed with confirmation anyway
104
+ pass
105
+
106
+ console.print(
107
+ "\n[yellow]Warning: Restored files will overwrite existing files![/yellow]"
108
+ )
109
+ confirmed = typer.confirm("\nProceed with restore?")
110
+ if not confirmed:
111
+ console.print("[yellow]Restore cancelled[/yellow]")
112
+ raise typer.Exit(0)
113
+
114
+ console.print(f"[blue]Restoring from snapshot {snapshot_id}...[/blue]")
115
+
116
+ response = await make_api_request(
117
+ method="POST",
118
+ url=f"{host_url}/api/bucket-snapshots/{snapshot_id}/restore",
119
+ json_data={"path": normalized_path},
120
+ )
121
+
122
+ data = response.json()
123
+ restored_files = data.get("restored", [])
124
+ returned_snapshot_id = data.get("snapshot_id", snapshot_id)
125
+
126
+ if restored_files:
127
+ console.print(f"[green]Successfully restored {len(restored_files)} file(s)[/green]")
128
+ if len(restored_files) <= 10:
129
+ for file_path in restored_files:
130
+ console.print(f" - {file_path}")
131
+ else:
132
+ console.print(" First 5 restored files:")
133
+ for file_path in restored_files[:5]:
134
+ console.print(f" - {file_path}")
135
+ console.print(f" ... and {len(restored_files) - 5} more")
136
+ console.print(f"\n[dim]Snapshot ID: {returned_snapshot_id}[/dim]")
137
+ else:
138
+ console.print("[yellow]No files were restored[/yellow]")
139
+ console.print(f"[dim]No files matching '{normalized_path}' found in snapshot[/dim]")
140
+
141
+ except typer.Exit:
142
+ # Re-raise typer.Exit without modification - it's used for clean exits
143
+ raise
144
+ except SubscriptionRequiredError as e:
145
+ console.print("\n[red]Subscription Required[/red]\n")
146
+ console.print(f"[yellow]{e.args[0]}[/yellow]\n")
147
+ console.print(f"Subscribe at: [blue underline]{e.subscribe_url}[/blue underline]\n")
148
+ raise typer.Exit(1)
149
+ except CloudAPIError as e:
150
+ if e.status_code == 404:
151
+ console.print(f"[red]Snapshot not found: {snapshot_id}[/red]")
152
+ else:
153
+ console.print(f"[red]Failed to restore: {e}[/red]")
154
+ raise typer.Exit(1)
155
+ except Exception as e:
156
+ console.print(f"[red]Unexpected error: {e}[/red]")
157
+ raise typer.Exit(1)
158
+
159
+ asyncio.run(_restore())
@@ -0,0 +1,55 @@
1
+ """Pydantic schemas for Basic Memory Cloud API responses.
2
+
3
+ These schemas mirror the API response models from basic-memory-cloud
4
+ for type-safe parsing of API responses in CLI commands.
5
+ """
6
+
7
+ from datetime import datetime
8
+ from uuid import UUID
9
+
10
+ from pydantic import BaseModel
11
+
12
+
13
+ class BucketSnapshotFileInfo(BaseModel):
14
+ """File info from snapshot browse response."""
15
+
16
+ key: str
17
+ size: int
18
+ last_modified: datetime
19
+ etag: str | None = None
20
+
21
+
22
+ class BucketSnapshotBrowseResponse(BaseModel):
23
+ """Response from browsing snapshot contents."""
24
+
25
+ files: list[BucketSnapshotFileInfo]
26
+ prefix: str
27
+ snapshot_version: str
28
+
29
+
30
+ class BucketSnapshotResponse(BaseModel):
31
+ """Response model for bucket snapshot data."""
32
+
33
+ id: UUID
34
+ bucket_name: str
35
+ snapshot_version: str
36
+ name: str
37
+ description: str | None
38
+ auto: bool
39
+ created_at: datetime
40
+ created_by: UUID | None = None
41
+
42
+
43
+ class BucketSnapshotListResponse(BaseModel):
44
+ """Response from listing bucket snapshots."""
45
+
46
+ snapshots: list[BucketSnapshotResponse]
47
+ total: int
48
+
49
+
50
+ class BucketSnapshotRestoreResponse(BaseModel):
51
+ """Response from restore operation."""
52
+
53
+ restored: list[str]
54
+ snapshot_version: str
55
+ snapshot_id: UUID