basic-memory 0.21.3__tar.gz → 0.21.5__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 (703) hide show
  1. {basic_memory-0.21.3 → basic_memory-0.21.5}/AGENTS.md +25 -0
  2. {basic_memory-0.21.3 → basic_memory-0.21.5}/CHANGELOG.md +16 -0
  3. {basic_memory-0.21.3 → basic_memory-0.21.5}/CONTRIBUTING.md +0 -34
  4. {basic_memory-0.21.3 → basic_memory-0.21.5}/PKG-INFO +1 -1
  5. {basic_memory-0.21.3 → basic_memory-0.21.5}/server.json +2 -2
  6. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/__init__.py +1 -1
  7. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/services.py +4 -0
  8. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/async_client.py +197 -9
  9. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/project_management.py +91 -9
  10. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/write_note.py +20 -9
  11. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/sqlite_search_repository.py +19 -0
  12. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/search_service.py +13 -9
  13. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_param_aliases_integration.py +33 -8
  14. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_workspace_permalink_integration.py +50 -4
  15. basic_memory-0.21.5/tests/deps/test_task_failure_callback.py +38 -0
  16. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_async_client_modes.py +232 -0
  17. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_project_management.py +216 -1
  18. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_semantic_search.py +94 -0
  19. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/SKILL.md +0 -0
  20. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/references/javascript/frameworks.md +0 -0
  21. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/references/javascript/patterns.md +0 -0
  22. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/references/python/integrations.md +0 -0
  23. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/references/python/logging-patterns.md +0 -0
  24. {basic_memory-0.21.3 → basic_memory-0.21.5}/.agents/skills/instrumentation/references/rust/patterns.md +0 -0
  25. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/release/beta.md +0 -0
  26. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/release/changelog.md +0 -0
  27. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/release/release-check.md +0 -0
  28. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/release/release.md +0 -0
  29. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/spec.md +0 -0
  30. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/commands/test-live.md +0 -0
  31. {basic_memory-0.21.3 → basic_memory-0.21.5}/.claude/settings.json +0 -0
  32. {basic_memory-0.21.3 → basic_memory-0.21.5}/.dockerignore +0 -0
  33. {basic_memory-0.21.3 → basic_memory-0.21.5}/.env.example +0 -0
  34. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  37. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  38. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/dependabot.yml +0 -0
  39. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/claude-code-review.yml +0 -0
  40. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/claude-issue-triage.yml +0 -0
  41. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/claude.yml +0 -0
  42. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/dev-release.yml +0 -0
  43. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/docker.yml +0 -0
  44. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/pr-title.yml +0 -0
  45. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/release.yml +0 -0
  46. {basic_memory-0.21.3 → basic_memory-0.21.5}/.github/workflows/test.yml +0 -0
  47. {basic_memory-0.21.3 → basic_memory-0.21.5}/.gitignore +0 -0
  48. {basic_memory-0.21.3 → basic_memory-0.21.5}/.python-version +0 -0
  49. {basic_memory-0.21.3 → basic_memory-0.21.5}/CITATION.cff +0 -0
  50. {basic_memory-0.21.3 → basic_memory-0.21.5}/CLA.md +0 -0
  51. {basic_memory-0.21.3 → basic_memory-0.21.5}/CLAUDE.md +0 -0
  52. {basic_memory-0.21.3 → basic_memory-0.21.5}/CODE_OF_CONDUCT.md +0 -0
  53. {basic_memory-0.21.3 → basic_memory-0.21.5}/Dockerfile +0 -0
  54. {basic_memory-0.21.3 → basic_memory-0.21.5}/LICENSE +0 -0
  55. {basic_memory-0.21.3 → basic_memory-0.21.5}/NOTE-FORMAT.md +0 -0
  56. {basic_memory-0.21.3 → basic_memory-0.21.5}/README.md +0 -0
  57. {basic_memory-0.21.3 → basic_memory-0.21.5}/SECURITY.md +0 -0
  58. {basic_memory-0.21.3 → basic_memory-0.21.5}/docker-compose-postgres.yml +0 -0
  59. {basic_memory-0.21.3 → basic_memory-0.21.5}/docker-compose.yml +0 -0
  60. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/ARCHITECTURE.md +0 -0
  61. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/Docker.md +0 -0
  62. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/NOTE-FORMAT.md +0 -0
  63. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
  64. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/ai-assistant-guide-extended.md +0 -0
  65. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/character-handling.md +0 -0
  66. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/cloud-cli.md +0 -0
  67. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/cloud-semantic-search-value.md +0 -0
  68. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/logfire-instrumentation-strategy.md +0 -0
  69. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/mcp-ui-bakeoff-instructions.md +0 -0
  70. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/metadata-search.md +0 -0
  71. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/post-v0.18.0-test-plan.md +0 -0
  72. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/releases/v0.19.0.md +0 -0
  73. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/semantic-search-test-log.md +0 -0
  74. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/semantic-search.md +0 -0
  75. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
  76. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
  77. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/specs/SPEC-SCHEMA.md +0 -0
  78. {basic_memory-0.21.3 → basic_memory-0.21.5}/docs/testing-coverage.md +0 -0
  79. {basic_memory-0.21.3 → basic_memory-0.21.5}/justfile +0 -0
  80. {basic_memory-0.21.3 → basic_memory-0.21.5}/llms-install.md +0 -0
  81. {basic_memory-0.21.3 → basic_memory-0.21.5}/pyproject.toml +0 -0
  82. {basic_memory-0.21.3 → basic_memory-0.21.5}/skills-lock.json +0 -0
  83. {basic_memory-0.21.3 → basic_memory-0.21.5}/smithery.yaml +0 -0
  84. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/alembic.ini +0 -0
  85. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/env.py +0 -0
  86. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/migrations.py +0 -0
  87. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/script.py.mako +0 -0
  88. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  89. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  90. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  91. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  92. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  93. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  94. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  95. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  96. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  97. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  98. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  99. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  100. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  101. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  102. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  103. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
  104. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
  105. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
  106. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
  107. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/l5g6h7i8j9k0_add_note_content_table.py +0 -0
  108. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/m6h7i8j9k0l1_add_vector_sync_fingerprints.py +0 -0
  109. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/alembic/versions/n7i8j9k0l1m2_cleanup_sqlite_search_orphans.py +0 -0
  110. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/__init__.py +0 -0
  111. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/app.py +0 -0
  112. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/container.py +0 -0
  113. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/template_loader.py +0 -0
  114. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/__init__.py +0 -0
  115. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  116. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  117. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  118. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  119. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  120. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  121. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  122. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  123. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
  124. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  125. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/api/v2/utils.py +0 -0
  126. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/__init__.py +0 -0
  127. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/analytics.py +0 -0
  128. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/app.py +0 -0
  129. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/auth.py +0 -0
  130. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/auto_update.py +0 -0
  131. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/__init__.py +0 -0
  132. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  133. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  134. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  135. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  136. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  137. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
  138. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  139. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  140. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  141. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  142. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  143. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  144. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  145. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  146. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
  147. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/command_utils.py +0 -0
  148. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/db.py +0 -0
  149. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/doctor.py +0 -0
  150. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/format.py +0 -0
  151. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  152. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  153. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  154. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  155. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/mcp.py +0 -0
  156. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/orphans.py +0 -0
  157. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/project.py +0 -0
  158. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/routing.py +0 -0
  159. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/schema.py +0 -0
  160. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/status.py +0 -0
  161. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/tool.py +0 -0
  162. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/commands/update.py +0 -0
  163. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/container.py +0 -0
  164. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/main.py +0 -0
  165. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/cli/promo.py +0 -0
  166. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/config.py +0 -0
  167. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/db.py +0 -0
  168. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/__init__.py +0 -0
  169. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/config.py +0 -0
  170. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/db.py +0 -0
  171. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/importers.py +0 -0
  172. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/projects.py +0 -0
  173. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps/repositories.py +0 -0
  174. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/deps.py +0 -0
  175. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/file_utils.py +0 -0
  176. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/ignore_utils.py +0 -0
  177. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/__init__.py +0 -0
  178. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/base.py +0 -0
  179. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  180. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  181. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  182. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/memory_json_importer.py +0 -0
  183. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/importers/utils.py +0 -0
  184. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/indexing/__init__.py +0 -0
  185. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/indexing/batch_indexer.py +0 -0
  186. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/indexing/batching.py +0 -0
  187. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/indexing/models.py +0 -0
  188. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/__init__.py +0 -0
  189. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/entity_parser.py +0 -0
  190. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/markdown_processor.py +0 -0
  191. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/plugins.py +0 -0
  192. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/schemas.py +0 -0
  193. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/markdown/utils.py +0 -0
  194. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/__init__.py +0 -0
  195. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/__init__.py +0 -0
  196. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/directory.py +0 -0
  197. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  198. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/memory.py +0 -0
  199. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/project.py +0 -0
  200. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/resource.py +0 -0
  201. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/schema.py +0 -0
  202. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/clients/search.py +0 -0
  203. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/container.py +0 -0
  204. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/formatting.py +0 -0
  205. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/project_context.py +0 -0
  206. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  207. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  208. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  209. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  210. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/search.py +0 -0
  211. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/prompts/utils.py +0 -0
  212. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/__init__.py +0 -0
  213. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  214. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
  215. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/project_info.py +0 -0
  216. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/release_notes.md +0 -0
  217. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/resources/ui.py +0 -0
  218. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/server.py +0 -0
  219. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/__init__.py +0 -0
  220. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/build_context.py +0 -0
  221. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/canvas.py +0 -0
  222. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  223. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
  224. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  225. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  226. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  227. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/move_note.py +0 -0
  228. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/read_content.py +0 -0
  229. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/read_note.py +0 -0
  230. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  231. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/release_notes.py +0 -0
  232. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/schema.py +0 -0
  233. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/search.py +0 -0
  234. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
  235. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/utils.py +0 -0
  236. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/view_note.py +0 -0
  237. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/tools/workspaces.py +0 -0
  238. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/__init__.py +0 -0
  239. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
  240. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
  241. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
  242. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
  243. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
  244. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
  245. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/sdk.py +0 -0
  246. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/mcp/ui/templates.py +0 -0
  247. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/models/__init__.py +0 -0
  248. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/models/base.py +0 -0
  249. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/models/knowledge.py +0 -0
  250. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/models/project.py +0 -0
  251. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/models/search.py +0 -0
  252. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/project_resolver.py +0 -0
  253. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/__init__.py +0 -0
  254. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/embedding_provider.py +0 -0
  255. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
  256. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/entity_repository.py +0 -0
  257. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/fastembed_provider.py +0 -0
  258. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/metadata_filters.py +0 -0
  259. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/note_content_repository.py +0 -0
  260. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/observation_repository.py +0 -0
  261. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/openai_provider.py +0 -0
  262. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  263. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/project_info_repository.py +0 -0
  264. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/project_repository.py +0 -0
  265. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/relation_repository.py +0 -0
  266. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/repository.py +0 -0
  267. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/search_index_row.py +0 -0
  268. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/search_repository.py +0 -0
  269. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/search_repository_base.py +0 -0
  270. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/repository/semantic_errors.py +0 -0
  271. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/runtime.py +0 -0
  272. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/__init__.py +0 -0
  273. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/diff.py +0 -0
  274. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/inference.py +0 -0
  275. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/parser.py +0 -0
  276. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/resolver.py +0 -0
  277. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schema/validator.py +0 -0
  278. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/__init__.py +0 -0
  279. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/base.py +0 -0
  280. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/cloud.py +0 -0
  281. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/delete.py +0 -0
  282. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/directory.py +0 -0
  283. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/importer.py +0 -0
  284. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/memory.py +0 -0
  285. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/project_info.py +0 -0
  286. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/prompt.py +0 -0
  287. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/request.py +0 -0
  288. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/response.py +0 -0
  289. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/schema.py +0 -0
  290. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/search.py +0 -0
  291. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/sync_report.py +0 -0
  292. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/v2/__init__.py +0 -0
  293. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/v2/entity.py +0 -0
  294. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/v2/graph.py +0 -0
  295. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/schemas/v2/resource.py +0 -0
  296. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/__init__.py +0 -0
  297. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/context_service.py +0 -0
  298. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/directory_service.py +0 -0
  299. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/entity_service.py +0 -0
  300. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/exceptions.py +0 -0
  301. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/file_service.py +0 -0
  302. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/initialization.py +0 -0
  303. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/link_resolver.py +0 -0
  304. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/project_service.py +0 -0
  305. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/services/service.py +0 -0
  306. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/sync/__init__.py +0 -0
  307. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/sync/background_sync.py +0 -0
  308. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/sync/coordinator.py +0 -0
  309. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/sync/sync_service.py +0 -0
  310. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/sync/watch_service.py +0 -0
  311. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/telemetry.py +0 -0
  312. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  313. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/templates/prompts/search.hbs +0 -0
  314. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/utils.py +0 -0
  315. {basic_memory-0.21.3 → basic_memory-0.21.5}/src/basic_memory/workspace_context.py +0 -0
  316. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/BENCHMARKS.md +0 -0
  317. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
  318. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
  319. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  320. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_project_commands_integration.py +0 -0
  321. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_routing_integration.py +0 -0
  322. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_search_notes_meta_integration.py +0 -0
  323. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/cli/test_version_integration.py +0 -0
  324. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/compare_search_benchmarks.py +0 -0
  325. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/conftest.py +0 -0
  326. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
  327. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
  328. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
  329. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
  330. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
  331. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
  332. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
  333. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
  334. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
  335. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
  336. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
  337. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
  338. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
  339. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
  340. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
  341. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
  342. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
  343. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
  344. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
  345. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
  346. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
  347. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
  348. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
  349. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
  350. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
  351. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
  352. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
  353. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
  354. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
  355. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
  356. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
  357. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
  358. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
  359. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
  360. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
  361. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
  362. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
  363. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
  364. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
  365. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
  366. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
  367. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
  368. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
  369. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
  370. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
  371. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
  372. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
  373. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
  374. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
  375. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
  376. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
  377. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
  378. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
  379. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
  380. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
  381. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
  382. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
  383. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
  384. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
  385. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/schemas/Book.md +0 -0
  386. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
  387. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/schemas/Person.md +0 -0
  388. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
  389. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
  390. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
  391. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
  392. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
  393. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
  394. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
  395. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
  396. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
  397. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
  398. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
  399. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
  400. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_build_context_underscore.py +0 -0
  401. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_build_context_validation.py +0 -0
  402. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  403. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  404. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_delete_directory_integration.py +0 -0
  405. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_delete_note_integration.py +0 -0
  406. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_edit_note_integration.py +0 -0
  407. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  408. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_list_directory_integration.py +0 -0
  409. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_long_relation_type_integration.py +0 -0
  410. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_move_directory_integration.py +0 -0
  411. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_move_note_integration.py +0 -0
  412. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_output_format_json_integration.py +0 -0
  413. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_pagination_integration.py +0 -0
  414. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_permalink_collision_integration.py +0 -0
  415. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_project_management_integration.py +0 -0
  416. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  417. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_read_content_integration.py +0 -0
  418. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_read_note_integration.py +0 -0
  419. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_search_integration.py +0 -0
  420. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  421. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_smoke_integration.py +0 -0
  422. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_string_params_integration.py +0 -0
  423. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_ui_sdk_integration.py +0 -0
  424. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/mcp/test_write_note_integration.py +0 -0
  425. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/__init__.py +0 -0
  426. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/conftest.py +0 -0
  427. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/corpus.py +0 -0
  428. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/metrics.py +0 -0
  429. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/report.py +0 -0
  430. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
  431. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/test_search_diagnostics.py +0 -0
  432. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/test_semantic_coverage.py +0 -0
  433. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/semantic/test_semantic_quality.py +0 -0
  434. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_db_wal_mode.py +0 -0
  435. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_disable_permalinks_integration.py +0 -0
  436. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/__init__.py +0 -0
  437. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/conftest.py +0 -0
  438. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/helpers.py +0 -0
  439. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/test_diff_integration.py +0 -0
  440. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/test_inference_integration.py +0 -0
  441. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/test_parser_integration.py +0 -0
  442. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_schema/test_validator_integration.py +0 -0
  443. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_search_performance_benchmark.py +0 -0
  444. {basic_memory-0.21.3 → basic_memory-0.21.5}/test-int/test_sync_batching_integration.py +0 -0
  445. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/Non-MarkdownFileSupport.pdf +0 -0
  446. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/README.md +0 -0
  447. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/Screenshot.png +0 -0
  448. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/__init__.py +0 -0
  449. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/__init__.py +0 -0
  450. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/conftest.py +0 -0
  451. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_directory_router.py +0 -0
  452. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_importer_router.py +0 -0
  453. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_knowledge_router.py +0 -0
  454. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_knowledge_router_telemetry.py +0 -0
  455. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_memory_hydration.py +0 -0
  456. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_memory_router.py +0 -0
  457. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_orphan_router.py +0 -0
  458. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_project_router.py +0 -0
  459. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_prompt_router.py +0 -0
  460. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_resource_router.py +0 -0
  461. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_schema_router.py +0 -0
  462. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_search_hydration.py +0 -0
  463. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_search_router.py +0 -0
  464. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_search_router_telemetry.py +0 -0
  465. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_utils_telemetry.py +0 -0
  466. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/api/v2/test_workspace_permalink_headers.py +0 -0
  467. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  468. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_project_sync_command.py +0 -0
  469. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  470. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_rclone_installer.py +0 -0
  471. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_upload_command_routing.py +0 -0
  472. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/cloud/test_upload_path.py +0 -0
  473. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/conftest.py +0 -0
  474. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_analytics.py +0 -0
  475. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_auth_cli_auth.py +0 -0
  476. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_auto_update.py +0 -0
  477. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_container.py +0 -0
  478. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_exit.py +0 -0
  479. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_schema.py +0 -0
  480. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_telemetry.py +0 -0
  481. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_tool_exit.py +0 -0
  482. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_tool_json_output.py +0 -0
  483. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cli_tools.py +0 -0
  484. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cloud_authentication.py +0 -0
  485. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cloud_promo.py +0 -0
  486. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_cloud_status.py +0 -0
  487. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_db_reindex.py +0 -0
  488. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_db_reset_exit.py +0 -0
  489. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_db_reset_zombie_check.py +0 -0
  490. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_ignore_utils.py +0 -0
  491. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_import_chatgpt.py +0 -0
  492. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_import_claude_conversations.py +0 -0
  493. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_import_claude_projects.py +0 -0
  494. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_import_memory_json.py +0 -0
  495. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_json_output.py +0 -0
  496. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_orphans_command.py +0 -0
  497. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_project_add_with_local_path.py +0 -0
  498. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_project_info_cloud_status.py +0 -0
  499. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_project_info_errors.py +0 -0
  500. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_project_list_and_ls.py +0 -0
  501. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_project_set_cloud_local.py +0 -0
  502. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_restore_commands.py +0 -0
  503. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_routing.py +0 -0
  504. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_snapshot_commands.py +0 -0
  505. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_update_command.py +0 -0
  506. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_upload.py +0 -0
  507. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/cli/test_workspace_commands.py +0 -0
  508. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/conftest.py +0 -0
  509. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  510. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/importers/test_conversation_indexing.py +0 -0
  511. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/importers/test_importer_base.py +0 -0
  512. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/importers/test_importer_utils.py +0 -0
  513. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/indexing/test_batch_indexer.py +0 -0
  514. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/indexing/test_batching.py +0 -0
  515. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/__init__.py +0 -0
  516. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  517. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_entity_parser.py +0 -0
  518. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  519. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_markdown_plugins.py +0 -0
  520. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_markdown_processor.py +0 -0
  521. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_markdown_utils.py +0 -0
  522. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_observation_edge_cases.py +0 -0
  523. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_parser_edge_cases.py +0 -0
  524. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_relation_edge_cases.py +0 -0
  525. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/markdown/test_task_detection.py +0 -0
  526. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/clients/__init__.py +0 -0
  527. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/clients/test_clients.py +0 -0
  528. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/conftest.py +0 -0
  529. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_async_client_force_local.py +0 -0
  530. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_async_client_telemetry.py +0 -0
  531. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_client_schema.py +0 -0
  532. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_client_telemetry.py +0 -0
  533. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_mcp_container.py +0 -0
  534. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  535. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  536. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_project_context.py +0 -0
  537. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_project_context_telemetry.py +0 -0
  538. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_prompt_tool_delegation.py +0 -0
  539. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_prompts.py +0 -0
  540. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  541. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_resources.py +0 -0
  542. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_server_lifespan_branches.py +0 -0
  543. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_server_telemetry.py +0 -0
  544. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_build_context.py +0 -0
  545. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_canvas.py +0 -0
  546. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_cloud_discovery.py +0 -0
  547. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_contracts.py +0 -0
  548. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_delete_note.py +0 -0
  549. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_edit_note.py +0 -0
  550. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_json_output_modes.py +0 -0
  551. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_list_directory.py +0 -0
  552. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_move_note.py +0 -0
  553. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_read_content.py +0 -0
  554. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_read_note.py +0 -0
  555. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_recent_activity.py +0 -0
  556. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_resource.py +0 -0
  557. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_schema.py +0 -0
  558. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_search.py +0 -0
  559. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_telemetry.py +0 -0
  560. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_utils.py +0 -0
  561. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
  562. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_view_note.py +0 -0
  563. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_workspace_management.py +0 -0
  564. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_write_note.py +0 -0
  565. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  566. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_tool_write_note_metadata.py +0 -0
  567. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_ui_resources.py +0 -0
  568. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_ui_sdk.py +0 -0
  569. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_ui_templates.py +0 -0
  570. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/test_workspace_permalink_resolution.py +0 -0
  571. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  572. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/mcp/tools/test_search_notes_multi_project.py +0 -0
  573. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_distance_to_similarity.py +0 -0
  574. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_entity_repository.py +0 -0
  575. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_entity_repository_upsert.py +0 -0
  576. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  577. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_fastembed_provider.py +0 -0
  578. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_hybrid_fusion.py +0 -0
  579. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_metadata_filters.py +0 -0
  580. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
  581. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_note_content_repository.py +0 -0
  582. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_observation_repository.py +0 -0
  583. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_openai_provider.py +0 -0
  584. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_postgres_search_repository.py +0 -0
  585. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_postgres_search_repository_unit.py +0 -0
  586. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_project_info_repository.py +0 -0
  587. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_project_repository.py +0 -0
  588. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_relation_repository.py +0 -0
  589. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_repository.py +0 -0
  590. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_search_index_row.py +0 -0
  591. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_search_repository.py +0 -0
  592. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  593. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
  594. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_semantic_search_base.py +0 -0
  595. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
  596. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_vector_pagination.py +0 -0
  597. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/repository/test_vector_threshold.py +0 -0
  598. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/__init__.py +0 -0
  599. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/test_diff.py +0 -0
  600. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/test_inference.py +0 -0
  601. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/test_parser.py +0 -0
  602. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/test_resolver.py +0 -0
  603. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schema/test_validator.py +0 -0
  604. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  605. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_memory_serialization.py +0 -0
  606. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_memory_url.py +0 -0
  607. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_memory_url_validation.py +0 -0
  608. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  609. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_schemas.py +0 -0
  610. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/schemas/test_search.py +0 -0
  611. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_context_service.py +0 -0
  612. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_directory_service.py +0 -0
  613. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_entity_service.py +0 -0
  614. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  615. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_entity_service_prepare.py +0 -0
  616. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_entity_service_telemetry.py +0 -0
  617. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_entity_service_write_result.py +0 -0
  618. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_file_service.py +0 -0
  619. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_initialization.py +0 -0
  620. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  621. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_link_resolver.py +0 -0
  622. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_project_removal_bug.py +0 -0
  623. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_project_service.py +0 -0
  624. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_project_service_cloud_info.py +0 -0
  625. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_project_service_embedding_status.py +0 -0
  626. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_project_service_operations.py +0 -0
  627. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_search_service.py +0 -0
  628. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_search_service_telemetry.py +0 -0
  629. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_task_scheduler_semantic.py +0 -0
  630. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/services/test_upsert_entity_optimization.py +0 -0
  631. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_character_conflicts.py +0 -0
  632. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_coordinator.py +0 -0
  633. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_one_markdown_file.py +0 -0
  634. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_service.py +0 -0
  635. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_service_batching.py +0 -0
  636. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_service_incremental.py +0 -0
  637. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_service_subprocess.py +0 -0
  638. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_service_telemetry.py +0 -0
  639. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_sync_wikilink_issue.py +0 -0
  640. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_tmp_files.py +0 -0
  641. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_watch_service.py +0 -0
  642. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  643. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_watch_service_edge_cases.py +0 -0
  644. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_watch_service_reload.py +0 -0
  645. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/sync/test_watch_service_stress.py +0 -0
  646. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_alembic_env.py +0 -0
  647. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_coerce.py +0 -0
  648. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_config.py +0 -0
  649. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_deps.py +0 -0
  650. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_note_content_migration.py +0 -0
  651. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_permalink_utils.py +0 -0
  652. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_production_cascade_delete.py +0 -0
  653. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_project_resolver.py +0 -0
  654. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_rclone_commands.py +0 -0
  655. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_runtime.py +0 -0
  656. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/test_telemetry.py +0 -0
  657. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_file_utils.py +0 -0
  658. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  659. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_parse_tags.py +0 -0
  660. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_permalink_formatting.py +0 -0
  661. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_setup_logging.py +0 -0
  662. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_timezone_utils.py +0 -0
  663. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_utf8_handling.py +0 -0
  664. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_validate_project_path.py +0 -0
  665. {basic_memory-0.21.3 → basic_memory-0.21.5}/tests/utils/test_workspace_context.py +0 -0
  666. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/.gitignore +0 -0
  667. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/build.mjs +0 -0
  668. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/package-lock.json +0 -0
  669. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/package.json +0 -0
  670. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
  671. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
  672. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
  673. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
  674. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
  675. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
  676. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
  677. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
  678. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
  679. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
  680. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
  681. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
  682. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
  683. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
  684. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
  685. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
  686. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
  687. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
  688. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
  689. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
  690. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
  691. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
  692. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
  693. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
  694. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
  695. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
  696. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
  697. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
  698. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
  699. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/note-preview.tsx +0 -0
  700. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/search-results.tsx +0 -0
  701. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/src/styles.css +0 -0
  702. {basic_memory-0.21.3 → basic_memory-0.21.5}/ui/tool-ui-react/tailwind.config.js +0 -0
  703. {basic_memory-0.21.3 → basic_memory-0.21.5}/uv.lock +0 -0
