basic-memory 0.17.7__tar.gz → 0.17.8__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.
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.gitignore +1 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CHANGELOG.md +37 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CLAUDE.md +2 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/PKG-INFO +5 -24
- {basic_memory-0.17.7 → basic_memory-0.17.8}/README.md +4 -23
- {basic_memory-0.17.7 → basic_memory-0.17.8}/server.json +6 -3
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/project_router.py +15 -3
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/__init__.py +10 -0
- basic_memory-0.17.8/src/basic_memory/cli/commands/cloud/restore.py +159 -0
- basic_memory-0.17.8/src/basic_memory/cli/commands/cloud/schemas.py +55 -0
- basic_memory-0.17.8/src/basic_memory/cli/commands/cloud/snapshot.py +370 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/project_repository.py +1 -1
- basic_memory-0.17.8/tests/cli/test_restore_commands.py +409 -0
- basic_memory-0.17.8/tests/cli/test_snapshot_commands.py +529 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_project_repository.py +33 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/spec.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.claude/settings.json +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.dockerignore +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.env.example +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/dependabot.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/release.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.github/workflows/test.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/.python-version +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CITATION.cff +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CLA.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/CONTRIBUTING.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/Dockerfile +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/LICENSE +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/SECURITY.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docker-compose.yml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/Docker.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/character-handling.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/cloud-cli.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/docs/testing-coverage.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/justfile +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/llms-install.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/pyproject.toml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/smithery.yaml +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/directory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/importer_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/knowledge_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/management_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/memory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/prompt_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/resource_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/search_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/routers/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/config.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/db.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/README.md +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/Screenshot.png +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_api_container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_async_client.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_continue_conversation_template.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_directory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_importer_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_knowledge_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_management_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_memory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_project_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_project_router_operations.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_prompt_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_relation_background_resolution.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_resource_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_search_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_search_template.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_template_loader.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/test_template_loader_helpers.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_config.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_deps.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/test_runtime.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.17.7 → basic_memory-0.17.8}/uv.lock +0 -0
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## v0.17.8 (2026-01-24)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- **#521**: Fix `get_default_project()` returning multiple results
|
|
8
|
+
([`6888eff`](https://github.com/basicmachines-co/basic-memory/commit/6888eff))
|
|
9
|
+
- Query incorrectly matched any project with non-NULL `is_default` (both True and False)
|
|
10
|
+
- Now correctly checks for `is_default=True` only
|
|
11
|
+
|
|
12
|
+
## v0.17.7 (2026-01-24)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- **#476**: Add SPEC-29 Phase 3 bucket snapshot CLI commands
|
|
17
|
+
([`369ad37`](https://github.com/basicmachines-co/basic-memory/commit/369ad37))
|
|
18
|
+
- New `basic-memory cloud snapshot` commands for managing cloud snapshots
|
|
19
|
+
- Commands: `create`, `list`, `delete`, `show`, `browse`
|
|
20
|
+
|
|
21
|
+
- **#515**: Add MCP registry publication files
|
|
22
|
+
([`7a502e6`](https://github.com/basicmachines-co/basic-memory/commit/7a502e6))
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
- **#520**: Read default project from database in cloud mode
|
|
27
|
+
([`38616c3`](https://github.com/basicmachines-co/basic-memory/commit/38616c3))
|
|
28
|
+
|
|
29
|
+
- **#513**: Ensure external_id is set on entity creation
|
|
30
|
+
([`c7835a9`](https://github.com/basicmachines-co/basic-memory/commit/c7835a9))
|
|
31
|
+
|
|
32
|
+
### Internal
|
|
33
|
+
|
|
34
|
+
- **#514**: Remove OpenPanel telemetry
|
|
35
|
+
([`85835ae`](https://github.com/basicmachines-co/basic-memory/commit/85835ae))
|
|
36
|
+
|
|
37
|
+
- Update README links to point to basicmemory.com
|
|
38
|
+
([`2aaee73`](https://github.com/basicmachines-co/basic-memory/commit/2aaee73))
|
|
39
|
+
|
|
3
40
|
## v0.17.6 (2026-01-17)
|
|
4
41
|
|
|
5
42
|
### 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.
|
|
3
|
+
Version: 0.17.8
|
|
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
|
[](https://github.com/astral-sh/ruff)
|
|
55
55
|

|
|
56
56
|

|
|
57
|
-
[](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
|
|
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://
|
|
76
|
-
- Documentation: https://
|
|
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://
|
|
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
|
[](https://github.com/astral-sh/ruff)
|
|
7
7
|

|
|
8
8
|

|
|
9
|
-
[](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
|
|
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://
|
|
28
|
-
- Documentation: https://
|
|
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://
|
|
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.
|
|
9
|
+
"version": "0.17.8",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.17.
|
|
14
|
+
"version": "0.17.8",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
|
-
"runtimeArguments": [
|
|
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.
|
|
4
|
+
__version__ = "0.17.8"
|
|
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
|
-
|
|
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
|
|
422
|
-
|
|
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
|