basic-memory 0.20.1__tar.gz → 0.20.3__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.20.1 → basic_memory-0.20.3}/CHANGELOG.md +17 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/PKG-INFO +3 -1
- basic_memory-0.20.3/docs/logfire-instrumentation-strategy.md +499 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/justfile +45 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/pyproject.toml +4 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/server.json +2 -2
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/app.py +26 -16
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/search_router.py +33 -22
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/app.py +9 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/auto_update.py +5 -7
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/api_client.py +15 -3
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/doctor.py +6 -3
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/config.py +47 -4
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/file_utils.py +5 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/async_client.py +21 -15
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/project_context.py +263 -171
- basic_memory-0.20.3/src/basic_memory/mcp/server.py +181 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/build_context.py +60 -24
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/delete_note.py +12 -1
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/edit_note.py +252 -211
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/move_note.py +7 -6
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/read_content.py +13 -1
- basic_memory-0.20.3/src/basic_memory/mcp/tools/read_note.py +459 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/search.py +163 -129
- basic_memory-0.20.3/src/basic_memory/mcp/tools/write_note.py +345 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/runtime.py +10 -3
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/project_service.py +19 -7
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/search_service.py +95 -28
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/sync_service.py +379 -301
- basic_memory-0.20.3/src/basic_memory/telemetry.py +209 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/utils.py +25 -4
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_string_params_integration.py +1 -3
- basic_memory-0.20.3/tests/api/v2/test_search_router_telemetry.py +62 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_cloud_api_client_and_utils.py +68 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_auto_update.py +25 -0
- basic_memory-0.20.3/tests/cli/test_cli_telemetry.py +49 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/conftest.py +6 -0
- basic_memory-0.20.3/tests/mcp/test_async_client_telemetry.py +46 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_project_context.py +21 -0
- basic_memory-0.20.3/tests/mcp/test_project_context_telemetry.py +94 -0
- basic_memory-0.20.3/tests/mcp/test_server_telemetry.py +33 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_delete_note.py +55 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_edit_note.py +59 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_search.py +64 -2
- basic_memory-0.20.3/tests/mcp/test_tool_telemetry.py +309 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_embedding_status.py +49 -0
- basic_memory-0.20.3/tests/services/test_search_service_telemetry.py +73 -0
- basic_memory-0.20.3/tests/sync/test_sync_service_telemetry.py +170 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_coerce.py +0 -1
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_config.py +16 -0
- basic_memory-0.20.3/tests/test_telemetry.py +296 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_file_utils.py +13 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_setup_logging.py +51 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_validate_project_path.py +48 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/uv.lock +168 -65
- basic_memory-0.20.1/src/basic_memory/mcp/server.py +0 -167
- basic_memory-0.20.1/src/basic_memory/mcp/tools/read_note.py +0 -432
- basic_memory-0.20.1/src/basic_memory/mcp/tools/write_note.py +0 -325
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/spec.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/settings.json +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.dockerignore +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.env.example +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/dependabot.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/release.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/test.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.gitignore +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/.python-version +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/AGENTS.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/CITATION.cff +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/CLA.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/CLAUDE.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/CONTRIBUTING.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/Dockerfile +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/LICENSE +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/README.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/SECURITY.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docker-compose.yml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/Docker.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/character-handling.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/cloud-cli.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/metadata-search.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/semantic-search.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/testing-coverage.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/llms-install.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/smithery.yaml +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/update.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/db.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/report.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/README.md +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/Screenshot.png +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_json_output.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_list_and_ls.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_set_cloud_local.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_update_command.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_workspace_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_workspace_management.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_semantic_search_base.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/__init__.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_deps.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_runtime.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/tailwind.config.js +0 -0
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.20.3 (2026-03-26)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **#698**: CLI cloud commands now use API key when configured
|
|
10
|
+
- `get_authenticated_headers()` only checked OAuth tokens, ignoring `config.cloud_api_key`
|
|
11
|
+
- All CLI cloud commands (`upload`, `status`, `snapshot`, `restore`, etc.) failed for API-key-only users while MCP tools worked fine
|
|
12
|
+
- Now mirrors the same credential priority as MCP: API key first, OAuth fallback
|
|
13
|
+
- Fixes `bm cloud upload --project` returning "project does not exist" when authenticated with `bmc_*` API key
|
|
14
|
+
|
|
15
|
+
## v0.20.2 (2026-03-10)
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
- Fix auto-update Homebrew detection: `brew outdated` exits 1 when a formula is outdated, not on error
|
|
20
|
+
- Previously treated exit code 1 as a failure, causing "Automatic update check failed" instead of detecting the available update
|
|
21
|
+
|
|
5
22
|
## v0.20.1 (2026-03-10)
|
|
6
23
|
|
|
7
24
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.3
|
|
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
|
|
@@ -47,6 +47,8 @@ Requires-Dist: sqlite-vec>=0.1.6
|
|
|
47
47
|
Requires-Dist: typer>=0.9.0
|
|
48
48
|
Requires-Dist: unidecode>=1.3.8
|
|
49
49
|
Requires-Dist: watchfiles>=1.0.4
|
|
50
|
+
Provides-Extra: telemetry
|
|
51
|
+
Requires-Dist: logfire>=4.19.0; extra == 'telemetry'
|
|
50
52
|
Description-Content-Type: text/markdown
|
|
51
53
|
|
|
52
54
|
<!-- mcp-name: io.github.basicmachines-co/basic-memory -->
|
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
# Logfire Instrumentation Strategy
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
We want Logfire in Basic Memory for two specific use cases:
|
|
6
|
+
|
|
7
|
+
1. Local development and performance investigation
|
|
8
|
+
2. Cloud deployments where Basic Memory runs inside Basic Memory Cloud
|
|
9
|
+
|
|
10
|
+
This instrumentation must be:
|
|
11
|
+
|
|
12
|
+
- Disabled by default
|
|
13
|
+
- Useful when enabled
|
|
14
|
+
- Safe for local-first users
|
|
15
|
+
- Searchable in Logfire over time
|
|
16
|
+
|
|
17
|
+
The previous integration added telemetry, but it leaned too much on generic framework instrumentation. That created noisy spans with weak names and made the trace view harder to navigate. This strategy favors manual instrumentation around Basic Memory's real units of work.
|
|
18
|
+
|
|
19
|
+
## Core Principles
|
|
20
|
+
|
|
21
|
+
### 1. Default-off
|
|
22
|
+
|
|
23
|
+
Basic Memory should ship with Logfire disabled unless the operator explicitly enables it.
|
|
24
|
+
|
|
25
|
+
That means:
|
|
26
|
+
|
|
27
|
+
- no required token for normal local usage
|
|
28
|
+
- no surprise outbound telemetry
|
|
29
|
+
- no behavior change for existing users
|
|
30
|
+
|
|
31
|
+
### 2. Manual spans over automatic framework spans
|
|
32
|
+
|
|
33
|
+
We should not rely on broad auto-instrumentation for FastAPI, MCP, SQLAlchemy, or HTTP as the primary experience.
|
|
34
|
+
|
|
35
|
+
Why:
|
|
36
|
+
|
|
37
|
+
- auto-generated span names are often generic
|
|
38
|
+
- routes and middleware produce too many low-signal spans
|
|
39
|
+
- it becomes harder to answer product questions like "why was `write_note` slow?" or "where did sync time go?"
|
|
40
|
+
|
|
41
|
+
The preferred model is:
|
|
42
|
+
|
|
43
|
+
- one meaningful root span per high-level operation
|
|
44
|
+
- a small number of child spans for important phases
|
|
45
|
+
- optional targeted instrumentation only where it adds clear value
|
|
46
|
+
|
|
47
|
+
### 3. Logs must live inside traces
|
|
48
|
+
|
|
49
|
+
Basic Memory already uses `loguru` pervasively. The Logfire integration should preserve that and make those logs visible inside the active trace/span context.
|
|
50
|
+
|
|
51
|
+
If traces exist but the logs are detached from them, the integration is not doing its job.
|
|
52
|
+
|
|
53
|
+
### 4. Stable names, selective attributes
|
|
54
|
+
|
|
55
|
+
Span names should describe the operation class, not the specific input.
|
|
56
|
+
|
|
57
|
+
Good:
|
|
58
|
+
|
|
59
|
+
- `mcp.tool.write_note`
|
|
60
|
+
- `sync.project.scan`
|
|
61
|
+
- `search.execute`
|
|
62
|
+
- `routing.resolve_project`
|
|
63
|
+
|
|
64
|
+
Bad:
|
|
65
|
+
|
|
66
|
+
- `Searching for "foo bar baz"`
|
|
67
|
+
- `POST /v2/projects/123/search/`
|
|
68
|
+
- `write note to /specs/api.md`
|
|
69
|
+
|
|
70
|
+
Dynamic values belong in attributes, not in the span name.
|
|
71
|
+
|
|
72
|
+
## What We Should Not Do
|
|
73
|
+
|
|
74
|
+
### Avoid broad FastAPI auto-instrumentation
|
|
75
|
+
|
|
76
|
+
We should not turn on `instrument_fastapi()` and treat that as the main telemetry story.
|
|
77
|
+
|
|
78
|
+
It may still be useful in narrowly scoped debugging, but it should not define the production trace shape. The meaningful root spans should come from Basic Memory's own entrypoints and service boundaries.
|
|
79
|
+
|
|
80
|
+
### Avoid per-file spans by default
|
|
81
|
+
|
|
82
|
+
`sync` can process many files. A span per file will explode trace cardinality and make performance views noisy.
|
|
83
|
+
|
|
84
|
+
Default behavior should be:
|
|
85
|
+
|
|
86
|
+
- one span for the project sync
|
|
87
|
+
- child spans for scan, move handling, delete handling, markdown sync batch, relation resolution, embedding sync, watermark update
|
|
88
|
+
- per-file spans only for failures or very slow outliers
|
|
89
|
+
|
|
90
|
+
### Avoid high-cardinality attributes on every span
|
|
91
|
+
|
|
92
|
+
Do not attach large or highly variable values everywhere:
|
|
93
|
+
|
|
94
|
+
- raw note content
|
|
95
|
+
- file bodies
|
|
96
|
+
- long search text
|
|
97
|
+
- arbitrary metadata blobs
|
|
98
|
+
- unique IDs that make every span shape distinct
|
|
99
|
+
|
|
100
|
+
Prefer compact, queryable attributes:
|
|
101
|
+
|
|
102
|
+
- `project_name`
|
|
103
|
+
- `workspace_id`
|
|
104
|
+
- `route_mode`
|
|
105
|
+
- `scan_type`
|
|
106
|
+
- `file_count`
|
|
107
|
+
- `result_count`
|
|
108
|
+
- `search_type`
|
|
109
|
+
- `retrieval_mode`
|
|
110
|
+
- `duration_ms`
|
|
111
|
+
|
|
112
|
+
## Proposed Architecture
|
|
113
|
+
|
|
114
|
+
Add a dedicated telemetry module in core Basic Memory, separate from logging setup.
|
|
115
|
+
|
|
116
|
+
Suggested shape:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# basic_memory/telemetry.py
|
|
120
|
+
|
|
121
|
+
def configure_telemetry(service_name: str, *, enable_logfire: bool) -> None: ...
|
|
122
|
+
def telemetry_enabled() -> bool: ...
|
|
123
|
+
def span(name: str, **attrs): ...
|
|
124
|
+
def bind_telemetry_context(**attrs): ...
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
This module should:
|
|
128
|
+
|
|
129
|
+
- configure Logfire only when explicitly enabled
|
|
130
|
+
- set up the Logfire `loguru` handler
|
|
131
|
+
- expose lightweight helpers so application code does not import `logfire` directly everywhere
|
|
132
|
+
- degrade cleanly to no-op behavior when disabled
|
|
133
|
+
|
|
134
|
+
This keeps the rest of the codebase readable and makes it easy to reason about what telemetry is doing.
|
|
135
|
+
|
|
136
|
+
## Logging Integration Strategy
|
|
137
|
+
|
|
138
|
+
### Goal
|
|
139
|
+
|
|
140
|
+
When a span is active, logs emitted through `loguru` during that operation should show up in the same trace.
|
|
141
|
+
|
|
142
|
+
### Preferred design
|
|
143
|
+
|
|
144
|
+
1. Configure Logfire once in the telemetry bootstrap
|
|
145
|
+
2. Add the Logfire `loguru` handler to the existing `loguru` configuration
|
|
146
|
+
3. At operation boundaries, bind stable contextual fields with `loguru`
|
|
147
|
+
4. Let logs emitted inside the span inherit the active trace context
|
|
148
|
+
|
|
149
|
+
### Context to bind
|
|
150
|
+
|
|
151
|
+
Bind only the fields that help correlate work across the system:
|
|
152
|
+
|
|
153
|
+
- `service_name`
|
|
154
|
+
- `entrypoint`
|
|
155
|
+
- `project_name`
|
|
156
|
+
- `workspace_id`
|
|
157
|
+
- `route_mode`
|
|
158
|
+
- `tool_name`
|
|
159
|
+
- `command_name`
|
|
160
|
+
|
|
161
|
+
This binding should happen at the root of an operation, not deep in leaf functions.
|
|
162
|
+
|
|
163
|
+
### Important nuance
|
|
164
|
+
|
|
165
|
+
We should not try to encode the entire trace model into logger extras. The logger context should be a human-meaningful slice of the active operation. Trace linkage comes from the active Logfire/OpenTelemetry context; logger extras are there to improve searchability and readability.
|
|
166
|
+
|
|
167
|
+
## Span Model
|
|
168
|
+
|
|
169
|
+
### Root spans
|
|
170
|
+
|
|
171
|
+
Each user-visible or system-visible operation should get one root span.
|
|
172
|
+
|
|
173
|
+
Examples:
|
|
174
|
+
|
|
175
|
+
- `cli.command.status`
|
|
176
|
+
- `cli.command.project_sync`
|
|
177
|
+
- `api.request.search`
|
|
178
|
+
- `mcp.tool.write_note`
|
|
179
|
+
- `mcp.tool.read_note`
|
|
180
|
+
- `mcp.tool.search_notes`
|
|
181
|
+
- `sync.project.run`
|
|
182
|
+
- `db.semantic_backfill`
|
|
183
|
+
|
|
184
|
+
### Child spans
|
|
185
|
+
|
|
186
|
+
Child spans should represent real phases whose duration we care about.
|
|
187
|
+
|
|
188
|
+
Examples:
|
|
189
|
+
|
|
190
|
+
- `routing.client_session`
|
|
191
|
+
- `routing.resolve_project`
|
|
192
|
+
- `routing.resolve_workspace`
|
|
193
|
+
- `api.search.execute`
|
|
194
|
+
- `sync.project.scan`
|
|
195
|
+
- `sync.project.detect_moves`
|
|
196
|
+
- `sync.project.apply_changes`
|
|
197
|
+
- `sync.project.resolve_relations`
|
|
198
|
+
- `sync.project.sync_embeddings`
|
|
199
|
+
- `sync.file.markdown`
|
|
200
|
+
- `sync.file.regular`
|
|
201
|
+
- `search.execute`
|
|
202
|
+
- `search.relaxed_fts_retry`
|
|
203
|
+
- `db.init`
|
|
204
|
+
- `db.migrate`
|
|
205
|
+
|
|
206
|
+
### Span naming rules
|
|
207
|
+
|
|
208
|
+
- Use dot-separated names
|
|
209
|
+
- Start with subsystem
|
|
210
|
+
- Keep the verb at the end
|
|
211
|
+
- Keep names stable across runs
|
|
212
|
+
- Never include request-specific text in the span name
|
|
213
|
+
|
|
214
|
+
## Attribute Taxonomy
|
|
215
|
+
|
|
216
|
+
### Required attributes on root spans
|
|
217
|
+
|
|
218
|
+
Every root span should have a small common set:
|
|
219
|
+
|
|
220
|
+
- `service_name`
|
|
221
|
+
- `entrypoint`
|
|
222
|
+
- `project_name` when applicable
|
|
223
|
+
- `workspace_id` when applicable
|
|
224
|
+
- `route_mode` with values like `local_asgi`, `cloud_proxy`, `factory`
|
|
225
|
+
|
|
226
|
+
### Operation-specific attributes
|
|
227
|
+
|
|
228
|
+
Examples:
|
|
229
|
+
|
|
230
|
+
For search:
|
|
231
|
+
|
|
232
|
+
- `search_type`
|
|
233
|
+
- `retrieval_mode`
|
|
234
|
+
- `page`
|
|
235
|
+
- `page_size`
|
|
236
|
+
- `result_count`
|
|
237
|
+
- `fallback_used`
|
|
238
|
+
|
|
239
|
+
For sync:
|
|
240
|
+
|
|
241
|
+
- `scan_type`
|
|
242
|
+
- `force_full`
|
|
243
|
+
- `new_count`
|
|
244
|
+
- `modified_count`
|
|
245
|
+
- `deleted_count`
|
|
246
|
+
- `move_count`
|
|
247
|
+
- `skipped_count`
|
|
248
|
+
- `embeddings_enabled`
|
|
249
|
+
|
|
250
|
+
For note operations:
|
|
251
|
+
|
|
252
|
+
- `tool_name`
|
|
253
|
+
- `note_type`
|
|
254
|
+
- `directory`
|
|
255
|
+
- `overwrite`
|
|
256
|
+
- `output_format`
|
|
257
|
+
|
|
258
|
+
### Attributes to avoid by default
|
|
259
|
+
|
|
260
|
+
- full `query.text`
|
|
261
|
+
- full note titles if they create privacy or cardinality issues
|
|
262
|
+
- file content
|
|
263
|
+
- raw frontmatter
|
|
264
|
+
- raw HTTP bodies
|
|
265
|
+
|
|
266
|
+
If we need richer payloads for a local debugging session, that should be an explicit temporary mode, not the default telemetry shape.
|
|
267
|
+
|
|
268
|
+
## Instrumentation Plan By Layer
|
|
269
|
+
|
|
270
|
+
### 1. Entrypoints
|
|
271
|
+
|
|
272
|
+
Instrument these first:
|
|
273
|
+
|
|
274
|
+
- `cli.app` callback and major commands
|
|
275
|
+
- API lifespan and selected routers
|
|
276
|
+
- MCP server lifespan
|
|
277
|
+
- MCP tool entrypoints
|
|
278
|
+
|
|
279
|
+
Why:
|
|
280
|
+
|
|
281
|
+
- this establishes clean root spans
|
|
282
|
+
- it gives us trace boundaries that match how users think about the product
|
|
283
|
+
|
|
284
|
+
### 2. Routing and context resolution
|
|
285
|
+
|
|
286
|
+
Instrument:
|
|
287
|
+
|
|
288
|
+
- client routing decisions
|
|
289
|
+
- workspace resolution
|
|
290
|
+
- project resolution
|
|
291
|
+
- default-project fallback
|
|
292
|
+
|
|
293
|
+
Why:
|
|
294
|
+
|
|
295
|
+
- Basic Memory has local/cloud/per-project routing logic
|
|
296
|
+
- when something is slow or surprising, we need to know which path was taken
|
|
297
|
+
|
|
298
|
+
### 3. Sync and indexing
|
|
299
|
+
|
|
300
|
+
This is the highest-value area to instrument deeply.
|
|
301
|
+
|
|
302
|
+
Instrument:
|
|
303
|
+
|
|
304
|
+
- sync root
|
|
305
|
+
- scan strategy decision
|
|
306
|
+
- filesystem scan
|
|
307
|
+
- move detection
|
|
308
|
+
- delete handling
|
|
309
|
+
- markdown sync phase
|
|
310
|
+
- relation resolution
|
|
311
|
+
- vector embedding sync
|
|
312
|
+
- scan watermark update
|
|
313
|
+
|
|
314
|
+
Why:
|
|
315
|
+
|
|
316
|
+
- this is where performance work will happen
|
|
317
|
+
- cloud and local both benefit from this visibility
|
|
318
|
+
|
|
319
|
+
### 4. Search
|
|
320
|
+
|
|
321
|
+
Instrument:
|
|
322
|
+
|
|
323
|
+
- search execution
|
|
324
|
+
- retrieval mode
|
|
325
|
+
- relaxed FTS fallback
|
|
326
|
+
- result shaping
|
|
327
|
+
|
|
328
|
+
Why:
|
|
329
|
+
|
|
330
|
+
- search is user-facing and latency-sensitive
|
|
331
|
+
- hybrid/vector/FTS paths need to be distinguishable
|
|
332
|
+
|
|
333
|
+
### 5. Database and initialization
|
|
334
|
+
|
|
335
|
+
Instrument selectively:
|
|
336
|
+
|
|
337
|
+
- DB init
|
|
338
|
+
- migrations
|
|
339
|
+
- semantic backfill
|
|
340
|
+
- connection mode selection
|
|
341
|
+
|
|
342
|
+
Avoid full automatic SQL span firehose by default.
|
|
343
|
+
|
|
344
|
+
## Recommended Rollout Phases
|
|
345
|
+
|
|
346
|
+
## Task List
|
|
347
|
+
|
|
348
|
+
- [x] Phase 1: Bootstrap and config gating
|
|
349
|
+
- [x] Phase 2: Root spans for entrypoints and primary operations
|
|
350
|
+
- [x] Phase 3: Child spans for sync, search, and routing
|
|
351
|
+
- [x] Phase 4: Failure-focused detail and final verification
|
|
352
|
+
- [x] Phase 5: Loguru context binding and scoped context inheritance
|
|
353
|
+
|
|
354
|
+
## Recommended Rollout Phases
|
|
355
|
+
|
|
356
|
+
### Phase 1: Bootstrap and config gating
|
|
357
|
+
|
|
358
|
+
Add:
|
|
359
|
+
|
|
360
|
+
- telemetry bootstrap module
|
|
361
|
+
- config/env gating
|
|
362
|
+
- `loguru` + Logfire handler integration
|
|
363
|
+
|
|
364
|
+
This gives immediate value with low noise.
|
|
365
|
+
|
|
366
|
+
### Phase 2: Root spans for entrypoints and primary operations
|
|
367
|
+
|
|
368
|
+
Add:
|
|
369
|
+
|
|
370
|
+
- root spans for CLI, API, MCP, and main MCP tools
|
|
371
|
+
- stable root attributes for project, workspace, route mode, and operation type
|
|
372
|
+
|
|
373
|
+
This gives us clean top-level traces that match how users think about the product.
|
|
374
|
+
|
|
375
|
+
### Phase 3: Child spans for sync, search, and routing
|
|
376
|
+
|
|
377
|
+
Add child spans to:
|
|
378
|
+
|
|
379
|
+
- sync
|
|
380
|
+
- search
|
|
381
|
+
- routing
|
|
382
|
+
|
|
383
|
+
This is the main performance-investigation layer.
|
|
384
|
+
|
|
385
|
+
### Phase 4: Failure-focused detail
|
|
386
|
+
|
|
387
|
+
Add selective deeper spans/log enrichment for:
|
|
388
|
+
|
|
389
|
+
- sync failures
|
|
390
|
+
- relation resolution failures
|
|
391
|
+
- slow file operations
|
|
392
|
+
- cloud routing/auth failures
|
|
393
|
+
|
|
394
|
+
This keeps normal traces clean while improving debuggability.
|
|
395
|
+
|
|
396
|
+
### Phase 5: Loguru context binding and scoped context inheritance
|
|
397
|
+
|
|
398
|
+
Add:
|
|
399
|
+
|
|
400
|
+
- context-local telemetry state in `basic_memory.telemetry`
|
|
401
|
+
- a shared `scope(...)` helper that opens a span and binds stable logger context together
|
|
402
|
+
- context inheritance for routing, sync, and search so downstream `loguru` logs carry the active operation fields
|
|
403
|
+
|
|
404
|
+
This makes the trace view and the log stream tell the same story without forcing logger rewrites across the codebase.
|
|
405
|
+
|
|
406
|
+
## Local Dev Playbook
|
|
407
|
+
|
|
408
|
+
The fastest way to sanity-check the current trace shape is:
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
LOGFIRE_TOKEN=lf_... just telemetry-smoke
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
What this does:
|
|
415
|
+
|
|
416
|
+
- creates an isolated temp home, config dir, and project path
|
|
417
|
+
- enables Logfire for the run
|
|
418
|
+
- automatically exports to Logfire when `LOGFIRE_TOKEN` is present
|
|
419
|
+
- defaults `BASIC_MEMORY_SEMANTIC_SEARCH_ENABLED=false` so the smoke run stays fast and trace-friendly
|
|
420
|
+
- disables promo telemetry so the trace is about Basic Memory work, not analytics noise
|
|
421
|
+
- runs a small CLI workflow:
|
|
422
|
+
- `project add`
|
|
423
|
+
- `tool write-note`
|
|
424
|
+
- `tool read-note`
|
|
425
|
+
- `tool edit-note`
|
|
426
|
+
- `tool build-context`
|
|
427
|
+
- `tool search-notes`
|
|
428
|
+
- `doctor`
|
|
429
|
+
|
|
430
|
+
If you want to exercise the instrumentation without exporting anything upstream:
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
BASIC_MEMORY_LOGFIRE_SEND_TO_LOGFIRE=false just telemetry-smoke
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
If you want the smoke run to include vector or hybrid retrieval spans too:
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
LOGFIRE_TOKEN=lf_... BASIC_MEMORY_SEMANTIC_SEARCH_ENABLED=true just telemetry-smoke
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
The recipe sets `BASIC_MEMORY_LOGFIRE_ENVIRONMENT=telemetry-smoke` by default so these traces are easy to isolate in Logfire. Override it if you want the smoke traces grouped under a different environment name.
|
|
443
|
+
|
|
444
|
+
### What to look for
|
|
445
|
+
|
|
446
|
+
You should see a small set of comparable root spans rather than a framework-generated span forest:
|
|
447
|
+
|
|
448
|
+
- `cli.command.project`
|
|
449
|
+
- `cli.command.tool`
|
|
450
|
+
- `mcp.tool.write_note`
|
|
451
|
+
- `mcp.tool.read_note`
|
|
452
|
+
- `mcp.tool.edit_note`
|
|
453
|
+
- `mcp.tool.build_context`
|
|
454
|
+
- `mcp.tool.search_notes`
|
|
455
|
+
- `sync.project.run`
|
|
456
|
+
|
|
457
|
+
You should also see correlated logs under those traces with stable fields like:
|
|
458
|
+
|
|
459
|
+
- `project_name`
|
|
460
|
+
- `route_mode`
|
|
461
|
+
- `tool_name`
|
|
462
|
+
- `entrypoint`
|
|
463
|
+
|
|
464
|
+
### Expected nuance
|
|
465
|
+
|
|
466
|
+
`doctor` creates its own temporary project on purpose. That means the sync trace will usually show a different project name than the `telemetry-smoke` write/search traces. That is fine for smoke testing because the goal is to confirm:
|
|
467
|
+
|
|
468
|
+
- root span names are meaningful
|
|
469
|
+
- scoped logs stay attached to the active trace
|
|
470
|
+
- routing, tool, search, and sync phases are easy to distinguish
|
|
471
|
+
|
|
472
|
+
## Validation Checklist
|
|
473
|
+
|
|
474
|
+
We should consider the integration successful when the following are true:
|
|
475
|
+
|
|
476
|
+
1. With telemetry disabled, Basic Memory behaves exactly as it does today.
|
|
477
|
+
2. With telemetry enabled, one user action produces one obvious root span.
|
|
478
|
+
3. Logs emitted during that action are visible inside the same trace.
|
|
479
|
+
4. A search in Logfire for `mcp.tool.write_note` or `sync.project.run` returns comparable spans across runs.
|
|
480
|
+
5. Trace views show phase timing clearly without drowning in framework noise.
|
|
481
|
+
6. Sensitive payloads are not captured by default.
|
|
482
|
+
|
|
483
|
+
## Immediate Implementation Direction
|
|
484
|
+
|
|
485
|
+
When we start coding, the first pass should be:
|
|
486
|
+
|
|
487
|
+
1. Add `basic_memory.telemetry`
|
|
488
|
+
2. Add config/env switches for `enabled`, `send_to_logfire`, and service name
|
|
489
|
+
3. Wire telemetry bootstrap into CLI, API, and MCP entrypoints
|
|
490
|
+
4. Configure `loguru` to emit to both existing sinks and the Logfire handler when enabled
|
|
491
|
+
5. Add manual root spans around:
|
|
492
|
+
- CLI commands
|
|
493
|
+
- API request handlers we care about
|
|
494
|
+
- MCP tool entrypoints
|
|
495
|
+
- sync root
|
|
496
|
+
- search root
|
|
497
|
+
6. Add child spans to the sync and routing phases only after the root span model feels clean
|
|
498
|
+
|
|
499
|
+
That gives us a strong foundation without repeating the earlier "turn on instrumentation everywhere" approach.
|
|
@@ -205,6 +205,51 @@ doctor:
|
|
|
205
205
|
BASIC_MEMORY_CONFIG_DIR="$TMP_CONFIG" \
|
|
206
206
|
./.venv/bin/python -m basic_memory.cli.main doctor --local
|
|
207
207
|
|
|
208
|
+
# Run an isolated Logfire smoke workflow for local trace inspection
|
|
209
|
+
telemetry-smoke:
|
|
210
|
+
#!/usr/bin/env bash
|
|
211
|
+
set -euo pipefail
|
|
212
|
+
TMP_HOME=$(mktemp -d)
|
|
213
|
+
TMP_CONFIG=$(mktemp -d)
|
|
214
|
+
TMP_PROJECT=$(mktemp -d)
|
|
215
|
+
export HOME="$TMP_HOME"
|
|
216
|
+
export BASIC_MEMORY_ENV="${BASIC_MEMORY_ENV:-dev}"
|
|
217
|
+
export BASIC_MEMORY_HOME="$TMP_PROJECT/home-root"
|
|
218
|
+
export BASIC_MEMORY_CONFIG_DIR="$TMP_CONFIG"
|
|
219
|
+
export BASIC_MEMORY_NO_PROMOS=1
|
|
220
|
+
export BASIC_MEMORY_LOG_LEVEL="${BASIC_MEMORY_LOG_LEVEL:-INFO}"
|
|
221
|
+
export BASIC_MEMORY_SEMANTIC_SEARCH_ENABLED="${BASIC_MEMORY_SEMANTIC_SEARCH_ENABLED:-false}"
|
|
222
|
+
export BASIC_MEMORY_LOGFIRE_ENABLED="${BASIC_MEMORY_LOGFIRE_ENABLED:-true}"
|
|
223
|
+
export BASIC_MEMORY_LOGFIRE_ENVIRONMENT="${BASIC_MEMORY_LOGFIRE_ENVIRONMENT:-telemetry-smoke}"
|
|
224
|
+
if [[ -z "${BASIC_MEMORY_LOGFIRE_SEND_TO_LOGFIRE:-}" ]]; then
|
|
225
|
+
if [[ -n "${LOGFIRE_TOKEN:-}" ]]; then
|
|
226
|
+
export BASIC_MEMORY_LOGFIRE_SEND_TO_LOGFIRE=true
|
|
227
|
+
else
|
|
228
|
+
export BASIC_MEMORY_LOGFIRE_SEND_TO_LOGFIRE=false
|
|
229
|
+
fi
|
|
230
|
+
fi
|
|
231
|
+
mkdir -p "$BASIC_MEMORY_HOME"
|
|
232
|
+
echo "Telemetry smoke setup:"
|
|
233
|
+
echo " logfire_enabled=$BASIC_MEMORY_LOGFIRE_ENABLED"
|
|
234
|
+
echo " send_to_logfire=$BASIC_MEMORY_LOGFIRE_SEND_TO_LOGFIRE"
|
|
235
|
+
echo " log_level=$BASIC_MEMORY_LOG_LEVEL"
|
|
236
|
+
echo " semantic_search_enabled=$BASIC_MEMORY_SEMANTIC_SEARCH_ENABLED"
|
|
237
|
+
echo " logfire_environment=$BASIC_MEMORY_LOGFIRE_ENVIRONMENT"
|
|
238
|
+
echo " project_path=$TMP_PROJECT"
|
|
239
|
+
./.venv/bin/python -m basic_memory.cli.main project add telemetry-smoke "$TMP_PROJECT" --default --local
|
|
240
|
+
./.venv/bin/python -m basic_memory.cli.main tool write-note --title "Telemetry Smoke" --folder notes --content "hello from smoke" --project telemetry-smoke --local
|
|
241
|
+
./.venv/bin/python -m basic_memory.cli.main tool read-note notes/telemetry-smoke --project telemetry-smoke --local
|
|
242
|
+
./.venv/bin/python -m basic_memory.cli.main tool edit-note notes/telemetry-smoke --operation append --content $'\n\nsmoke edit line' --project telemetry-smoke --local
|
|
243
|
+
./.venv/bin/python -m basic_memory.cli.main tool build-context notes/telemetry-smoke --project telemetry-smoke --local --page-size 5 --max-related 5
|
|
244
|
+
./.venv/bin/python -m basic_memory.cli.main tool search-notes telemetry --project telemetry-smoke --local
|
|
245
|
+
./.venv/bin/python -m basic_memory.cli.main doctor --local
|
|
246
|
+
echo ""
|
|
247
|
+
echo "Telemetry smoke complete."
|
|
248
|
+
echo "Search Logfire for:"
|
|
249
|
+
echo " service_name: basic-memory-cli"
|
|
250
|
+
echo " environment: $BASIC_MEMORY_LOGFIRE_ENVIRONMENT"
|
|
251
|
+
echo " span names: mcp.tool.write_note, mcp.tool.read_note, mcp.tool.edit_note, mcp.tool.build_context, mcp.tool.search_notes, sync.project.run"
|
|
252
|
+
|
|
208
253
|
|
|
209
254
|
# Update all dependencies to latest versions
|
|
210
255
|
update-deps:
|
|
@@ -58,6 +58,9 @@ Documentation = "https://github.com/basicmachines-co/basic-memory#readme"
|
|
|
58
58
|
basic-memory = "basic_memory.cli.main:app"
|
|
59
59
|
bm = "basic_memory.cli.main:app"
|
|
60
60
|
|
|
61
|
+
[project.optional-dependencies]
|
|
62
|
+
telemetry = ["logfire>=4.19.0"]
|
|
63
|
+
|
|
61
64
|
[build-system]
|
|
62
65
|
requires = ["hatchling", "uv-dynamic-versioning>=0.7.0"]
|
|
63
66
|
build-backend = "hatchling.build"
|
|
@@ -83,6 +86,7 @@ target-version = "py312"
|
|
|
83
86
|
|
|
84
87
|
[dependency-groups]
|
|
85
88
|
dev = [
|
|
89
|
+
"logfire>=4.19.0",
|
|
86
90
|
"gevent>=24.11.1",
|
|
87
91
|
"icecream>=2.1.3",
|
|
88
92
|
"pytest>=8.3.4",
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/basicmachines-co/basic-memory.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.20.
|
|
9
|
+
"version": "0.20.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.20.
|
|
14
|
+
"version": "0.20.3",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
16
|
"runtimeArguments": [
|
|
17
17
|
{"type": "positional", "value": "basic-memory"},
|
|
@@ -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.20.
|
|
4
|
+
__version__ = "0.20.3"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -25,6 +25,7 @@ from basic_memory.api.v2.routers.project_router import (
|
|
|
25
25
|
list_projects,
|
|
26
26
|
synchronize_projects,
|
|
27
27
|
)
|
|
28
|
+
from basic_memory import telemetry
|
|
28
29
|
from basic_memory.config import init_api_logging
|
|
29
30
|
from basic_memory.services.exceptions import EntityAlreadyExistsError
|
|
30
31
|
from basic_memory.services.initialization import initialize_app
|
|
@@ -43,30 +44,39 @@ async def lifespan(app: FastAPI): # pragma: no cover
|
|
|
43
44
|
set_container(container)
|
|
44
45
|
app.state.container = container
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
with telemetry.operation(
|
|
48
|
+
"api.lifecycle.startup",
|
|
49
|
+
entrypoint="api",
|
|
50
|
+
mode=container.mode.name.lower(),
|
|
51
|
+
):
|
|
52
|
+
logger.info(f"Starting Basic Memory API (mode={container.mode.name})")
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
await initialize_app(container.config)
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
# Cache database connections in app state for performance
|
|
57
|
+
logger.info("Initializing database and caching connections...")
|
|
58
|
+
engine, session_maker = await container.init_database()
|
|
59
|
+
app.state.engine = engine
|
|
60
|
+
app.state.session_maker = session_maker
|
|
61
|
+
logger.info("Database connections cached in app state")
|
|
56
62
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
# Create and start sync coordinator (lifecycle centralized in coordinator)
|
|
64
|
+
sync_coordinator = container.create_sync_coordinator()
|
|
65
|
+
await sync_coordinator.start()
|
|
66
|
+
app.state.sync_coordinator = sync_coordinator
|
|
61
67
|
|
|
62
68
|
# Proceed with startup
|
|
63
69
|
yield
|
|
64
70
|
|
|
65
71
|
# Shutdown - coordinator handles clean task cancellation
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
with telemetry.operation(
|
|
73
|
+
"api.lifecycle.shutdown",
|
|
74
|
+
entrypoint="api",
|
|
75
|
+
mode=container.mode.name.lower(),
|
|
76
|
+
):
|
|
77
|
+
logger.info("Shutting down Basic Memory API")
|
|
78
|
+
await sync_coordinator.stop()
|
|
79
|
+
await container.shutdown_database()
|
|
70
80
|
|
|
71
81
|
|
|
72
82
|
# Initialize FastAPI app
|