@@ -253,6 +253,31 @@ async_client.set_client_factory(your_custom_factory)
253
253
 
254
254
  See SPEC-16 for full context manager refactor details.
255
255
 
256
+ ### Release Process
257
+
258
+ Releases are driven by `just release` / `just beta` — never by a bare `git tag`. The recipes bump version metadata, run pre-flight checks, commit, tag, and push. GitHub Actions then publishes to PyPI and updates the Homebrew formula.
259
+
260
+ **Stable release:**
261
+
262
+ ```
263
+ just release v0.21.3
264
+ ```
265
+
266
+ The recipe runs `just lint` + `just typecheck`, then updates `__version__` in `src/basic_memory/__init__.py` and `"version"` in `server.json` (MCP registry metadata), commits as `chore: update version to X.Y.Z for vX.Y.Z release`, creates the `vX.Y.Z` tag, and pushes both the commit and the tag to `origin/main`. After the tag lands, the `Release` workflow builds the package, publishes to PyPI, creates the GitHub release with auto-generated notes, and updates the Homebrew formula. The recipe finishes by printing the post-release tasks the workflow doesn't cover.
267
+
268
+ **Beta release:** `just beta v0.21.3b1` — same flow with a beta-suffixed tag. PyPI consumers install with `pip install basic-memory --pre`.
269
+
270
+ **Development builds:** every commit to `main` publishes a `0.21.3.dev26+468a22f`-style version to PyPI automatically via `.github/workflows/dev-release.yml`. No human action.
271
+
272
+ **Do not tag releases by hand.** A bare `git tag vX.Y.Z` skips the in-code version bump. Package metadata is still correct (uv-dynamic-versioning derives it from the git tag) but `basic-memory --version` reports the previous release, which is what happened with v0.21.2 → v0.21.3.
273
+
274
+ **Post-release tasks** the recipe surfaces but doesn't run:
275
+ - `docs.basicmemory.com` — add notes to `src/pages/latest-releases.mdx`
276
+ - `basicmachines.co` — bump version in `src/components/sections/hero.tsx`
277
+ - MCP Registry — `mcp-publisher publish` from the repo root
278
+
279
+ See `.claude/commands/release/release.md` (and `beta.md`, `release-check.md`, `changelog.md` alongside it) for the full release + post-release runbook, including the slash commands.
280
+
256
281
  ## BASIC MEMORY PRODUCT USAGE
