basic-memory 0.21.1__tar.gz → 0.21.2__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 (702) hide show
  1. {basic_memory-0.21.1 → basic_memory-0.21.2}/AGENTS.md +9 -0
  2. {basic_memory-0.21.1 → basic_memory-0.21.2}/PKG-INFO +1 -1
  3. {basic_memory-0.21.1 → basic_memory-0.21.2}/docker-compose-postgres.yml +5 -2
  4. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/semantic-search.md +1 -0
  5. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/config.py +8 -5
  6. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/project_context.py +101 -7
  7. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/edit_note.py +4 -3
  8. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/link_resolver.py +17 -5
  9. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/README.md +12 -6
  10. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/conftest.py +25 -0
  11. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_project_context.py +464 -72
  12. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_project_context_telemetry.py +3 -16
  13. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_edit_note.py +85 -8
  14. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_read_content.py +107 -0
  15. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_read_note.py +127 -0
  16. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_search.py +105 -0
  17. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_workspace_management.py +7 -19
  18. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_link_resolver.py +104 -6
  19. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_config.py +19 -1
  20. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/SKILL.md +0 -0
  21. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/references/javascript/frameworks.md +0 -0
  22. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/references/javascript/patterns.md +0 -0
  23. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/references/python/integrations.md +0 -0
  24. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/references/python/logging-patterns.md +0 -0
  25. {basic_memory-0.21.1 → basic_memory-0.21.2}/.agents/skills/instrumentation/references/rust/patterns.md +0 -0
  26. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/release/beta.md +0 -0
  27. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/release/changelog.md +0 -0
  28. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/release/release-check.md +0 -0
  29. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/release/release.md +0 -0
  30. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/spec.md +0 -0
  31. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/commands/test-live.md +0 -0
  32. {basic_memory-0.21.1 → basic_memory-0.21.2}/.claude/settings.json +0 -0
  33. {basic_memory-0.21.1 → basic_memory-0.21.2}/.dockerignore +0 -0
  34. {basic_memory-0.21.1 → basic_memory-0.21.2}/.env.example +0 -0
  35. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  36. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  37. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  38. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  39. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/dependabot.yml +0 -0
  40. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/claude-code-review.yml +0 -0
  41. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/claude-issue-triage.yml +0 -0
  42. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/claude.yml +0 -0
  43. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/dev-release.yml +0 -0
  44. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/docker.yml +0 -0
  45. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/pr-title.yml +0 -0
  46. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/release.yml +0 -0
  47. {basic_memory-0.21.1 → basic_memory-0.21.2}/.github/workflows/test.yml +0 -0
  48. {basic_memory-0.21.1 → basic_memory-0.21.2}/.gitignore +0 -0
  49. {basic_memory-0.21.1 → basic_memory-0.21.2}/.python-version +0 -0
  50. {basic_memory-0.21.1 → basic_memory-0.21.2}/CHANGELOG.md +0 -0
  51. {basic_memory-0.21.1 → basic_memory-0.21.2}/CITATION.cff +0 -0
  52. {basic_memory-0.21.1 → basic_memory-0.21.2}/CLA.md +0 -0
  53. {basic_memory-0.21.1 → basic_memory-0.21.2}/CLAUDE.md +0 -0
  54. {basic_memory-0.21.1 → basic_memory-0.21.2}/CODE_OF_CONDUCT.md +0 -0
  55. {basic_memory-0.21.1 → basic_memory-0.21.2}/CONTRIBUTING.md +0 -0
  56. {basic_memory-0.21.1 → basic_memory-0.21.2}/Dockerfile +0 -0
  57. {basic_memory-0.21.1 → basic_memory-0.21.2}/LICENSE +0 -0
  58. {basic_memory-0.21.1 → basic_memory-0.21.2}/NOTE-FORMAT.md +0 -0
  59. {basic_memory-0.21.1 → basic_memory-0.21.2}/README.md +0 -0
  60. {basic_memory-0.21.1 → basic_memory-0.21.2}/SECURITY.md +0 -0
  61. {basic_memory-0.21.1 → basic_memory-0.21.2}/docker-compose.yml +0 -0
  62. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/ARCHITECTURE.md +0 -0
  63. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/Docker.md +0 -0
  64. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/NOTE-FORMAT.md +0 -0
  65. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
  66. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/ai-assistant-guide-extended.md +0 -0
  67. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/character-handling.md +0 -0
  68. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/cloud-cli.md +0 -0
  69. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/cloud-semantic-search-value.md +0 -0
  70. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/logfire-instrumentation-strategy.md +0 -0
  71. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/mcp-ui-bakeoff-instructions.md +0 -0
  72. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/metadata-search.md +0 -0
  73. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/post-v0.18.0-test-plan.md +0 -0
  74. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/releases/v0.19.0.md +0 -0
  75. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/semantic-search-test-log.md +0 -0
  76. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
  77. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
  78. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/specs/SPEC-SCHEMA.md +0 -0
  79. {basic_memory-0.21.1 → basic_memory-0.21.2}/docs/testing-coverage.md +0 -0
  80. {basic_memory-0.21.1 → basic_memory-0.21.2}/justfile +0 -0
  81. {basic_memory-0.21.1 → basic_memory-0.21.2}/llms-install.md +0 -0
  82. {basic_memory-0.21.1 → basic_memory-0.21.2}/pyproject.toml +0 -0
  83. {basic_memory-0.21.1 → basic_memory-0.21.2}/server.json +0 -0
  84. {basic_memory-0.21.1 → basic_memory-0.21.2}/skills-lock.json +0 -0
  85. {basic_memory-0.21.1 → basic_memory-0.21.2}/smithery.yaml +0 -0
  86. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/__init__.py +0 -0
  87. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/alembic.ini +0 -0
  88. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/env.py +0 -0
  89. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/migrations.py +0 -0
  90. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/script.py.mako +0 -0
  91. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  92. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  93. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  94. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  95. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  96. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  97. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  98. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  99. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  100. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  101. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  102. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  103. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  104. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  105. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  106. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
  107. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
  108. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
  109. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
  110. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/l5g6h7i8j9k0_add_note_content_table.py +0 -0
  111. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/m6h7i8j9k0l1_add_vector_sync_fingerprints.py +0 -0
  112. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/alembic/versions/n7i8j9k0l1m2_cleanup_sqlite_search_orphans.py +0 -0
  113. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/__init__.py +0 -0
  114. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/app.py +0 -0
  115. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/container.py +0 -0
  116. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/template_loader.py +0 -0
  117. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/__init__.py +0 -0
  118. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  119. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  120. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  121. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  122. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  123. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  124. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  125. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  126. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
  127. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  128. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/api/v2/utils.py +0 -0
  129. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/__init__.py +0 -0
  130. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/analytics.py +0 -0
  131. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/app.py +0 -0
  132. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/auth.py +0 -0
  133. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/auto_update.py +0 -0
  134. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/__init__.py +0 -0
  135. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  136. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  137. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  138. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  139. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  140. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
  141. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
  142. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  143. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  144. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  145. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  146. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  147. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  148. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  149. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
  150. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/command_utils.py +0 -0
  151. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/db.py +0 -0
  152. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/doctor.py +0 -0
  153. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/format.py +0 -0
  154. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  155. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  156. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  157. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  158. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/mcp.py +0 -0
  159. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/orphans.py +0 -0
  160. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/project.py +0 -0
  161. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/routing.py +0 -0
  162. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/schema.py +0 -0
  163. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/status.py +0 -0
  164. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/tool.py +0 -0
  165. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/commands/update.py +0 -0
  166. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/container.py +0 -0
  167. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/main.py +0 -0
  168. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/cli/promo.py +0 -0
  169. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/db.py +0 -0
  170. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/__init__.py +0 -0
  171. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/config.py +0 -0
  172. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/db.py +0 -0
  173. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/importers.py +0 -0
  174. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/projects.py +0 -0
  175. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/repositories.py +0 -0
  176. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps/services.py +0 -0
  177. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/deps.py +0 -0
  178. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/file_utils.py +0 -0
  179. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/ignore_utils.py +0 -0
  180. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/__init__.py +0 -0
  181. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/base.py +0 -0
  182. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  183. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  184. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  185. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/memory_json_importer.py +0 -0
  186. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/importers/utils.py +0 -0
  187. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/indexing/__init__.py +0 -0
  188. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/indexing/batch_indexer.py +0 -0
  189. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/indexing/batching.py +0 -0
  190. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/indexing/models.py +0 -0
  191. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/__init__.py +0 -0
  192. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/entity_parser.py +0 -0
  193. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/markdown_processor.py +0 -0
  194. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/plugins.py +0 -0
  195. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/schemas.py +0 -0
  196. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/markdown/utils.py +0 -0
  197. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/__init__.py +0 -0
  198. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/async_client.py +0 -0
  199. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/__init__.py +0 -0
  200. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/directory.py +0 -0
  201. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  202. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/memory.py +0 -0
  203. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/project.py +0 -0
  204. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/resource.py +0 -0
  205. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/schema.py +0 -0
  206. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/clients/search.py +0 -0
  207. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/container.py +0 -0
  208. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/formatting.py +0 -0
  209. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  210. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  211. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  212. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  213. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/search.py +0 -0
  214. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/prompts/utils.py +0 -0
  215. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/__init__.py +0 -0
  216. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  217. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
  218. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/project_info.py +0 -0
  219. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/release_notes.md +0 -0
  220. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/resources/ui.py +0 -0
  221. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/server.py +0 -0
  222. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/__init__.py +0 -0
  223. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/build_context.py +0 -0
  224. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/canvas.py +0 -0
  225. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  226. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
  227. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  228. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  229. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/move_note.py +0 -0
  230. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/project_management.py +0 -0
  231. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/read_content.py +0 -0
  232. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/read_note.py +0 -0
  233. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  234. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/release_notes.py +0 -0
  235. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/schema.py +0 -0
  236. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/search.py +0 -0
  237. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
  238. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/utils.py +0 -0
  239. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/view_note.py +0 -0
  240. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/workspaces.py +0 -0
  241. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/tools/write_note.py +0 -0
  242. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/__init__.py +0 -0
  243. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
  244. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
  245. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
  246. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
  247. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
  248. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
  249. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/sdk.py +0 -0
  250. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/mcp/ui/templates.py +0 -0
  251. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/models/__init__.py +0 -0
  252. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/models/base.py +0 -0
  253. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/models/knowledge.py +0 -0
  254. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/models/project.py +0 -0
  255. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/models/search.py +0 -0
  256. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/project_resolver.py +0 -0
  257. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/__init__.py +0 -0
  258. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/embedding_provider.py +0 -0
  259. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
  260. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/entity_repository.py +0 -0
  261. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/fastembed_provider.py +0 -0
  262. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/metadata_filters.py +0 -0
  263. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/note_content_repository.py +0 -0
  264. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/observation_repository.py +0 -0
  265. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/openai_provider.py +0 -0
  266. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  267. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/project_info_repository.py +0 -0
  268. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/project_repository.py +0 -0
  269. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/relation_repository.py +0 -0
  270. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/repository.py +0 -0
  271. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/search_index_row.py +0 -0
  272. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/search_repository.py +0 -0
  273. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/search_repository_base.py +0 -0
  274. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/semantic_errors.py +0 -0
  275. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  276. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/runtime.py +0 -0
  277. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/__init__.py +0 -0
  278. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/diff.py +0 -0
  279. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/inference.py +0 -0
  280. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/parser.py +0 -0
  281. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/resolver.py +0 -0
  282. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schema/validator.py +0 -0
  283. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/__init__.py +0 -0
  284. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/base.py +0 -0
  285. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/cloud.py +0 -0
  286. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/delete.py +0 -0
  287. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/directory.py +0 -0
  288. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/importer.py +0 -0
  289. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/memory.py +0 -0
  290. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/project_info.py +0 -0
  291. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/prompt.py +0 -0
  292. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/request.py +0 -0
  293. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/response.py +0 -0
  294. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/schema.py +0 -0
  295. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/search.py +0 -0
  296. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/sync_report.py +0 -0
  297. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/v2/__init__.py +0 -0
  298. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/v2/entity.py +0 -0
  299. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/v2/graph.py +0 -0
  300. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/schemas/v2/resource.py +0 -0
  301. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/__init__.py +0 -0
  302. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/context_service.py +0 -0
  303. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/directory_service.py +0 -0
  304. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/entity_service.py +0 -0
  305. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/exceptions.py +0 -0
  306. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/file_service.py +0 -0
  307. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/initialization.py +0 -0
  308. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/project_service.py +0 -0
  309. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/search_service.py +0 -0
  310. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/services/service.py +0 -0
  311. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/sync/__init__.py +0 -0
  312. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/sync/background_sync.py +0 -0
  313. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/sync/coordinator.py +0 -0
  314. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/sync/sync_service.py +0 -0
  315. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/sync/watch_service.py +0 -0
  316. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/telemetry.py +0 -0
  317. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  318. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/templates/prompts/search.hbs +0 -0
  319. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/utils.py +0 -0
  320. {basic_memory-0.21.1 → basic_memory-0.21.2}/src/basic_memory/workspace_context.py +0 -0
  321. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/BENCHMARKS.md +0 -0
  322. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
  323. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
  324. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  325. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_project_commands_integration.py +0 -0
  326. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_routing_integration.py +0 -0
  327. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_search_notes_meta_integration.py +0 -0
  328. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/cli/test_version_integration.py +0 -0
  329. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/compare_search_benchmarks.py +0 -0
  330. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/conftest.py +0 -0
  331. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
  332. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
  333. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
  334. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
  335. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
  336. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
  337. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
  338. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
  339. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
  340. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
  341. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
  342. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
  343. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
  344. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
  345. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
  346. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
  347. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
  348. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
  349. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
  350. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
  351. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
  352. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
  353. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
  354. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
  355. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
  356. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
  357. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
  358. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
  359. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
  360. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
  361. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
  362. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
  363. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
  364. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
  365. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
  366. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
  367. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
  368. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
  369. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
  370. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
  371. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
  372. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
  373. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
  374. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
  375. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
  376. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
  377. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
  378. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
  379. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
  380. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
  381. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
  382. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
  383. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
  384. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
  385. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
  386. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
  387. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
  388. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
  389. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
  390. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/schemas/Book.md +0 -0
  391. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
  392. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/schemas/Person.md +0 -0
  393. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
  394. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
  395. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
  396. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
  397. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
  398. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
  399. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
  400. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
  401. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
  402. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
  403. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
  404. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
  405. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_build_context_underscore.py +0 -0
  406. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_build_context_validation.py +0 -0
  407. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  408. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  409. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_delete_directory_integration.py +0 -0
  410. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_delete_note_integration.py +0 -0
  411. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_edit_note_integration.py +0 -0
  412. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  413. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_list_directory_integration.py +0 -0
  414. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_long_relation_type_integration.py +0 -0
  415. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_move_directory_integration.py +0 -0
  416. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_move_note_integration.py +0 -0
  417. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_output_format_json_integration.py +0 -0
  418. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_pagination_integration.py +0 -0
  419. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_param_aliases_integration.py +0 -0
  420. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_permalink_collision_integration.py +0 -0
  421. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_project_management_integration.py +0 -0
  422. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  423. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_read_content_integration.py +0 -0
  424. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_read_note_integration.py +0 -0
  425. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_search_integration.py +0 -0
  426. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  427. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_smoke_integration.py +0 -0
  428. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_string_params_integration.py +0 -0
  429. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_ui_sdk_integration.py +0 -0
  430. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_workspace_permalink_integration.py +0 -0
  431. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/mcp/test_write_note_integration.py +0 -0
  432. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/__init__.py +0 -0
  433. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/conftest.py +0 -0
  434. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/corpus.py +0 -0
  435. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/metrics.py +0 -0
  436. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/report.py +0 -0
  437. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
  438. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/test_search_diagnostics.py +0 -0
  439. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/test_semantic_coverage.py +0 -0
  440. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/semantic/test_semantic_quality.py +0 -0
  441. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_db_wal_mode.py +0 -0
  442. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_disable_permalinks_integration.py +0 -0
  443. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/__init__.py +0 -0
  444. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/conftest.py +0 -0
  445. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/helpers.py +0 -0
  446. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/test_diff_integration.py +0 -0
  447. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/test_inference_integration.py +0 -0
  448. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/test_parser_integration.py +0 -0
  449. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_schema/test_validator_integration.py +0 -0
  450. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_search_performance_benchmark.py +0 -0
  451. {basic_memory-0.21.1 → basic_memory-0.21.2}/test-int/test_sync_batching_integration.py +0 -0
  452. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/Non-MarkdownFileSupport.pdf +0 -0
  453. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/Screenshot.png +0 -0
  454. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/__init__.py +0 -0
  455. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/__init__.py +0 -0
  456. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/conftest.py +0 -0
  457. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_directory_router.py +0 -0
  458. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_importer_router.py +0 -0
  459. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_knowledge_router.py +0 -0
  460. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_knowledge_router_telemetry.py +0 -0
  461. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_memory_hydration.py +0 -0
  462. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_memory_router.py +0 -0
  463. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_orphan_router.py +0 -0
  464. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_project_router.py +0 -0
  465. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_prompt_router.py +0 -0
  466. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_resource_router.py +0 -0
  467. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_schema_router.py +0 -0
  468. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_search_hydration.py +0 -0
  469. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_search_router.py +0 -0
  470. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_search_router_telemetry.py +0 -0
  471. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_utils_telemetry.py +0 -0
  472. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/api/v2/test_workspace_permalink_headers.py +0 -0
  473. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  474. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_project_sync_command.py +0 -0
  475. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  476. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_rclone_installer.py +0 -0
  477. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_upload_command_routing.py +0 -0
  478. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/cloud/test_upload_path.py +0 -0
  479. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/conftest.py +0 -0
  480. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_analytics.py +0 -0
  481. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_auth_cli_auth.py +0 -0
  482. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_auto_update.py +0 -0
  483. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_container.py +0 -0
  484. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_exit.py +0 -0
  485. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_schema.py +0 -0
  486. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_telemetry.py +0 -0
  487. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_tool_exit.py +0 -0
  488. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_tool_json_output.py +0 -0
  489. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cli_tools.py +0 -0
  490. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cloud_authentication.py +0 -0
  491. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cloud_promo.py +0 -0
  492. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_cloud_status.py +0 -0
  493. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_db_reindex.py +0 -0
  494. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_db_reset_exit.py +0 -0
  495. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_db_reset_zombie_check.py +0 -0
  496. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_ignore_utils.py +0 -0
  497. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_import_chatgpt.py +0 -0
  498. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_import_claude_conversations.py +0 -0
  499. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_import_claude_projects.py +0 -0
  500. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_import_memory_json.py +0 -0
  501. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_json_output.py +0 -0
  502. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_orphans_command.py +0 -0
  503. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_project_add_with_local_path.py +0 -0
  504. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_project_info_cloud_status.py +0 -0
  505. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_project_info_errors.py +0 -0
  506. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_project_list_and_ls.py +0 -0
  507. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_project_set_cloud_local.py +0 -0
  508. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_restore_commands.py +0 -0
  509. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_routing.py +0 -0
  510. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_snapshot_commands.py +0 -0
  511. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_update_command.py +0 -0
  512. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_upload.py +0 -0
  513. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/cli/test_workspace_commands.py +0 -0
  514. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/conftest.py +0 -0
  515. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  516. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/importers/test_conversation_indexing.py +0 -0
  517. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/importers/test_importer_base.py +0 -0
  518. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/importers/test_importer_utils.py +0 -0
  519. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/indexing/test_batch_indexer.py +0 -0
  520. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/indexing/test_batching.py +0 -0
  521. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/__init__.py +0 -0
  522. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  523. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_entity_parser.py +0 -0
  524. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  525. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_markdown_plugins.py +0 -0
  526. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_markdown_processor.py +0 -0
  527. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_markdown_utils.py +0 -0
  528. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_observation_edge_cases.py +0 -0
  529. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_parser_edge_cases.py +0 -0
  530. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_relation_edge_cases.py +0 -0
  531. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/markdown/test_task_detection.py +0 -0
  532. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/clients/__init__.py +0 -0
  533. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/clients/test_clients.py +0 -0
  534. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_async_client_force_local.py +0 -0
  535. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_async_client_modes.py +0 -0
  536. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_async_client_telemetry.py +0 -0
  537. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_client_schema.py +0 -0
  538. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_client_telemetry.py +0 -0
  539. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_mcp_container.py +0 -0
  540. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  541. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  542. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_prompt_tool_delegation.py +0 -0
  543. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_prompts.py +0 -0
  544. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  545. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_resources.py +0 -0
  546. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_server_lifespan_branches.py +0 -0
  547. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_server_telemetry.py +0 -0
  548. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_build_context.py +0 -0
  549. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_canvas.py +0 -0
  550. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_cloud_discovery.py +0 -0
  551. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_contracts.py +0 -0
  552. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_delete_note.py +0 -0
  553. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_json_output_modes.py +0 -0
  554. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_list_directory.py +0 -0
  555. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_move_note.py +0 -0
  556. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_project_management.py +0 -0
  557. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_recent_activity.py +0 -0
  558. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_resource.py +0 -0
  559. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_schema.py +0 -0
  560. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_telemetry.py +0 -0
  561. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_utils.py +0 -0
  562. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
  563. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_view_note.py +0 -0
  564. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_write_note.py +0 -0
  565. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  566. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_tool_write_note_metadata.py +0 -0
  567. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_ui_resources.py +0 -0
  568. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_ui_sdk.py +0 -0
  569. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_ui_templates.py +0 -0
  570. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/test_workspace_permalink_resolution.py +0 -0
  571. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  572. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/mcp/tools/test_search_notes_multi_project.py +0 -0
  573. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_distance_to_similarity.py +0 -0
  574. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_entity_repository.py +0 -0
  575. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_entity_repository_upsert.py +0 -0
  576. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  577. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_fastembed_provider.py +0 -0
  578. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_hybrid_fusion.py +0 -0
  579. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_metadata_filters.py +0 -0
  580. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
  581. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_note_content_repository.py +0 -0
  582. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_observation_repository.py +0 -0
  583. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_openai_provider.py +0 -0
  584. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_postgres_search_repository.py +0 -0
  585. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_postgres_search_repository_unit.py +0 -0
  586. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_project_info_repository.py +0 -0
  587. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_project_repository.py +0 -0
  588. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_relation_repository.py +0 -0
  589. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_repository.py +0 -0
  590. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_search_index_row.py +0 -0
  591. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_search_repository.py +0 -0
  592. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  593. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
  594. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_semantic_search_base.py +0 -0
  595. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
  596. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_vector_pagination.py +0 -0
  597. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/repository/test_vector_threshold.py +0 -0
  598. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/__init__.py +0 -0
  599. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/test_diff.py +0 -0
  600. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/test_inference.py +0 -0
  601. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/test_parser.py +0 -0
  602. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/test_resolver.py +0 -0
  603. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schema/test_validator.py +0 -0
  604. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  605. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_memory_serialization.py +0 -0
  606. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_memory_url.py +0 -0
  607. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_memory_url_validation.py +0 -0
  608. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  609. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_schemas.py +0 -0
  610. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/schemas/test_search.py +0 -0
  611. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_context_service.py +0 -0
  612. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_directory_service.py +0 -0
  613. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_entity_service.py +0 -0
  614. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  615. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_entity_service_prepare.py +0 -0
  616. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_entity_service_telemetry.py +0 -0
  617. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_entity_service_write_result.py +0 -0
  618. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_file_service.py +0 -0
  619. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_initialization.py +0 -0
  620. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  621. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_project_removal_bug.py +0 -0
  622. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_project_service.py +0 -0
  623. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_project_service_cloud_info.py +0 -0
  624. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_project_service_embedding_status.py +0 -0
  625. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_project_service_operations.py +0 -0
  626. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_search_service.py +0 -0
  627. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_search_service_telemetry.py +0 -0
  628. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_semantic_search.py +0 -0
  629. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_task_scheduler_semantic.py +0 -0
  630. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/services/test_upsert_entity_optimization.py +0 -0
  631. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_character_conflicts.py +0 -0
  632. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_coordinator.py +0 -0
  633. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_one_markdown_file.py +0 -0
  634. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_service.py +0 -0
  635. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_service_batching.py +0 -0
  636. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_service_incremental.py +0 -0
  637. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_service_subprocess.py +0 -0
  638. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_service_telemetry.py +0 -0
  639. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_sync_wikilink_issue.py +0 -0
  640. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_tmp_files.py +0 -0
  641. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_watch_service.py +0 -0
  642. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  643. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_watch_service_edge_cases.py +0 -0
  644. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_watch_service_reload.py +0 -0
  645. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/sync/test_watch_service_stress.py +0 -0
  646. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_alembic_env.py +0 -0
  647. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_coerce.py +0 -0
  648. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_deps.py +0 -0
  649. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_note_content_migration.py +0 -0
  650. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_permalink_utils.py +0 -0
  651. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_production_cascade_delete.py +0 -0
  652. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_project_resolver.py +0 -0
  653. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_rclone_commands.py +0 -0
  654. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_runtime.py +0 -0
  655. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/test_telemetry.py +0 -0
  656. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_file_utils.py +0 -0
  657. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  658. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_parse_tags.py +0 -0
  659. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_permalink_formatting.py +0 -0
  660. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_setup_logging.py +0 -0
  661. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_timezone_utils.py +0 -0
  662. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_utf8_handling.py +0 -0
  663. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_validate_project_path.py +0 -0
  664. {basic_memory-0.21.1 → basic_memory-0.21.2}/tests/utils/test_workspace_context.py +0 -0
  665. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/.gitignore +0 -0
  666. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/build.mjs +0 -0
  667. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/package-lock.json +0 -0
  668. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/package.json +0 -0
  669. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
  670. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
  671. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
  672. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
  673. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
  674. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
  675. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
  676. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
  677. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
  678. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
  679. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
  680. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
  681. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
  682. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
  683. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
  684. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
  685. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
  686. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
  687. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
  688. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
  689. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
  690. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
  691. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
  692. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
  693. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
  694. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
  695. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
  696. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
  697. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
  698. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/note-preview.tsx +0 -0
  699. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/search-results.tsx +0 -0
  700. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/src/styles.css +0 -0
  701. {basic_memory-0.21.1 → basic_memory-0.21.2}/ui/tool-ui-react/tailwind.config.js +0 -0
  702. {basic_memory-0.21.1 → basic_memory-0.21.2}/uv.lock +0 -0
