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.
Files changed (655) hide show
  1. {basic_memory-0.20.1 → basic_memory-0.20.3}/CHANGELOG.md +17 -0
  2. {basic_memory-0.20.1 → basic_memory-0.20.3}/PKG-INFO +3 -1
  3. basic_memory-0.20.3/docs/logfire-instrumentation-strategy.md +499 -0
  4. {basic_memory-0.20.1 → basic_memory-0.20.3}/justfile +45 -0
  5. {basic_memory-0.20.1 → basic_memory-0.20.3}/pyproject.toml +4 -0
  6. {basic_memory-0.20.1 → basic_memory-0.20.3}/server.json +2 -2
  7. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/__init__.py +1 -1
  8. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/app.py +26 -16
  9. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/search_router.py +33 -22
  10. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/app.py +9 -0
  11. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/auto_update.py +5 -7
  12. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/api_client.py +15 -3
  13. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/doctor.py +6 -3
  14. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/config.py +47 -4
  15. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/file_utils.py +5 -0
  16. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/async_client.py +21 -15
  17. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/project_context.py +263 -171
  18. basic_memory-0.20.3/src/basic_memory/mcp/server.py +181 -0
  19. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/build_context.py +60 -24
  20. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/delete_note.py +12 -1
  21. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/edit_note.py +252 -211
  22. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/move_note.py +7 -6
  23. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/read_content.py +13 -1
  24. basic_memory-0.20.3/src/basic_memory/mcp/tools/read_note.py +459 -0
  25. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/search.py +163 -129
  26. basic_memory-0.20.3/src/basic_memory/mcp/tools/write_note.py +345 -0
  27. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/runtime.py +10 -3
  28. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/project_service.py +19 -7
  29. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/search_service.py +95 -28
  30. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/sync_service.py +379 -301
  31. basic_memory-0.20.3/src/basic_memory/telemetry.py +209 -0
  32. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/utils.py +25 -4
  33. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_string_params_integration.py +1 -3
  34. basic_memory-0.20.3/tests/api/v2/test_search_router_telemetry.py +62 -0
  35. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_cloud_api_client_and_utils.py +68 -0
  36. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_auto_update.py +25 -0
  37. basic_memory-0.20.3/tests/cli/test_cli_telemetry.py +49 -0
  38. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/conftest.py +6 -0
  39. basic_memory-0.20.3/tests/mcp/test_async_client_telemetry.py +46 -0
  40. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_project_context.py +21 -0
  41. basic_memory-0.20.3/tests/mcp/test_project_context_telemetry.py +94 -0
  42. basic_memory-0.20.3/tests/mcp/test_server_telemetry.py +33 -0
  43. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_delete_note.py +55 -0
  44. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_edit_note.py +59 -0
  45. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_search.py +64 -2
  46. basic_memory-0.20.3/tests/mcp/test_tool_telemetry.py +309 -0
  47. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_embedding_status.py +49 -0
  48. basic_memory-0.20.3/tests/services/test_search_service_telemetry.py +73 -0
  49. basic_memory-0.20.3/tests/sync/test_sync_service_telemetry.py +170 -0
  50. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_coerce.py +0 -1
  51. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_config.py +16 -0
  52. basic_memory-0.20.3/tests/test_telemetry.py +296 -0
  53. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_file_utils.py +13 -0
  54. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_setup_logging.py +51 -0
  55. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_validate_project_path.py +48 -0
  56. {basic_memory-0.20.1 → basic_memory-0.20.3}/uv.lock +168 -65
  57. basic_memory-0.20.1/src/basic_memory/mcp/server.py +0 -167
  58. basic_memory-0.20.1/src/basic_memory/mcp/tools/read_note.py +0 -432
  59. basic_memory-0.20.1/src/basic_memory/mcp/tools/write_note.py +0 -325
  60. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/beta.md +0 -0
  61. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/changelog.md +0 -0
  62. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/release-check.md +0 -0
  63. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/release/release.md +0 -0
  64. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/spec.md +0 -0
  65. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/commands/test-live.md +0 -0
  66. {basic_memory-0.20.1 → basic_memory-0.20.3}/.claude/settings.json +0 -0
  67. {basic_memory-0.20.1 → basic_memory-0.20.3}/.dockerignore +0 -0
  68. {basic_memory-0.20.1 → basic_memory-0.20.3}/.env.example +0 -0
  69. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  70. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  71. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  72. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  73. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/dependabot.yml +0 -0
  74. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude-code-review.yml +0 -0
  75. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude-issue-triage.yml +0 -0
  76. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/claude.yml +0 -0
  77. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/dev-release.yml +0 -0
  78. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/docker.yml +0 -0
  79. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/pr-title.yml +0 -0
  80. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/release.yml +0 -0
  81. {basic_memory-0.20.1 → basic_memory-0.20.3}/.github/workflows/test.yml +0 -0
  82. {basic_memory-0.20.1 → basic_memory-0.20.3}/.gitignore +0 -0
  83. {basic_memory-0.20.1 → basic_memory-0.20.3}/.python-version +0 -0
  84. {basic_memory-0.20.1 → basic_memory-0.20.3}/AGENTS.md +0 -0
  85. {basic_memory-0.20.1 → basic_memory-0.20.3}/CITATION.cff +0 -0
  86. {basic_memory-0.20.1 → basic_memory-0.20.3}/CLA.md +0 -0
  87. {basic_memory-0.20.1 → basic_memory-0.20.3}/CLAUDE.md +0 -0
  88. {basic_memory-0.20.1 → basic_memory-0.20.3}/CODE_OF_CONDUCT.md +0 -0
  89. {basic_memory-0.20.1 → basic_memory-0.20.3}/CONTRIBUTING.md +0 -0
  90. {basic_memory-0.20.1 → basic_memory-0.20.3}/Dockerfile +0 -0
  91. {basic_memory-0.20.1 → basic_memory-0.20.3}/LICENSE +0 -0
  92. {basic_memory-0.20.1 → basic_memory-0.20.3}/NOTE-FORMAT.md +0 -0
  93. {basic_memory-0.20.1 → basic_memory-0.20.3}/README.md +0 -0
  94. {basic_memory-0.20.1 → basic_memory-0.20.3}/SECURITY.md +0 -0
  95. {basic_memory-0.20.1 → basic_memory-0.20.3}/docker-compose-postgres.yml +0 -0
  96. {basic_memory-0.20.1 → basic_memory-0.20.3}/docker-compose.yml +0 -0
  97. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/ARCHITECTURE.md +0 -0
  98. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/Docker.md +0 -0
  99. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/NOTE-FORMAT.md +0 -0
  100. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
  101. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/ai-assistant-guide-extended.md +0 -0
  102. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/character-handling.md +0 -0
  103. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/cloud-cli.md +0 -0
  104. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/cloud-semantic-search-value.md +0 -0
  105. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/mcp-ui-bakeoff-instructions.md +0 -0
  106. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/metadata-search.md +0 -0
  107. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/post-v0.18.0-test-plan.md +0 -0
  108. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/releases/v0.19.0.md +0 -0
  109. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/semantic-search-test-log.md +0 -0
  110. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/semantic-search.md +0 -0
  111. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
  112. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
  113. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/specs/SPEC-SCHEMA.md +0 -0
  114. {basic_memory-0.20.1 → basic_memory-0.20.3}/docs/testing-coverage.md +0 -0
  115. {basic_memory-0.20.1 → basic_memory-0.20.3}/llms-install.md +0 -0
  116. {basic_memory-0.20.1 → basic_memory-0.20.3}/smithery.yaml +0 -0
  117. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/alembic.ini +0 -0
  118. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/env.py +0 -0
  119. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/migrations.py +0 -0
  120. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/script.py.mako +0 -0
  121. {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
  122. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  123. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  124. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  125. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  126. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  127. {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
  128. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  129. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  130. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  131. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  132. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  133. {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
  134. {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
  135. {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
  136. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
  137. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
  138. {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
  139. {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
  140. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/__init__.py +0 -0
  141. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/container.py +0 -0
  142. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/template_loader.py +0 -0
  143. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/__init__.py +0 -0
  144. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  145. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  146. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  147. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  148. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  149. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  150. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  151. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  152. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
  153. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/api/v2/utils.py +0 -0
  154. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/__init__.py +0 -0
  155. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/analytics.py +0 -0
  156. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/auth.py +0 -0
  157. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/__init__.py +0 -0
  158. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  159. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  160. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  161. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  162. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
  163. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  164. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  165. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  166. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  167. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  168. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  169. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  170. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  171. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
  172. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/command_utils.py +0 -0
  173. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/db.py +0 -0
  174. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/format.py +0 -0
  175. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  176. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  177. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  178. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  179. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/mcp.py +0 -0
  180. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/project.py +0 -0
  181. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/routing.py +0 -0
  182. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/schema.py +0 -0
  183. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/status.py +0 -0
  184. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/tool.py +0 -0
  185. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/commands/update.py +0 -0
  186. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/container.py +0 -0
  187. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/main.py +0 -0
  188. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/cli/promo.py +0 -0
  189. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/db.py +0 -0
  190. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/__init__.py +0 -0
  191. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/config.py +0 -0
  192. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/db.py +0 -0
  193. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/importers.py +0 -0
  194. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/projects.py +0 -0
  195. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/repositories.py +0 -0
  196. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps/services.py +0 -0
  197. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/deps.py +0 -0
  198. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/ignore_utils.py +0 -0
  199. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/__init__.py +0 -0
  200. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/base.py +0 -0
  201. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  202. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  203. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  204. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/memory_json_importer.py +0 -0
  205. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/importers/utils.py +0 -0
  206. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/__init__.py +0 -0
  207. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/entity_parser.py +0 -0
  208. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/markdown_processor.py +0 -0
  209. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/plugins.py +0 -0
  210. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/schemas.py +0 -0
  211. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/markdown/utils.py +0 -0
  212. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/__init__.py +0 -0
  213. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/__init__.py +0 -0
  214. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/directory.py +0 -0
  215. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  216. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/memory.py +0 -0
  217. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/project.py +0 -0
  218. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/resource.py +0 -0
  219. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/schema.py +0 -0
  220. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/clients/search.py +0 -0
  221. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/container.py +0 -0
  222. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/formatting.py +0 -0
  223. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  224. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  225. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  226. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  227. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/search.py +0 -0
  228. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/prompts/utils.py +0 -0
  229. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/__init__.py +0 -0
  230. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  231. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
  232. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/project_info.py +0 -0
  233. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/release_notes.md +0 -0
  234. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/resources/ui.py +0 -0
  235. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/__init__.py +0 -0
  236. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/canvas.py +0 -0
  237. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  238. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
  239. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  240. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/project_management.py +0 -0
  241. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  242. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/release_notes.py +0 -0
  243. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/schema.py +0 -0
  244. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
  245. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/utils.py +0 -0
  246. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/view_note.py +0 -0
  247. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/tools/workspaces.py +0 -0
  248. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/__init__.py +0 -0
  249. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
  250. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
  251. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
  252. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
  253. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
  254. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
  255. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/sdk.py +0 -0
  256. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/mcp/ui/templates.py +0 -0
  257. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/__init__.py +0 -0
  258. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/base.py +0 -0
  259. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/knowledge.py +0 -0
  260. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/project.py +0 -0
  261. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/models/search.py +0 -0
  262. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/project_resolver.py +0 -0
  263. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/__init__.py +0 -0
  264. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/embedding_provider.py +0 -0
  265. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
  266. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/entity_repository.py +0 -0
  267. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/fastembed_provider.py +0 -0
  268. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/metadata_filters.py +0 -0
  269. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/observation_repository.py +0 -0
  270. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/openai_provider.py +0 -0
  271. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  272. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/project_info_repository.py +0 -0
  273. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/project_repository.py +0 -0
  274. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/relation_repository.py +0 -0
  275. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/repository.py +0 -0
  276. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_index_row.py +0 -0
  277. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_repository.py +0 -0
  278. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/search_repository_base.py +0 -0
  279. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/semantic_errors.py +0 -0
  280. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  281. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/__init__.py +0 -0
  282. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/diff.py +0 -0
  283. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/inference.py +0 -0
  284. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/parser.py +0 -0
  285. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/resolver.py +0 -0
  286. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schema/validator.py +0 -0
  287. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/__init__.py +0 -0
  288. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/base.py +0 -0
  289. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/cloud.py +0 -0
  290. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/delete.py +0 -0
  291. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/directory.py +0 -0
  292. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/importer.py +0 -0
  293. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/memory.py +0 -0
  294. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/project_info.py +0 -0
  295. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/prompt.py +0 -0
  296. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/request.py +0 -0
  297. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/response.py +0 -0
  298. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/schema.py +0 -0
  299. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/search.py +0 -0
  300. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/sync_report.py +0 -0
  301. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/__init__.py +0 -0
  302. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/entity.py +0 -0
  303. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/graph.py +0 -0
  304. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/schemas/v2/resource.py +0 -0
  305. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/__init__.py +0 -0
  306. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/context_service.py +0 -0
  307. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/directory_service.py +0 -0
  308. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/entity_service.py +0 -0
  309. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/exceptions.py +0 -0
  310. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/file_service.py +0 -0
  311. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/initialization.py +0 -0
  312. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/link_resolver.py +0 -0
  313. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/services/service.py +0 -0
  314. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/__init__.py +0 -0
  315. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/background_sync.py +0 -0
  316. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/coordinator.py +0 -0
  317. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/sync/watch_service.py +0 -0
  318. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  319. {basic_memory-0.20.1 → basic_memory-0.20.3}/src/basic_memory/templates/prompts/search.hbs +0 -0
  320. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/BENCHMARKS.md +0 -0
  321. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
  322. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
  323. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  324. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_project_commands_integration.py +0 -0
  325. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_routing_integration.py +0 -0
  326. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_search_notes_meta_integration.py +0 -0
  327. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/cli/test_version_integration.py +0 -0
  328. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/compare_search_benchmarks.py +0 -0
  329. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/conftest.py +0 -0
  330. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
  331. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
  332. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
  333. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
  334. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
  335. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
  336. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
  337. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
  338. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
  339. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
  340. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
  341. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
  342. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
  343. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
  344. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
  345. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
  346. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
  347. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
  348. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
  349. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
  350. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
  351. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
  352. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
  353. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
  354. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
  355. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
  356. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
  357. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
  358. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
  359. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
  360. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
  361. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
  362. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
  363. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
  364. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
  365. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
  366. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
  367. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
  368. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
  369. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
  370. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
  371. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
  372. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
  373. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
  374. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
  375. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
  376. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
  377. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
  378. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
  379. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
  380. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
  381. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
  382. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
  383. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
  384. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
  385. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
  386. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
  387. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
  388. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
  389. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Book.md +0 -0
  390. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
  391. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/Person.md +0 -0
  392. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
  393. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
  394. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
  395. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
  396. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
  397. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
  398. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
  399. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
  400. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
  401. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
  402. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
  403. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
  404. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_build_context_underscore.py +0 -0
  405. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_build_context_validation.py +0 -0
  406. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  407. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  408. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_delete_directory_integration.py +0 -0
  409. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_delete_note_integration.py +0 -0
  410. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_edit_note_integration.py +0 -0
  411. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  412. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_list_directory_integration.py +0 -0
  413. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_move_directory_integration.py +0 -0
  414. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_move_note_integration.py +0 -0
  415. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_output_format_json_integration.py +0 -0
  416. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_pagination_integration.py +0 -0
  417. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_permalink_collision_integration.py +0 -0
  418. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_project_management_integration.py +0 -0
  419. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  420. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_read_content_integration.py +0 -0
  421. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_read_note_integration.py +0 -0
  422. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_search_integration.py +0 -0
  423. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  424. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_smoke_integration.py +0 -0
  425. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_ui_sdk_integration.py +0 -0
  426. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/mcp/test_write_note_integration.py +0 -0
  427. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/__init__.py +0 -0
  428. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/conftest.py +0 -0
  429. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/corpus.py +0 -0
  430. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/metrics.py +0 -0
  431. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/report.py +0 -0
  432. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
  433. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_search_diagnostics.py +0 -0
  434. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_semantic_coverage.py +0 -0
  435. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/semantic/test_semantic_quality.py +0 -0
  436. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_db_wal_mode.py +0 -0
  437. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_disable_permalinks_integration.py +0 -0
  438. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/__init__.py +0 -0
  439. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/conftest.py +0 -0
  440. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/helpers.py +0 -0
  441. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_diff_integration.py +0 -0
  442. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_inference_integration.py +0 -0
  443. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_parser_integration.py +0 -0
  444. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_schema/test_validator_integration.py +0 -0
  445. {basic_memory-0.20.1 → basic_memory-0.20.3}/test-int/test_search_performance_benchmark.py +0 -0
  446. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/Non-MarkdownFileSupport.pdf +0 -0
  447. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/README.md +0 -0
  448. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/Screenshot.png +0 -0
  449. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/__init__.py +0 -0
  450. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/__init__.py +0 -0
  451. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/conftest.py +0 -0
  452. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_directory_router.py +0 -0
  453. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_importer_router.py +0 -0
  454. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_knowledge_router.py +0 -0
  455. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_memory_router.py +0 -0
  456. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_project_router.py +0 -0
  457. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_prompt_router.py +0 -0
  458. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_resource_router.py +0 -0
  459. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_schema_router.py +0 -0
  460. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/api/v2/test_search_router.py +0 -0
  461. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  462. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_upload_command_routing.py +0 -0
  463. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/cloud/test_upload_path.py +0 -0
  464. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/conftest.py +0 -0
  465. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_analytics.py +0 -0
  466. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_auth_cli_auth.py +0 -0
  467. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_container.py +0 -0
  468. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_exit.py +0 -0
  469. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_schema.py +0 -0
  470. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tool_exit.py +0 -0
  471. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tool_json_output.py +0 -0
  472. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cli_tools.py +0 -0
  473. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_authentication.py +0 -0
  474. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_promo.py +0 -0
  475. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_cloud_status.py +0 -0
  476. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_db_reset_exit.py +0 -0
  477. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_ignore_utils.py +0 -0
  478. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_chatgpt.py +0 -0
  479. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_claude_conversations.py +0 -0
  480. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_claude_projects.py +0 -0
  481. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_import_memory_json.py +0 -0
  482. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_json_output.py +0 -0
  483. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_add_with_local_path.py +0 -0
  484. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_info_errors.py +0 -0
  485. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_list_and_ls.py +0 -0
  486. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_project_set_cloud_local.py +0 -0
  487. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_restore_commands.py +0 -0
  488. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_routing.py +0 -0
  489. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_snapshot_commands.py +0 -0
  490. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_update_command.py +0 -0
  491. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_upload.py +0 -0
  492. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/cli/test_workspace_commands.py +0 -0
  493. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  494. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_conversation_indexing.py +0 -0
  495. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_importer_base.py +0 -0
  496. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/importers/test_importer_utils.py +0 -0
  497. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/__init__.py +0 -0
  498. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  499. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_entity_parser.py +0 -0
  500. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  501. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_plugins.py +0 -0
  502. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_processor.py +0 -0
  503. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_markdown_utils.py +0 -0
  504. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_observation_edge_cases.py +0 -0
  505. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_parser_edge_cases.py +0 -0
  506. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_relation_edge_cases.py +0 -0
  507. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/markdown/test_task_detection.py +0 -0
  508. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/clients/__init__.py +0 -0
  509. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/clients/test_clients.py +0 -0
  510. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/conftest.py +0 -0
  511. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_async_client_force_local.py +0 -0
  512. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_async_client_modes.py +0 -0
  513. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_client_schema.py +0 -0
  514. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_mcp_container.py +0 -0
  515. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  516. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  517. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_prompt_tool_delegation.py +0 -0
  518. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_prompts.py +0 -0
  519. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  520. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_resources.py +0 -0
  521. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_server_lifespan_branches.py +0 -0
  522. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_build_context.py +0 -0
  523. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_canvas.py +0 -0
  524. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_cloud_discovery.py +0 -0
  525. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_contracts.py +0 -0
  526. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_json_output_modes.py +0 -0
  527. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_list_directory.py +0 -0
  528. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_move_note.py +0 -0
  529. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_project_management.py +0 -0
  530. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_read_content.py +0 -0
  531. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_read_note.py +0 -0
  532. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_recent_activity.py +0 -0
  533. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_resource.py +0 -0
  534. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_schema.py +0 -0
  535. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_utils.py +0 -0
  536. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
  537. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_view_note.py +0 -0
  538. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_workspace_management.py +0 -0
  539. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note.py +0 -0
  540. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  541. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_tool_write_note_metadata.py +0 -0
  542. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_resources.py +0 -0
  543. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_sdk.py +0 -0
  544. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/test_ui_templates.py +0 -0
  545. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  546. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_distance_to_similarity.py +0 -0
  547. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_repository.py +0 -0
  548. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_repository_upsert.py +0 -0
  549. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  550. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_fastembed_provider.py +0 -0
  551. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_hybrid_fusion.py +0 -0
  552. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_metadata_filters.py +0 -0
  553. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
  554. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_observation_repository.py +0 -0
  555. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_openai_provider.py +0 -0
  556. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_postgres_search_repository.py +0 -0
  557. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_postgres_search_repository_unit.py +0 -0
  558. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_project_info_repository.py +0 -0
  559. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_project_repository.py +0 -0
  560. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_relation_repository.py +0 -0
  561. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_repository.py +0 -0
  562. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_index_row.py +0 -0
  563. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_repository.py +0 -0
  564. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  565. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
  566. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_semantic_search_base.py +0 -0
  567. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
  568. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_vector_pagination.py +0 -0
  569. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/repository/test_vector_threshold.py +0 -0
  570. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/__init__.py +0 -0
  571. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_diff.py +0 -0
  572. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_inference.py +0 -0
  573. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_parser.py +0 -0
  574. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_resolver.py +0 -0
  575. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schema/test_validator.py +0 -0
  576. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  577. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_serialization.py +0 -0
  578. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_url.py +0 -0
  579. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_memory_url_validation.py +0 -0
  580. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  581. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_schemas.py +0 -0
  582. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/schemas/test_search.py +0 -0
  583. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_context_service.py +0 -0
  584. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_directory_service.py +0 -0
  585. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_entity_service.py +0 -0
  586. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  587. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_file_service.py +0 -0
  588. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_initialization.py +0 -0
  589. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  590. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_link_resolver.py +0 -0
  591. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_removal_bug.py +0 -0
  592. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service.py +0 -0
  593. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_cloud_info.py +0 -0
  594. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_project_service_operations.py +0 -0
  595. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_search_service.py +0 -0
  596. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_semantic_search.py +0 -0
  597. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/services/test_task_scheduler_semantic.py +0 -0
  598. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_character_conflicts.py +0 -0
  599. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_coordinator.py +0 -0
  600. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_service.py +0 -0
  601. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_service_incremental.py +0 -0
  602. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_sync_wikilink_issue.py +0 -0
  603. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_tmp_files.py +0 -0
  604. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service.py +0 -0
  605. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  606. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_edge_cases.py +0 -0
  607. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_reload.py +0 -0
  608. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/sync/test_watch_service_stress.py +0 -0
  609. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_deps.py +0 -0
  610. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_production_cascade_delete.py +0 -0
  611. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_project_resolver.py +0 -0
  612. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_rclone_commands.py +0 -0
  613. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/test_runtime.py +0 -0
  614. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  615. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_parse_tags.py +0 -0
  616. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_permalink_formatting.py +0 -0
  617. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_timezone_utils.py +0 -0
  618. {basic_memory-0.20.1 → basic_memory-0.20.3}/tests/utils/test_utf8_handling.py +0 -0
  619. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/.gitignore +0 -0
  620. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/build.mjs +0 -0
  621. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/package-lock.json +0 -0
  622. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/package.json +0 -0
  623. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
  624. {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
  625. {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
  626. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
  627. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
  628. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
  629. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
  630. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
  631. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
  632. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
  633. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
  634. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
  635. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
  636. {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
  637. {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
  638. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
  639. {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
  640. {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
  641. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
  642. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
  643. {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
  644. {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
  645. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
  646. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
  647. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
  648. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
  649. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
  650. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
  651. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
  652. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/note-preview.tsx +0 -0
  653. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/search-results.tsx +0 -0
  654. {basic_memory-0.20.1 → basic_memory-0.20.3}/ui/tool-ui-react/src/styles.css +0 -0
  655. {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.1
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.1",
9
+ "version": "0.20.3",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.20.1",
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.1"
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
- logger.info(f"Starting Basic Memory API (mode={container.mode.name})")
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
- await initialize_app(container.config)
54
+ await initialize_app(container.config)
49
55
 
50
- # Cache database connections in app state for performance
51
- logger.info("Initializing database and caching connections...")
52
- engine, session_maker = await container.init_database()
53
- app.state.engine = engine
54
- app.state.session_maker = session_maker
55
- logger.info("Database connections cached in app state")
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
- # Create and start sync coordinator (lifecycle centralized in coordinator)
58
- sync_coordinator = container.create_sync_coordinator()
59
- await sync_coordinator.start()
60
- app.state.sync_coordinator = sync_coordinator
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
- logger.info("Shutting down Basic Memory API")
67
- await sync_coordinator.stop()
68
-
69
- await container.shutdown_database()
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