257
282
 
258
283
  ### Knowledge Structure
@@ -1,5 +1,21 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.21.5 (2026-05-26)
4
+
5
+ Workspace/project routing fixes for MCP, plus a SQLite vector reindex stability fix.
6
+
7
+ ### Bug Fixes
8
+
9
+ - **#854**: MCP project listing now keeps duplicate cloud project rows distinct by
10
+ workspace, so only the selected workspace row inherits local project state.
11
+ - **#853**: `write_note` returns workspace-qualified permalinks for cloud
12
+ workspace writes, allowing follow-up `memory://` reads to route back to the
13
+ correct workspace/project.
14
+ - **#852**: Full SQLite vector reindex now loads `sqlite-vec` before dropping
15
+ `vec0` virtual tables, preventing reindex crashes.
16
+ - **#838**: Local ASGI database initialization is preloaded so MCP routing can
17
+ safely enter local project contexts.
18
+
3
19
  ## v0.21.1 (2026-05-16)
4
20
 
5
21
  CI-only release. No user-facing changes.
@@ -224,40 +224,6 @@ See `test-int/BENCHMARKS.md` for detailed benchmark documentation.
224
224
  - **Fixtures**: Use async pytest fixtures for setup and teardown
225
225
  - **Markers**: Use `@pytest.mark.benchmark` for benchmarks, `@pytest.mark.slow` for slow tests