@@ -56,6 +56,15 @@ Run `just test-smoke` when you specifically need the MCP smoke flow.
56
56
 
57
57
  If testmon is “cold,” the first run may be long. Subsequent runs get much faster.
58
58
 
59
+ ### PR CI Gate
60
+
61
+ Before opening or updating a PR, run the checks that mirror the common required CI failures:
62
+
63
+ - Run `just typecheck` in addition to targeted `ruff` and `pytest` commands when tests were added or changed.
64
+ - Sign commits with `git commit -s` so DCO passes. If a PR branch already has unsigned commits, rewrite the branch with signed-off commits before asking for review.
65
+ - Use a semantic PR title accepted by `.github/workflows/pr-title.yml`: `type(scope): summary`.
66
+ - Use one of the allowed scopes: `core`, `cli`, `api`, `mcp`, `sync`, `ui`, `deps`, `installer`.
67
+
59
68
  ### Test Structure
60
69
 
61
70
  - `tests/` - Unit tests for individual components (mocked, fast)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.21.1
3
+ Version: 0.21.2
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
@@ -1,5 +1,8 @@
1
1
  # Docker Compose configuration for Basic Memory with PostgreSQL
2
- # Use this for local development and testing with Postgres backend
2
+ # Use this for local development and testing with Postgres backend.
3
+ #
4
+ # The Postgres backend requires the pgvector extension (semantic search).
5
+ # This image bundles pgvector; plain postgres:17 will not work for vector search.
3
6
  #