226
226
 
227
- ## Release Process
228
-
229
- Basic Memory uses automatic versioning based on git tags with `uv-dynamic-versioning`. Here's how releases work:
230
-
231
- ### Version Management
232
- - **Development versions**: Automatically generated from git commits (e.g., `0.12.4.dev26+468a22f`)
233
- - **Beta releases**: Created by tagging with beta suffixes (e.g., `git tag v0.13.0b1`)
234
- - **Stable releases**: Created by tagging with version numbers (e.g., `git tag v0.13.0`)
235
-
236
- ### Release Workflows
237
-
238
- #### Development Builds
239
- - Automatically published to PyPI on every commit to `main`
240
- - Version format: `0.12.4.dev26+468a22f` (base version + dev + commit count + hash)
241
- - Users install with: `pip install basic-memory --pre --force-reinstall`
242
-
243
- #### Beta Releases
244
- 1. Create and push a beta tag: `git tag v0.13.0b1 && git push origin v0.13.0b1`
245
- 2. GitHub Actions automatically builds and publishes to PyPI
246
- 3. Users install with: `pip install basic-memory --pre`
247
-
248
- #### Stable Releases
249
- 1. Create and push a version tag: `git tag v0.13.0 && git push origin v0.13.0`
250
- 2. GitHub Actions automatically:
251
- - Builds the package with version `0.13.0`
252
- - Creates GitHub release with auto-generated notes
253
- - Publishes to PyPI
254
- 3. Users install with: `pip install basic-memory`
255
-
256
- ### For Contributors
257
- - No manual version bumping required
258
- - Versions are automatically derived from git tags
259
- - Focus on code changes, not version management
260
-
261
227
  ## Creating Issues
262
228
 
263
229
  If you're planning to work on something, please create an issue first to discuss the approach. Include:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.21.3
3
+ Version: 0.21.5
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
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/basicmachines-co/basic-memory.git",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.21.3",
9
+ "version": "0.21.5",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.21.3",
14
+ "version": "0.21.5",
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.21.3"
4
+ __version__ = "0.21.5"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -447,8 +447,12 @@ class TaskScheduler(Protocol):
447
447
 
448
448
 
449
449
  def _log_task_failure(completed: asyncio.Task) -> None:
450
+ if completed.cancelled():
451
+ return
450
452
  try:
451
453
  completed.result()
454
+ except asyncio.CancelledError:
455
+ return
452
456
  except Exception as exc: # pragma: no cover
453
457
  logger.exception("Background task failed", error=str(exc))
454
458
 
@@ -1,13 +1,36 @@
1
1
  import os
2
- from contextlib import AbstractAsyncContextManager, asynccontextmanager
3
- from typing import AsyncIterator, Callable, Optional
2
+ from asyncio import Lock
3
+ from contextlib import AbstractAsyncContextManager, AsyncExitStack, asynccontextmanager
4
+ from dataclasses import dataclass
5
+ from threading import RLock
6
+ from typing import TYPE_CHECKING, Annotated, Any, AsyncIterator, Callable, Optional
4
7
 
8
+ from fastapi import Depends, FastAPI, Request
5
9
  from httpx import ASGITransport, AsyncClient, Timeout
6
10
  from loguru import logger
7
11
 
8
12
  import logfire
9
13
  from basic_memory.config import ConfigManager, ProjectMode
10
14
 
15
+ if TYPE_CHECKING:
16
+ from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker
17
+
18
+ LocalDatabaseState = tuple["AsyncEngine", "async_sessionmaker[AsyncSession]"]
19
+ _MISSING_STATE_VALUE = object()
20
+
21
+
22
+ @dataclass
23
+ class _PreparedLocalAsgiDatabase:
24
+ active_count: int
25
+ previous_engine: object
26
+ previous_session_maker: object
27
+ dependency_context: AbstractAsyncContextManager[LocalDatabaseState]
28
+
29
+
30
+ _prepared_local_asgi_database_lock = RLock()
31
+ _prepared_local_asgi_database_prepare_locks: dict[FastAPI, Lock] = {}
32
+ _prepared_local_asgi_databases: dict[FastAPI, _PreparedLocalAsgiDatabase] = {}
33
+
11
34
 
12
35
  def _force_local_mode() -> bool:
13
36
  """Check if local mode is forced via environment variable."""
@@ -34,15 +57,12 @@ def _build_timeout() -> Timeout:
34
57
  )