4
7
  # Usage:
5
8
  # docker-compose -f docker-compose-postgres.yml up -d
@@ -7,7 +10,7 @@
7
10
 
8
11
  services:
9
12
  postgres:
10
- image: postgres:17
13
+ image: pgvector/pgvector:pg17
11
14
  container_name: basic-memory-postgres
12
15
  environment:
13
16
  # Local development/test credentials - NOT for production
@@ -263,6 +263,7 @@ The sqlite-vec extension is loaded per-connection. Vector tables are created laz
263
263
  ### Postgres (cloud)
264
264
 
265
265
  - **Vector storage**: [pgvector](https://github.com/pgvector/pgvector) with HNSW indexing
266
+ - **Local Docker**: use `docker-compose-postgres.yml` (`pgvector/pgvector:pg17`). Plain `postgres:17` lacks the extension; run `CREATE EXTENSION IF NOT EXISTS vector;` on any external instance before first migration.
266
267
  - **Chunk metadata table**: Created via Alembic migration (`search_vector_chunks` with `BIGSERIAL` primary key)
267
268
  - **Embedding table**: `search_vector_embeddings` created at runtime (dimension-dependent, same pattern as SQLite)
268
269
  - **Index**: HNSW index on the embedding column for fast approximate nearest-neighbour queries
@@ -21,7 +21,7 @@ from basic_memory.utils import setup_logging, generate_permalink
21
21
 
22
22
  DATABASE_NAME = "memory.db"
23
23
  APP_DATABASE_NAME = "memory.db" # Using the same name but in the app directory
24
- DATA_DIR_NAME = ".basic-memory"
24
+ DATA_DIR_NAME = "basic-memory"
25
25
  CONFIG_FILE_NAME = "config.json"
26
26
  WATCH_STATUS_JSON = "watch-status.json"
27
27
  CONFIG_DIR_MODE = 0o700
@@ -69,15 +69,18 @@ def resolve_data_dir() -> Path:
69
69
 
70
70
  Single source of truth for the per-user state directory. Honors
71
71
  ``BASIC_MEMORY_CONFIG_DIR`` so each process/worktree can isolate config
72
- and database state; otherwise falls back to ``<user home>/.basic-memory``.
72
+ and database state; otherwise falls back to ``<user home>/.basic-memory``,
73
+ and then to ``XDG_CONFIG_HOME``.
73
74
 
74
75
  Cross-platform: ``Path.home()`` reads ``$HOME`` on POSIX and
75
76
  ``%USERPROFILE%`` on Windows, so there's no need to check ``$HOME``
76
77
  explicitly here.
77
78
  """
78
- if config_dir := os.getenv("BASIC_MEMORY_CONFIG_DIR"):
79
- return Path(config_dir)
80
- return Path.home() / DATA_DIR_NAME
79
+ if basic_memory_dir := os.getenv("BASIC_MEMORY_CONFIG_DIR"):
80
+ return Path(basic_memory_dir)
81
+ if xdg_config := os.getenv("XDG_CONFIG_HOME"):
82
+ return Path(xdg_config) / DATA_DIR_NAME
83
+ return Path.home() / ("." + DATA_DIR_NAME)
81
84
 
82
85
 
83
86
  def default_fastembed_cache_dir() -> str:
@@ -142,6 +142,15 @@ async def _set_cached_active_project(
142
142
  await context.set_state("default_project_name", active_project.name)
143
143
 
144
144
 
145
+ async def _clear_cached_active_project(context: Optional[Context]) -> None:
146
+ """Clear cached project metadata that may no longer match the active route."""
147
+ if not context:
148
+ return
149
+
150
+ await context.set_state("active_project", None)
151
+ await context.set_state("default_project_name", None)
152
+
153
+
145
154
  async def _get_cached_active_workspace(context: Optional[Context]) -> Optional[WorkspaceInfo]:
146
155
  """Return the cached active workspace from context when available."""
147
156
  if not context:
@@ -167,8 +176,7 @@ async def _set_cached_active_workspace(
167
176
  # Why: project names are only unique inside one workspace, so a cached
168
177
  # ProjectItem from the previous tenant can point at the wrong project
169
178
  # Outcome: force the next validation call to resolve within the new tenant
170
- await context.set_state("active_project", None)
171
- await context.set_state("default_project_name", None)
179
+ await _clear_cached_active_project(context)
172
180
 
173
181
  await context.set_state("active_workspace", active_workspace.model_dump())
174
182
 
@@ -525,6 +533,28 @@ def _cloud_workspace_discovery_available(config: BasicMemoryConfig) -> bool:
525
533
  )
526
534
 
527
535
 
536
+ def _workspace_identifier_discovery_available(
537
+ identifier: str,
538
+ config: BasicMemoryConfig,
539
+ ) -> bool:
540
+ """Return True when an identifier is allowed to consult workspace discovery."""
541
+ if _cloud_workspace_discovery_available(config):
542
+ return True
543
+
544
+ from basic_memory.mcp.async_client import (
545
+ _explicit_routing,
546
+ _force_local_mode,
547
+ )
548
+
549
+ if _explicit_routing() and _force_local_mode():
550
+ return False
551
+
552
+ return (
553
+ has_cloud_credentials(config)
554
+ and _split_workspace_identifier_segments(identifier) is not None
555
+ )
556
+
557
+
528
558
  async def resolve_workspace_qualified_memory_url(
529
559
  identifier: str,
530
560
  context: Optional[Context] = None,
@@ -1326,11 +1356,23 @@ async def detect_project_from_identifier_prefix(
1326
1356
  # Outcome: keep unqualified search/title input on the active/default project route.
1327
1357
  return None
1328
1358
 
1329
- if _cloud_workspace_discovery_available(config):
1330
- workspace_resolution = await resolve_workspace_qualified_identifier(
1331
- identifier,
1332
- context=context,
1359
+ if _workspace_identifier_discovery_available(identifier, config):
1360
+ workspace_discovery_fallback_errors = (
1361
+ "not found",
1362
+ "no accessible workspaces",
1363
+ "unable to discover",
1333
1364
  )
1365
+ try:
1366
+ workspace_resolution = await resolve_workspace_qualified_identifier(
1367
+ identifier,
1368
+ context=context,
1369
+ )
1370
+ except ValueError as exc:
1371
+ message = str(exc).lower()
1372
+ if any(error in message for error in workspace_discovery_fallback_errors):
1373
+ return None
1374
+ raise
1375
+
1334
1376
  if workspace_resolution is not None:
1335
1377
  return workspace_resolution.project_identifier
1336
1378
 
@@ -1345,7 +1387,7 @@ async def detect_project_from_identifier_prefix(
1345
1387
  )
1346
1388
  except ValueError as exc:
1347
1389
  message = str(exc).lower()
1348
- if "not found" in message or "no accessible workspaces" in message:
1390
+ if any(error in message for error in workspace_discovery_fallback_errors):
1349
1391
  return None
1350
1392
  raise
1351
1393
 
@@ -1462,9 +1504,54 @@ async def get_project_client(
1462
1504
  if project_id and not cloud_available:
1463
1505
  project_mode = ProjectMode.LOCAL
1464
1506
 
1507
+ # Trigger: project_id is a local external_id in a mixed local+cloud setup.
1508
+ # Why: UUIDs are not local config keys, so get_project_mode() treats them as
1509
+ # cloud projects. A local-first probe avoids making local UUIDs depend on
1510
+ # healthy cloud workspace discovery.
1511
+ # Outcome: resolve the effective UUID against local ASGI first; if it is not
1512
+ # local, preserve the existing cloud workspace lookup path.
1513
+ if (
1514
+ project_id
1515
+ and config.projects
1516
+ and not factory_mode
1517
+ and not explicit_cloud_routing
1518
+ and project_mode == ProjectMode.CLOUD
1519
+ ):
1520
+ try:
1521
+ canonical_project_id = str(UUID(resolved_project))
1522
+ except ValueError:
1523
+ pass
1524
+ else:
1525
+ with logfire.span(
1526
+ "routing.local_project_id_probe",
1527
+ project_id=canonical_project_id,
1528
+ ):
1529
+ async with get_client() as client:
1530
+ try:
1531
+ active_project = await get_active_project(
1532
+ client,
1533
+ canonical_project_id,
1534
+ context,
1535
+ )
1536
+ except ToolError as exc:
1537
+ if "not found" not in str(exc).lower():
1538
+ raise
1539
+ else:
1540
+ route_mode = "local_asgi"
1541
+ await _clear_cached_active_workspace_for_local_route(context)
1542
+ with logfire.span(
1543
+ "routing.client_session",
1544
+ project_name=active_project.name,
1545
+ route_mode=route_mode,
1546
+ ):
1547
+ logger.debug("Using local ASGI routing for project_id")
1548
+ yield client, active_project
1549
+ return
1550
+
1465
1551
  if factory_mode or project_mode == ProjectMode.CLOUD or explicit_cloud_routing:
1466
1552
  route_mode = "factory" if factory_mode else "cloud_proxy"
1467
1553
  active_ws: WorkspaceInfo | None = None
1554
+ resolved_entry: WorkspaceProjectEntry | None = None
1468
1555
  workspace_id: str
1469
1556
  project_for_api = _unqualified_project_identifier(resolved_project)
1470
1557
 
@@ -1487,6 +1574,13 @@ async def get_project_client(
1487
1574
 
1488
1575
  if active_ws is not None:
1489
1576
  await _set_cached_active_workspace(context, active_ws)
1577
+ if resolved_entry is not None:
1578
+ cached_project = await _get_cached_active_project(context)
1579
+ if (
1580
+ cached_project is not None
1581
+ and cached_project.external_id != resolved_entry.project.external_id
1582
+ ):
1583
+ await _clear_cached_active_project(context)
1490
1584
  with logfire.span(
1491
1585
  "routing.client_session",
1492
1586
  project_name=project_for_api,
@@ -9,7 +9,7 @@ from pydantic import AliasChoices, Field
9
9
 
10
10
  from basic_memory.config import ConfigManager
11
11
  from basic_memory.mcp.project_context import (
12
- _cloud_workspace_discovery_available,
12
+ _workspace_identifier_discovery_available,
13
13
  detect_project_from_memory_url_prefix,
14
14
  get_project_client,
15
15
  add_project_metadata,
@@ -368,8 +368,9 @@ async def edit_note(
368
368
  config,
369
369
  context=context,
370
370
  )
371
- elif _cloud_workspace_discovery_available(
372
- config
371
+ elif _workspace_identifier_discovery_available(
372
+ identifier,
373
+ config,
373
374
  ) and is_workspace_qualified_plain_identifier(identifier):
374
375
  detected = await detect_project_from_workspace_identifier_prefix(
375
376
  identifier,
@@ -40,17 +40,29 @@ async def detect_project_from_workspace_identifier_prefix(
40
40
  return None
41
41
 
42
42
  from basic_memory.mcp.project_context import (
43
- _cloud_workspace_discovery_available,
43
+ _workspace_identifier_discovery_available,
44
44
  resolve_workspace_qualified_identifier,
45
45
  )
46
46
 
47
- if not _cloud_workspace_discovery_available(config):
47
+ if not _workspace_identifier_discovery_available(identifier, config):
48
48
  return None
49
49
 
50
- workspace_resolution = await resolve_workspace_qualified_identifier(
51
- identifier,
52
- context=context,
50
+ workspace_discovery_fallback_errors = (
51
+ "not found",
52
+ "no accessible workspaces",
53
+ "unable to discover",
53
54
  )
55
+ try:
56
+ workspace_resolution = await resolve_workspace_qualified_identifier(
57
+ identifier,
58
+ context=context,
59
+ )
60
+ except ValueError as exc:
61
+ message = str(exc).lower()
62
+ if any(error in message for error in workspace_discovery_fallback_errors):
63
+ return None
64
+ raise
65
+
54
66
  if workspace_resolution is None:
55
67
  return None
56
68
  return workspace_resolution.project_identifier
@@ -10,6 +10,8 @@ pytest
10
10
 
11
11
  # Run tests against Postgres only (requires docker-compose)
12
12
  docker-compose -f docker-compose-postgres.yml up -d
13
+ BASIC_MEMORY_TEST_POSTGRES=1 \
14
+ POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
13
15
  pytest -m postgres
14
16
 
15
17
  # Run tests against BOTH backends
@@ -54,7 +56,7 @@ database_url = None # Uses default SQLite path
54
56
 
55
57
  # Postgres config
56
58
  database_backend = DatabaseBackend.POSTGRES
57
- database_url = "postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory_test"
59
+ database_url = "postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory"
58
60
  ```
59
61
 
60
62
  ## Running Postgres Tests
@@ -66,18 +68,22 @@ docker-compose -f docker-compose-postgres.yml up -d
66
68
  ```
67
69
 
68
70
  This starts:
69
- - Postgres 17 on port **5433** (not 5432 to avoid conflicts)
70
- - Test database: `basic_memory_test`
71
+ - Postgres 17 with **pgvector** (`pgvector/pgvector:pg17`) on port **5433** (not 5432 to avoid conflicts)
72
+ - Database: `basic_memory`
71
73
  - Credentials: `basic_memory_user` / `dev_password`
72
74
 
73
75
  ### 2. Run Postgres Tests
74
76
 
75
77
  ```bash
76
78
  # Run only Postgres tests
79
+ BASIC_MEMORY_TEST_POSTGRES=1 \
80
+ POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
77
81
  pytest -m postgres
78
82
 
79
83
  # Run specific test with Postgres
80
- pytest tests/test_entity_repository.py::test_create -m postgres
84
+ BASIC_MEMORY_TEST_POSTGRES=1 \
85
+ POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
86
+ pytest tests/repository/test_entity_repository.py::test_create -m postgres
81
87
 
82
88
  # Skip Postgres tests (default behavior)
83
89
  pytest -m "not postgres"
@@ -121,7 +127,7 @@ jobs:
121
127
  # Postgres service container
122
128
  services:
123
129
  postgres:
124
- image: postgres:17
130
+ image: pgvector/pgvector:pg17
125
131
  env:
126
132
  POSTGRES_DB: basic_memory_test
127
133
  POSTGRES_USER: basic_memory_user
@@ -169,4 +175,4 @@ docker-compose -f docker-compose-postgres.yml exec postgres pg_isready -U basic_
169
175
 
170
176
  - [ ] Add `--run-all-backends` CLI flag to run both backends in sequence
171
177
  - [ ] Implement test fixtures for backend-specific features (e.g., Postgres full-text search vs SQLite FTS5)
172
- - [ ] Add performance comparison benchmarks between backends
178
+ - [ ] Add performance comparison benchmarks between backends
@@ -20,6 +20,31 @@ def mcp() -> FastMCP:
20
20
  return cast(Any, mcp_server)
21
21
 
22
22
 
23
+ class ContextState:
24
+ """Minimal FastMCP context-state stub for MCP tests."""
25
+
26
+ def __init__(self):
27
+ self._state: dict[str, object] = {}
28
+
29
+ async def get_state(self, key: str):
30
+ return self._state.get(key)
31
+
32
+ async def set_state(self, key: str, value: object, **kwargs) -> None:
33
+ self._state[key] = value
34
+
35
+ async def info(self, message: str) -> None:
36
+ self._state["info_message"] = message
37
+
38
+
39
+ def ctx(context: ContextState) -> Any:
40
+ return cast(Any, context)
41
+
42
+
43
+ @pytest.fixture
44
+ def context_state() -> ContextState:
45
+ return ContextState()
46
+
47
+
23
48
  @pytest.fixture(scope="function")
24
49
  def app(
25
50
  app_config, project_config, engine_factory, config_manager