35
58
 
36
59
 
37
- def _asgi_client(timeout: Timeout) -> AsyncClient:
38
- """Create a local ASGI client."""
39
- # Import on first local-client use so CLI help/version paths can import
40
- # routing helpers without constructing the full FastAPI router graph.
41
- from basic_memory.api.app import app as fastapi_app
60
+ def _build_asgi_client(app: FastAPI, timeout: Timeout) -> AsyncClient:
61
+ """Create a local ASGI client for an already-prepared FastAPI app."""
42
62
  from basic_memory.workspace_context import workspace_permalink_headers
43
63
 
44
64
  return AsyncClient(
45
- transport=ASGITransport(app=fastapi_app),
65
+ transport=ASGITransport(app=app),
46
66
  base_url="http://test",
47
67
  timeout=timeout,
48
68
  # Local ASGI calls still cross the HTTP boundary, so request handlers need
@@ -51,6 +71,169 @@ def _asgi_client(timeout: Timeout) -> AsyncClient:
51
71
  )
52
72
 
53
73
 
74
+ def _get_prepared_local_asgi_database_prepare_lock(app: FastAPI) -> Lock:
75
+ """Get the async lock that serializes first-time DB preparation for an app."""
76
+ with _prepared_local_asgi_database_lock:
77
+ prepare_lock = _prepared_local_asgi_database_prepare_locks.get(app)
78
+ if prepare_lock is None:
79
+ prepare_lock = Lock()
80
+ _prepared_local_asgi_database_prepare_locks[app] = prepare_lock
81
+ return prepare_lock
82
+
83
+
84
+ @asynccontextmanager
85
+ async def _resolve_local_asgi_database(app: FastAPI) -> AsyncIterator[LocalDatabaseState]:
86
+ """Resolve database state for a local ASGI request."""
87
+ from fastapi.dependencies.utils import get_dependant, solve_dependencies
88
+
89
+ from basic_memory.deps import get_engine_factory
90
+
91
+ async def resolve_database_state(
92
+ database_state: Annotated[LocalDatabaseState, Depends(get_engine_factory)],
93
+ ) -> LocalDatabaseState:
94
+ return database_state
95
+
96
+ scope: dict[str, Any] = {
97
+ "type": "http",
98
+ "asgi": {"version": "3.0"},
99
+ "method": "GET",
100
+ "scheme": "http",
101
+ "path": "/",
102
+ "raw_path": b"/",
103
+ "root_path": "",
104
+ "query_string": b"",
105
+ "headers": [],
106
+ "client": ("testclient", 50000),
107
+ "server": ("testserver", 80),
108
+ "app": app,
109
+ "path_params": {},
110
+ }
111
+
112
+ async with AsyncExitStack() as request_stack, AsyncExitStack() as function_stack:
113
+ scope["fastapi_inner_astack"] = request_stack
114
+ scope["fastapi_function_astack"] = function_stack
115
+ request = Request(scope)
116
+ dependant = get_dependant(path="/", call=resolve_database_state)
117
+ solved = await solve_dependencies(
118
+ request=request,
119
+ dependant=dependant,
120
+ dependency_overrides_provider=app,
121
+ async_exit_stack=request_stack,
122
+ embed_body_fields=False,
123
+ )
124
+ if solved.errors:
125
+ raise RuntimeError(f"Failed to resolve local ASGI database dependency: {solved.errors}")
126
+
127
+ yield await resolve_database_state(**solved.values)
128
+
129
+
130
+ def _retain_prepared_local_asgi_database(app: FastAPI) -> bool:
131
+ """Retain an active local ASGI database preparation if one exists."""
132
+ with _prepared_local_asgi_database_lock:
133
+ active = _prepared_local_asgi_databases.get(app)
134
+ if active is None:
135
+ return False
136
+
137
+ active.active_count += 1
138
+ return True
139
+
140
+
141
+ def _install_prepared_local_asgi_database(
142
+ app: FastAPI,
143
+ database_state: LocalDatabaseState,
144
+ dependency_context: AbstractAsyncContextManager[LocalDatabaseState],
145
+ ) -> None:
146
+ """Install local ASGI database state after dependency resolution."""
147
+ with _prepared_local_asgi_database_lock:
148
+ active = _prepared_local_asgi_databases.get(app)
149
+ if active is not None:
150
+ raise RuntimeError("Local ASGI database state installed while another state is active")
151
+
152
+ previous_engine = getattr(app.state, "engine", _MISSING_STATE_VALUE)
153
+ previous_session_maker = getattr(app.state, "session_maker", _MISSING_STATE_VALUE)
154
+ engine, session_maker = database_state
155
+
156
+ app.state.engine = engine
157
+ app.state.session_maker = session_maker
158
+ _prepared_local_asgi_databases[app] = _PreparedLocalAsgiDatabase(
159
+ active_count=1,
160
+ previous_engine=previous_engine,
161
+ previous_session_maker=previous_session_maker,
162
+ dependency_context=dependency_context,
163
+ )
164
+
165
+
166
+ def _restore_local_asgi_state_attribute(app: FastAPI, name: str, previous_value: object) -> None:
167
+ """Restore a FastAPI app.state attribute captured before local ASGI preparation."""
168
+ if previous_value is _MISSING_STATE_VALUE:
169
+ if hasattr(app.state, name):
170
+ delattr(app.state, name)
171
+ else:
172
+ setattr(app.state, name, previous_value)
173
+
174
+
175
+ def _release_prepared_local_asgi_database(
176
+ app: FastAPI,
177
+ ) -> AbstractAsyncContextManager[LocalDatabaseState] | None:
178
+ """Release local ASGI database state after a client context exits."""
179
+ with _prepared_local_asgi_database_lock:
180
+ active = _prepared_local_asgi_databases.get(app)
181
+ if active is None:
182
+ raise RuntimeError("Local ASGI database state released without a matching retain")
183
+
184
+ active.active_count -= 1
185
+ if active.active_count > 0:
186
+ return None
187
+
188
+ del _prepared_local_asgi_databases[app]
189
+ _restore_local_asgi_state_attribute(app, "engine", active.previous_engine)
190
+ _restore_local_asgi_state_attribute(
191
+ app,
192
+ "session_maker",
193
+ active.previous_session_maker,
194
+ )
195
+ return active.dependency_context
196
+
197
+
198
+ @asynccontextmanager
199
+ async def _prepared_local_asgi_database(app: FastAPI) -> AsyncIterator[None]:
200
+ """Initialize local ASGI database state before the first request."""
201
+ prepare_lock = _get_prepared_local_asgi_database_prepare_lock(app)
202
+ async with prepare_lock:
203
+ if not _retain_prepared_local_asgi_database(app):
204
+ database_context = _resolve_local_asgi_database(app)
205
+ database_state = await database_context.__aenter__()
206
+ try:
207
+ _install_prepared_local_asgi_database(app, database_state, database_context)
208
+ except Exception:
209
+ await database_context.__aexit__(None, None, None)
210
+ raise
211
+
212
+ try:
213
+ yield
214
+ finally:
215
+ database_context = _release_prepared_local_asgi_database(app)
216
+ if database_context is not None:
217
+ await database_context.__aexit__(None, None, None)
218
+
219
+
220
+ @asynccontextmanager
221
+ async def _asgi_client(timeout: Timeout) -> AsyncIterator[AsyncClient]:
222
+ """Create a local ASGI client."""
223
+ # Import on first local-client use so CLI help/version paths can import
224
+ # routing helpers without constructing the full FastAPI router graph.
225
+ from basic_memory.api.app import app as fastapi_app
226
+
227
+ # Trigger: local ASGITransport does not execute FastAPI lifespan startup.
228
+ # Why: letting request dependencies initialize Postgres can run asyncpg DDL
229
+ # under Starlette's request loop and trigger CPython's empty-ready-queue race.
230
+ # Outcome: request handling sees the same app.state database objects as API
231
+ # lifespan startup would have provided.
232
+ async with _prepared_local_asgi_database(fastapi_app):
233
+ async with _build_asgi_client(fastapi_app, timeout) as client:
234
+ yield client
235
+
236
+
54
237
  async def _resolve_cloud_token(config) -> str:
55
238
  """Resolve cloud token with API key preferred, OAuth fallback."""
56
239
  with logfire.span(
@@ -260,7 +443,12 @@ def create_client() -> AsyncClient:
260
443
 
261
444
  if _force_local_mode() or not _force_cloud_mode():
262
445
  logger.info("Creating ASGI client for local Basic Memory API")
263
- return _asgi_client(timeout)
446
+ # Deprecated sync path: create_client() cannot await the local ASGI
447
+ # pre-initialization used by get_client(), so callers that need proper
448
+ # resource setup should use the async context manager instead.
449
+ from basic_memory.api.app import app as fastapi_app
450
+
451
+ return _build_asgi_client(fastapi_app, timeout)
264
452
 
265
453
  logger.info("Creating HTTP client for cloud proxy (legacy create_client path)")
266
454
  config = ConfigManager().config
@@ -10,7 +10,12 @@ from typing import Literal
10
10
  from fastmcp import Context
11
11
  from loguru import logger
12
12
 
13
- from basic_memory.config import ConfigManager, has_cloud_credentials
13
+ from basic_memory.config import (
14
+ BasicMemoryConfig,
15
+ ConfigManager,
16
+ ProjectEntry,
17
+ has_cloud_credentials,
18
+ )
14
19
  from basic_memory.mcp.async_client import (
15
20
  _explicit_routing,
16
21
  _force_local_mode,
@@ -131,9 +136,66 @@ def _merge_projects(
131
136
  return merged
132
137
 
133
138
 
139
+ def _workspace_entry_priority(entry: WorkspaceProjectEntry) -> tuple[bool, int, str, str]:
140
+ """Prefer default/personal workspaces when duplicate project permalinks exist."""
141
+ workspace_type_rank = 0 if entry.workspace.workspace_type == "personal" else 1
142
+ return (
143
+ # False sorts before True, so the cloud/default workspace comes first.
144
+ not entry.workspace.is_default,
145
+ workspace_type_rank,
146
+ entry.workspace.name.casefold(),
147
+ entry.workspace.tenant_id,
148
+ )
149
+
150
+
151
+ def _select_attached_cloud_entry(
152
+ cloud_entries: tuple[WorkspaceProjectEntry, ...],
153
+ *,
154
+ config_entry: ProjectEntry | None,
155
+ config: BasicMemoryConfig | None,
156
+ ) -> WorkspaceProjectEntry | None:
157
+ """Choose the single cloud row that should inherit local project state."""
158
+ if not cloud_entries:
159
+ return None
160
+
161
+ preferred_workspace_ids: list[str] = []
162
+ if config_entry and config_entry.workspace_id:
163
+ preferred_workspace_ids.append(config_entry.workspace_id)
164
+ if (
165
+ config
166
+ and config.default_workspace
167
+ and config.default_workspace not in preferred_workspace_ids
168
+ ):
169
+ preferred_workspace_ids.append(config.default_workspace)
170
+
171
+ # The configured default workspace can differ from the cloud-side default.
172
+ # Use the cloud default only after explicit local config preferences.
173
+ default_workspace_entry = next(
174
+ (entry for entry in cloud_entries if entry.workspace.is_default),
175
+ None,
176
+ )
177
+ if (
178
+ default_workspace_entry is not None
179
+ and default_workspace_entry.workspace.tenant_id not in preferred_workspace_ids
180
+ ):
181
+ preferred_workspace_ids.append(default_workspace_entry.workspace.tenant_id)
182
+
183
+ for workspace_id in preferred_workspace_ids:
184
+ for entry in cloud_entries:
185
+ if entry.workspace.tenant_id == workspace_id:
186
+ return entry
187
+
188
+ if len(cloud_entries) == 1:
189
+ return cloud_entries[0]
190
+
191
+ return sorted(cloud_entries, key=_workspace_entry_priority)[0]
192
+
193
+
134
194
  def _merge_workspace_projects(
135
195
  local_list: ProjectList | None,
136
196
  cloud_entries: tuple[WorkspaceProjectEntry, ...],
197
+ *,
198
+ config: BasicMemoryConfig | None = None,
137
199
  ) -> list[dict]:
138
200
  """Merge local projects with cloud projects from every accessible workspace."""
139
201
  local_by_permalink: dict[str, ProjectItem] = {}
@@ -141,20 +203,40 @@ def _merge_workspace_projects(
141
203
  for project in local_list.projects:
142
204
  local_by_permalink[project.permalink] = project
143
205
 
206
+ config_by_permalink: dict[str, ProjectEntry] = {}
207
+ if config:
208
+ config_by_permalink = {
209
+ generate_permalink(project_name): entry
210
+ for project_name, entry in config.projects.items()
211
+ }
212
+
213
+ cloud_entries_by_permalink: dict[str, list[WorkspaceProjectEntry]] = {}
214
+ for entry in cloud_entries:
215
+ cloud_entries_by_permalink.setdefault(entry.project.permalink, []).append(entry)
216
+
217
+ attached_entry_by_permalink: dict[str, WorkspaceProjectEntry | None] = {}
218
+ for permalink in local_by_permalink:
219
+ attached_entry_by_permalink[permalink] = _select_attached_cloud_entry(
220
+ tuple(cloud_entries_by_permalink.get(permalink, ())),
221
+ config_entry=config_by_permalink.get(permalink),
222
+ config=config,
223
+ )
224
+
144
225
  cloud_permalinks = {entry.project.permalink for entry in cloud_entries}
145
226
  merged: list[dict] = []
146
227
 
147
228
  for entry in sorted(
148
229
  cloud_entries,
149
- key=lambda item: (
150
- not item.workspace.is_default,
151
- item.workspace.workspace_type != "personal",
152
- item.workspace.name.casefold(),
153
- item.project.permalink,
154
- ),
230
+ key=lambda item: (*_workspace_entry_priority(item), item.project.permalink),
155
231
  ):
156
232
  permalink = entry.project.permalink
157
- local_proj = local_by_permalink.get(permalink)
233
+ local_proj = (
234
+ local_by_permalink.get(permalink)
235
+ # WorkspaceProjectEntry is a frozen dataclass containing Pydantic
236
+ # models, so value equality is the intended comparison here.
237
+ if attached_entry_by_permalink.get(permalink) == entry
238
+ else None
239
+ )
158
240
  cloud_proj = entry.project
159
241
  source = "local+cloud" if local_proj else "cloud"
160
242
  local_path = local_proj.path if local_proj else None
@@ -339,7 +421,7 @@ async def list_memory_projects(
339
421
  )
340
422
 
341
423
  if cloud_entries:
342
- merged = _merge_workspace_projects(local_list, cloud_entries)
424
+ merged = _merge_workspace_projects(local_list, cloud_entries, config=config)
343
425
  else:
344
426
  merged = _merge_projects(
345
427
  local_list,
@@ -12,7 +12,13 @@ from basic_memory.mcp.project_context import get_project_client, add_project_met
12
12
  from basic_memory.mcp.server import mcp
13
13
  from fastmcp import Context
14
14
  from basic_memory.schemas.base import Entity
15
- from basic_memory.utils import coerce_dict, parse_tags, validate_project_path
15
+ from basic_memory.utils import (
16
+ build_qualified_permalink_reference,
17
+ coerce_dict,
18
+ parse_tags,
19
+ validate_project_path,
20
+ )
21
+ from basic_memory.workspace_context import current_workspace_permalink_context
16
22
 
17
23
  # Define TagType as a Union that can accept either a string or a list of strings or None
18
24
  TagType = Union[List[str], str, None]
@@ -35,11 +41,7 @@ async def write_note(
35
41
  tags: list[str] | str | None = None,
36
42
  note_type: str = "note",
37
43
  metadata: Annotated[dict | None, BeforeValidator(coerce_dict)] = None,
38
- # Force/replace are the file-write idioms models default to.
39
- overwrite: Annotated[
40
- bool | None,
41
- Field(default=None, validation_alias=AliasChoices("overwrite", "force", "replace")),
42
- ] = None,
44
+ overwrite: bool | None = None,
43
45
  output_format: Literal["text", "json"] = "text",
44
46
  context: Context | None = None,
45
47
  ) -> str | dict:
@@ -278,11 +280,20 @@ async def write_note(
278
280
  else:
279
281
  # Re-raise if it's not a conflict error
280
282
  raise # pragma: no cover
283
+ response_permalink = result.permalink
284
+ workspace_context = current_workspace_permalink_context()
285
+ if response_permalink and workspace_context is not None:
286
+ response_permalink = build_qualified_permalink_reference(
287
+ active_project.permalink,
288
+ response_permalink,
289
+ workspace_permalink=workspace_context.workspace_slug,
290
+ )
291
+
281
292
  summary = [
282
293
  f"# {action} note",
283
294
  f"project: {active_project.name}",
284
295
  f"file_path: {result.file_path}",
285
- f"permalink: {result.permalink}",
296
+ f"permalink: {response_permalink}",
286
297
  f"checksum: {result.checksum[:8] if result.checksum else 'unknown'}",
287
298
  ]
288
299
 
@@ -319,12 +330,12 @@ async def write_note(
319
330
 
320
331
  # Log the response with structured data
321
332
  logger.info(
322
- f"MCP tool response: tool=write_note project={active_project.name} action={action} permalink={result.permalink} observations_count={len(result.observations)} relations_count={len(result.relations)} resolved_relations={resolved} unresolved_relations={unresolved}"
333
+ f"MCP tool response: tool=write_note project={active_project.name} action={action} permalink={response_permalink} observations_count={len(result.observations)} relations_count={len(result.relations)} resolved_relations={resolved} unresolved_relations={unresolved}"
323
334
  )
324
335
  if output_format == "json":
325
336
  return {
326
337
  "title": result.title,
327
- "permalink": result.permalink,
338
+ "permalink": response_permalink,
328
339
  "file_path": result.file_path,
329
340
  "checksum": result.checksum,
330
341
  "action": action.lower(),
@@ -620,6 +620,25 @@ class SQLiteSearchRepository(SearchRepositoryBase):
620
620
  )
621
621
  await session.commit()
622
622
 
623
+ async def drop_vector_tables(self) -> None:
624
+ """Drop SQLite vector tables on a sqlite-vec-enabled connection."""
625
+ async with db.scoped_session(self.session_maker) as session:
626
+ vector_sql_result = await session.execute(
627
+ text(
628
+ "SELECT sql FROM sqlite_master "
629
+ "WHERE type = 'table' AND name = 'search_vector_embeddings'"
630
+ )
631
+ )
632
+ vector_sql = vector_sql_result.scalar()
633
+ if vector_sql and "using vec0" in vector_sql.lower():
634
+ await self._ensure_sqlite_vec_loaded(session)
635
+
636
+ await session.execute(text("DROP TABLE IF EXISTS search_vector_embeddings"))
637
+ await session.execute(text("DROP TABLE IF EXISTS search_vector_chunks"))
638
+ await session.execute(text("DROP TABLE IF EXISTS search_vector_index"))
639
+ await session.commit()
640
+ self._vector_tables_initialized = False
641
+
623
642
  async def delete_stale_vector_rows(self) -> None:
624
643
  """Delete vector rows whose source entities no longer exist."""
625
644
  await self._ensure_vector_tables()
@@ -126,19 +126,23 @@ class SearchService:
126
126
 
127
127
  async def reindex_all(self, background_tasks: Optional[BackgroundTasks] = None) -> None:
128
128
  """Reindex all content from database."""
129
+ from basic_memory.repository.sqlite_search_repository import SQLiteSearchRepository
129
130
 
130
131
  logger.info("Starting full reindex")
131
132
  # Clear and recreate search index
132
133
  await self.repository.execute_query(text("DROP TABLE IF EXISTS search_index"), params={})
133
- await self.repository.execute_query(
134
- text("DROP TABLE IF EXISTS search_vector_embeddings"), params={}
135
- )
136
- await self.repository.execute_query(
137
- text("DROP TABLE IF EXISTS search_vector_chunks"), params={}
138
- )
139
- await self.repository.execute_query(
140
- text("DROP TABLE IF EXISTS search_vector_index"), params={}
141
- )
134
+ if isinstance(self.repository, SQLiteSearchRepository):
135
+ await self.repository.drop_vector_tables()
136
+ else:
137
+ await self.repository.execute_query(
138
+ text("DROP TABLE IF EXISTS search_vector_embeddings"), params={}
139
+ )
140
+ await self.repository.execute_query(
141
+ text("DROP TABLE IF EXISTS search_vector_chunks"), params={}
142
+ )
143
+ await self.repository.execute_query(
144
+ text("DROP TABLE IF EXISTS search_vector_index"), params={}
145
+ )
142
146
  await self.init_search_index()
143
147
 
144
148
  # Reindex all entities