basic-memory 0.18.4__tar.gz → 0.18.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 (397) hide show
  1. {basic_memory-0.18.4 → basic_memory-0.18.5}/PKG-INFO +1 -1
  2. {basic_memory-0.18.4 → basic_memory-0.18.5}/server.json +2 -2
  3. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/__init__.py +1 -1
  4. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_commands.py +6 -0
  5. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/postgres_search_repository.py +10 -1
  6. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/search_service.py +16 -7
  7. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_postgres_search_repository.py +23 -1
  8. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_search_service.py +57 -0
  9. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_rclone_commands.py +42 -0
  10. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/release/beta.md +0 -0
  11. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/release/changelog.md +0 -0
  12. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/release/release-check.md +0 -0
  13. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/release/release.md +0 -0
  14. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/spec.md +0 -0
  15. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/commands/test-live.md +0 -0
  16. {basic_memory-0.18.4 → basic_memory-0.18.5}/.claude/settings.json +0 -0
  17. {basic_memory-0.18.4 → basic_memory-0.18.5}/.dockerignore +0 -0
  18. {basic_memory-0.18.4 → basic_memory-0.18.5}/.env.example +0 -0
  19. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  22. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  23. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/dependabot.yml +0 -0
  24. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/claude-code-review.yml +0 -0
  25. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/claude-issue-triage.yml +0 -0
  26. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/claude.yml +0 -0
  27. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/dev-release.yml +0 -0
  28. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/docker.yml +0 -0
  29. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/pr-title.yml +0 -0
  30. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/release.yml +0 -0
  31. {basic_memory-0.18.4 → basic_memory-0.18.5}/.github/workflows/test.yml +0 -0
  32. {basic_memory-0.18.4 → basic_memory-0.18.5}/.gitignore +0 -0
  33. {basic_memory-0.18.4 → basic_memory-0.18.5}/.python-version +0 -0
  34. {basic_memory-0.18.4 → basic_memory-0.18.5}/AGENTS.md +0 -0
  35. {basic_memory-0.18.4 → basic_memory-0.18.5}/CHANGELOG.md +0 -0
  36. {basic_memory-0.18.4 → basic_memory-0.18.5}/CITATION.cff +0 -0
  37. {basic_memory-0.18.4 → basic_memory-0.18.5}/CLA.md +0 -0
  38. {basic_memory-0.18.4 → basic_memory-0.18.5}/CLAUDE.md +0 -0
  39. {basic_memory-0.18.4 → basic_memory-0.18.5}/CODE_OF_CONDUCT.md +0 -0
  40. {basic_memory-0.18.4 → basic_memory-0.18.5}/CONTRIBUTING.md +0 -0
  41. {basic_memory-0.18.4 → basic_memory-0.18.5}/Dockerfile +0 -0
  42. {basic_memory-0.18.4 → basic_memory-0.18.5}/LICENSE +0 -0
  43. {basic_memory-0.18.4 → basic_memory-0.18.5}/README.md +0 -0
  44. {basic_memory-0.18.4 → basic_memory-0.18.5}/SECURITY.md +0 -0
  45. {basic_memory-0.18.4 → basic_memory-0.18.5}/docker-compose-postgres.yml +0 -0
  46. {basic_memory-0.18.4 → basic_memory-0.18.5}/docker-compose.yml +0 -0
  47. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/ARCHITECTURE.md +0 -0
  48. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/Docker.md +0 -0
  49. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/NOTE-FORMAT.md +0 -0
  50. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/ai-assistant-guide-extended.md +0 -0
  51. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/character-handling.md +0 -0
  52. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/cloud-cli.md +0 -0
  53. {basic_memory-0.18.4 → basic_memory-0.18.5}/docs/testing-coverage.md +0 -0
  54. {basic_memory-0.18.4 → basic_memory-0.18.5}/justfile +0 -0
  55. {basic_memory-0.18.4 → basic_memory-0.18.5}/llms-install.md +0 -0
  56. {basic_memory-0.18.4 → basic_memory-0.18.5}/pyproject.toml +0 -0
  57. {basic_memory-0.18.4 → basic_memory-0.18.5}/smithery.yaml +0 -0
  58. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/alembic.ini +0 -0
  59. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/env.py +0 -0
  60. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/migrations.py +0 -0
  61. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/script.py.mako +0 -0
  62. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  63. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  64. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  65. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  66. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  67. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  68. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  69. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  70. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  71. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  72. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  73. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  74. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  75. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  76. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  77. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/__init__.py +0 -0
  78. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/app.py +0 -0
  79. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/container.py +0 -0
  80. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/template_loader.py +0 -0
  81. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/__init__.py +0 -0
  82. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/__init__.py +0 -0
  83. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  84. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  85. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  86. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  87. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  88. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  89. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  90. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  91. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/api/v2/utils.py +0 -0
  92. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/__init__.py +0 -0
  93. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/app.py +0 -0
  94. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/auth.py +0 -0
  95. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/__init__.py +0 -0
  96. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  97. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  98. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  99. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  100. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  101. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  102. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  103. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  104. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  105. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  106. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  107. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  108. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/command_utils.py +0 -0
  109. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/db.py +0 -0
  110. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/doctor.py +0 -0
  111. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/format.py +0 -0
  112. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  113. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  114. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  115. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  116. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/mcp.py +0 -0
  117. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/project.py +0 -0
  118. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/routing.py +0 -0
  119. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/status.py +0 -0
  120. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/commands/tool.py +0 -0
  121. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/container.py +0 -0
  122. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/cli/main.py +0 -0
  123. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/config.py +0 -0
  124. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/db.py +0 -0
  125. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/__init__.py +0 -0
  126. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/config.py +0 -0
  127. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/db.py +0 -0
  128. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/importers.py +0 -0
  129. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/projects.py +0 -0
  130. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/repositories.py +0 -0
  131. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps/services.py +0 -0
  132. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/deps.py +0 -0
  133. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/file_utils.py +0 -0
  134. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/ignore_utils.py +0 -0
  135. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/__init__.py +0 -0
  136. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/base.py +0 -0
  137. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  138. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  139. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  140. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/memory_json_importer.py +0 -0
  141. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/importers/utils.py +0 -0
  142. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/__init__.py +0 -0
  143. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/entity_parser.py +0 -0
  144. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/markdown_processor.py +0 -0
  145. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/plugins.py +0 -0
  146. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/schemas.py +0 -0
  147. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/markdown/utils.py +0 -0
  148. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/__init__.py +0 -0
  149. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/async_client.py +0 -0
  150. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/__init__.py +0 -0
  151. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/directory.py +0 -0
  152. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  153. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/memory.py +0 -0
  154. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/project.py +0 -0
  155. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/resource.py +0 -0
  156. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/search.py +0 -0
  157. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/container.py +0 -0
  158. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/project_context.py +0 -0
  159. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  160. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  161. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  162. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  163. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/search.py +0 -0
  164. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/utils.py +0 -0
  165. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  166. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/project_info.py +0 -0
  167. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/server.py +0 -0
  168. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/__init__.py +0 -0
  169. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/build_context.py +0 -0
  170. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/canvas.py +0 -0
  171. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  172. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  173. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  174. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  175. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/move_note.py +0 -0
  176. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/project_management.py +0 -0
  177. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_content.py +0 -0
  178. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_note.py +0 -0
  179. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  180. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/search.py +0 -0
  181. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/utils.py +0 -0
  182. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/view_note.py +0 -0
  183. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/write_note.py +0 -0
  184. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/models/__init__.py +0 -0
  185. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/models/base.py +0 -0
  186. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/models/knowledge.py +0 -0
  187. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/models/project.py +0 -0
  188. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/models/search.py +0 -0
  189. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/project_resolver.py +0 -0
  190. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/__init__.py +0 -0
  191. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/entity_repository.py +0 -0
  192. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/metadata_filters.py +0 -0
  193. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/observation_repository.py +0 -0
  194. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/project_info_repository.py +0 -0
  195. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/project_repository.py +0 -0
  196. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/relation_repository.py +0 -0
  197. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/repository.py +0 -0
  198. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/search_index_row.py +0 -0
  199. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository.py +0 -0
  200. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository_base.py +0 -0
  201. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  202. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/runtime.py +0 -0
  203. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/__init__.py +0 -0
  204. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/base.py +0 -0
  205. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/cloud.py +0 -0
  206. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/delete.py +0 -0
  207. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/directory.py +0 -0
  208. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/importer.py +0 -0
  209. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/memory.py +0 -0
  210. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/project_info.py +0 -0
  211. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/prompt.py +0 -0
  212. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/request.py +0 -0
  213. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/response.py +0 -0
  214. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/search.py +0 -0
  215. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/sync_report.py +0 -0
  216. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/__init__.py +0 -0
  217. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/entity.py +0 -0
  218. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/resource.py +0 -0
  219. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/__init__.py +0 -0
  220. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/context_service.py +0 -0
  221. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/directory_service.py +0 -0
  222. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/entity_service.py +0 -0
  223. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/exceptions.py +0 -0
  224. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/file_service.py +0 -0
  225. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/initialization.py +0 -0
  226. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/link_resolver.py +0 -0
  227. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/project_service.py +0 -0
  228. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/services/service.py +0 -0
  229. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/sync/__init__.py +0 -0
  230. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/sync/background_sync.py +0 -0
  231. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/sync/coordinator.py +0 -0
  232. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/sync/sync_service.py +0 -0
  233. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/sync/watch_service.py +0 -0
  234. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  235. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/search.hbs +0 -0
  236. {basic_memory-0.18.4 → basic_memory-0.18.5}/src/basic_memory/utils.py +0 -0
  237. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/BENCHMARKS.md +0 -0
  238. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  239. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/cli/test_project_commands_integration.py +0 -0
  240. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/cli/test_routing_integration.py +0 -0
  241. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/cli/test_version_integration.py +0 -0
  242. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/conftest.py +0 -0
  243. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_build_context_underscore.py +0 -0
  244. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_build_context_validation.py +0 -0
  245. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  246. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  247. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_delete_directory_integration.py +0 -0
  248. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_delete_note_integration.py +0 -0
  249. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_edit_note_integration.py +0 -0
  250. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  251. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_list_directory_integration.py +0 -0
  252. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_move_directory_integration.py +0 -0
  253. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_move_note_integration.py +0 -0
  254. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_project_management_integration.py +0 -0
  255. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  256. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_read_content_integration.py +0 -0
  257. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_read_note_integration.py +0 -0
  258. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_search_integration.py +0 -0
  259. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  260. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_smoke_integration.py +0 -0
  261. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/mcp/test_write_note_integration.py +0 -0
  262. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/test_db_wal_mode.py +0 -0
  263. {basic_memory-0.18.4 → basic_memory-0.18.5}/test-int/test_disable_permalinks_integration.py +0 -0
  264. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/Non-MarkdownFileSupport.pdf +0 -0
  265. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/README.md +0 -0
  266. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/Screenshot.png +0 -0
  267. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/__init__.py +0 -0
  268. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/__init__.py +0 -0
  269. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/conftest.py +0 -0
  270. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_directory_router.py +0 -0
  271. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_importer_router.py +0 -0
  272. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_knowledge_router.py +0 -0
  273. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_memory_router.py +0 -0
  274. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_project_router.py +0 -0
  275. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_prompt_router.py +0 -0
  276. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_resource_router.py +0 -0
  277. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/api/v2/test_search_router.py +0 -0
  278. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  279. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  280. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/cloud/test_upload_path.py +0 -0
  281. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/conftest.py +0 -0
  282. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_auth_cli_auth.py +0 -0
  283. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cli_container.py +0 -0
  284. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cli_exit.py +0 -0
  285. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cli_tool_exit.py +0 -0
  286. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cli_tool_json_output.py +0 -0
  287. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cli_tools.py +0 -0
  288. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_cloud_authentication.py +0 -0
  289. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_ignore_utils.py +0 -0
  290. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_import_chatgpt.py +0 -0
  291. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_import_claude_conversations.py +0 -0
  292. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_import_claude_projects.py +0 -0
  293. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_import_memory_json.py +0 -0
  294. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_project_add_with_local_path.py +0 -0
  295. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_restore_commands.py +0 -0
  296. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_routing.py +0 -0
  297. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_snapshot_commands.py +0 -0
  298. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/cli/test_upload.py +0 -0
  299. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/conftest.py +0 -0
  300. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  301. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/importers/test_conversation_indexing.py +0 -0
  302. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/importers/test_importer_base.py +0 -0
  303. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/importers/test_importer_utils.py +0 -0
  304. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/__init__.py +0 -0
  305. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  306. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_entity_parser.py +0 -0
  307. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  308. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_markdown_plugins.py +0 -0
  309. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_markdown_processor.py +0 -0
  310. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_markdown_utils.py +0 -0
  311. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_observation_edge_cases.py +0 -0
  312. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_parser_edge_cases.py +0 -0
  313. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_relation_edge_cases.py +0 -0
  314. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/markdown/test_task_detection.py +0 -0
  315. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/clients/__init__.py +0 -0
  316. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/clients/test_clients.py +0 -0
  317. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/conftest.py +0 -0
  318. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_async_client_force_local.py +0 -0
  319. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_async_client_modes.py +0 -0
  320. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_mcp_container.py +0 -0
  321. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  322. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  323. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_project_context.py +0 -0
  324. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_prompts.py +0 -0
  325. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  326. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_resources.py +0 -0
  327. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_server_lifespan_branches.py +0 -0
  328. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_build_context.py +0 -0
  329. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_canvas.py +0 -0
  330. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_contracts.py +0 -0
  331. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_delete_note.py +0 -0
  332. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_edit_note.py +0 -0
  333. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_list_directory.py +0 -0
  334. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_move_note.py +0 -0
  335. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_project_management.py +0 -0
  336. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_read_content.py +0 -0
  337. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_read_note.py +0 -0
  338. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_recent_activity.py +0 -0
  339. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_resource.py +0 -0
  340. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_search.py +0 -0
  341. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_utils.py +0 -0
  342. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_view_note.py +0 -0
  343. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note.py +0 -0
  344. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  345. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  346. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_entity_repository.py +0 -0
  347. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_entity_repository_upsert.py +0 -0
  348. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  349. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_metadata_filters.py +0 -0
  350. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_observation_repository.py +0 -0
  351. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_project_info_repository.py +0 -0
  352. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_project_repository.py +0 -0
  353. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_relation_repository.py +0 -0
  354. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_repository.py +0 -0
  355. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_search_repository.py +0 -0
  356. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  357. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  358. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_memory_serialization.py +0 -0
  359. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_memory_url.py +0 -0
  360. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_memory_url_validation.py +0 -0
  361. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  362. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_schemas.py +0 -0
  363. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/schemas/test_search.py +0 -0
  364. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_context_service.py +0 -0
  365. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_directory_service.py +0 -0
  366. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_entity_service.py +0 -0
  367. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  368. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_file_service.py +0 -0
  369. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_initialization.py +0 -0
  370. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  371. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_link_resolver.py +0 -0
  372. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_project_removal_bug.py +0 -0
  373. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_project_service.py +0 -0
  374. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/services/test_project_service_operations.py +0 -0
  375. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_character_conflicts.py +0 -0
  376. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_coordinator.py +0 -0
  377. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_sync_service.py +0 -0
  378. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_sync_service_incremental.py +0 -0
  379. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_sync_wikilink_issue.py +0 -0
  380. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_tmp_files.py +0 -0
  381. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_watch_service.py +0 -0
  382. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  383. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_watch_service_edge_cases.py +0 -0
  384. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/sync/test_watch_service_reload.py +0 -0
  385. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_config.py +0 -0
  386. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_deps.py +0 -0
  387. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_production_cascade_delete.py +0 -0
  388. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_project_resolver.py +0 -0
  389. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/test_runtime.py +0 -0
  390. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_file_utils.py +0 -0
  391. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  392. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_parse_tags.py +0 -0
  393. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_permalink_formatting.py +0 -0
  394. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_timezone_utils.py +0 -0
  395. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_utf8_handling.py +0 -0
  396. {basic_memory-0.18.4 → basic_memory-0.18.5}/tests/utils/test_validate_project_path.py +0 -0
  397. {basic_memory-0.18.4 → basic_memory-0.18.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.18.4
3
+ Version: 0.18.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.18.4",
9
+ "version": "0.18.5",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.18.4",
14
+ "version": "0.18.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.18.4"
4
+ __version__ = "0.18.5"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -223,6 +223,9 @@ def project_sync(
223
223
  *TIGRIS_CONSISTENCY_HEADERS,
224
224
  "--filter-from",
225
225
  str(filter_path),
226
+ # Prevent NUL byte padding on virtual filesystems (e.g. Google Drive File Stream)
227
+ # See: rclone/rclone#6801
228
+ "--local-no-preallocate",
226
229
  ]
227
230
 
228
231
  if verbose:
@@ -299,6 +302,9 @@ def project_bisync(
299
302
  str(filter_path),
300
303
  "--workdir",
301
304
  str(state_path),
305
+ # Prevent NUL byte padding on virtual filesystems (e.g. Google Drive File Stream)
306
+ # See: rclone/rclone#6801
307
+ "--local-no-preallocate",
302
308
  ]
303
309
 
304
310
  # Add --create-empty-src-dirs if rclone version supports it (v1.64+)
@@ -19,6 +19,15 @@ from basic_memory.repository.metadata_filters import (
19
19
  from basic_memory.schemas.search import SearchItemType
20
20
 
21
21
 
22
+ def _strip_nul_from_row(row_data: dict) -> dict:
23
+ """Strip NUL bytes from all string values in a row dict.
24
+
25
+ Secondary defense: PostgreSQL text columns cannot store \\x00.
26
+ Primary sanitization happens in SearchService.index_entity_markdown().
27
+ """
28
+ return {k: v.replace("\x00", "") if isinstance(v, str) else v for k, v in row_data.items()}
29
+
30
+
22
31
  class PostgresSearchRepository(SearchRepositoryBase):
23
32
  """PostgreSQL tsvector implementation of search repository.
24
33
 
@@ -489,7 +498,7 @@ class PostgresSearchRepository(SearchRepositoryBase):
489
498
  for row in search_index_rows:
490
499
  insert_data = row.to_insert(serialize_json=True)
491
500
  insert_data["project_id"] = self.project_id
492
- insert_data_list.append(insert_data)
501
+ insert_data_list.append(_strip_nul_from_row(insert_data))
493
502
 
494
503
  # Use upsert to handle race conditions during parallel indexing
495
504
  # ON CONFLICT (permalink, project_id) matches the partial unique index
@@ -22,6 +22,15 @@ from basic_memory.services import FileService
22
22
  MAX_CONTENT_STEMS_SIZE = 6000
23
23
 
24
24
 
25
+ def _strip_nul(value: str) -> str:
26
+ """Strip NUL bytes that PostgreSQL text columns cannot store.
27
+
28
+ rclone preallocation on virtual filesystems (e.g. Google Drive File Stream)
29
+ can pad files with \\x00 bytes. See: rclone/rclone#6801
30
+ """
31
+ return value.replace("\x00", "")
32
+
33
+
25
34
  def _mtime_to_datetime(entity: Entity) -> datetime:
26
35
  """Convert entity mtime (file modification time) to datetime.
27
36
 
@@ -297,7 +306,7 @@ class SearchService:
297
306
  content = await self.file_service.read_entity_content(entity)
298
307
  if content:
299
308
  content_stems.append(content)
300
- content_snippet = f"{content[:250]}"
309
+ content_snippet = _strip_nul(content[:250])
301
310
 
302
311
  if entity.permalink:
303
312
  content_stems.extend(self._generate_variants(entity.permalink))
@@ -309,7 +318,7 @@ class SearchService:
309
318
  if entity_tags:
310
319
  content_stems.extend(entity_tags)
311
320
 
312
- entity_content_stems = "\n".join(p for p in content_stems if p and p.strip())
321
+ entity_content_stems = _strip_nul("\n".join(p for p in content_stems if p and p.strip()))
313
322
 
314
323
  # Truncate to stay under Postgres's 8KB index row limit
315
324
  if len(entity_content_stems) > MAX_CONTENT_STEMS_SIZE: # pragma: no cover
@@ -346,8 +355,8 @@ class SearchService:
346
355
  seen_permalinks.add(obs_permalink)
347
356
 
348
357
  # Index with parent entity's file path since that's where it's defined
349
- obs_content_stems = "\n".join(
350
- p for p in self._generate_variants(obs.content) if p and p.strip()
358
+ obs_content_stems = _strip_nul(
359
+ "\n".join(p for p in self._generate_variants(obs.content) if p and p.strip())
351
360
  )
352
361
  # Truncate to stay under Postgres's 8KB index row limit
353
362
  if len(obs_content_stems) > MAX_CONTENT_STEMS_SIZE: # pragma: no cover
@@ -358,7 +367,7 @@ class SearchService:
358
367
  type=SearchItemType.OBSERVATION.value,
359
368
  title=f"{obs.category}: {obs.content[:100]}...",
360
369
  content_stems=obs_content_stems,
361
- content_snippet=obs.content,
370
+ content_snippet=_strip_nul(obs.content),
362
371
  permalink=obs_permalink,
363
372
  file_path=entity.file_path,
364
373
  category=obs.category,
@@ -381,8 +390,8 @@ class SearchService:
381
390
  else f"{rel.from_entity.title}"
382
391
  )
383
392
 
384
- rel_content_stems = "\n".join(
385
- p for p in self._generate_variants(relation_title) if p and p.strip()
393
+ rel_content_stems = _strip_nul(
394
+ "\n".join(p for p in self._generate_variants(relation_title) if p and p.strip())
386
395
  )
387
396
  rows_to_index.append(
388
397
  SearchIndexRow(
@@ -8,7 +8,10 @@ from datetime import datetime, timedelta, timezone
8
8
 
9
9
  import pytest
10
10
 
11
- from basic_memory.repository.postgres_search_repository import PostgresSearchRepository
11
+ from basic_memory.repository.postgres_search_repository import (
12
+ PostgresSearchRepository,
13
+ _strip_nul_from_row,
14
+ )
12
15
  from basic_memory.repository.search_index_row import SearchIndexRow
13
16
  from basic_memory.schemas.search import SearchItemType
14
17
 
@@ -197,3 +200,22 @@ async def test_postgres_search_repository_reraises_non_tsquery_db_errors(
197
200
  # Use a non-text query so the generated SQL doesn't include to_tsquery(),
198
201
  # ensuring we hit the generic "re-raise other db errors" branch.
199
202
  await repo.search(permalink="docs/anything")
203
+
204
+
205
+ def test_strip_nul_from_row():
206
+ """_strip_nul_from_row strips NUL bytes from string values, leaves non-strings alone."""
207
+ row = {
208
+ "title": "hello\x00world",
209
+ "content_stems": "some\x00content\x00here",
210
+ "content_snippet": "clean",
211
+ "id": 42,
212
+ "metadata": None,
213
+ "created_at": datetime(2024, 1, 1),
214
+ }
215
+ result = _strip_nul_from_row(row)
216
+ assert result["title"] == "helloworld"
217
+ assert result["content_stems"] == "somecontenthere"
218
+ assert result["content_snippet"] == "clean"
219
+ assert result["id"] == 42
220
+ assert result["metadata"] is None
221
+ assert result["created_at"] == datetime(2024, 1, 1)
@@ -7,6 +7,7 @@ from sqlalchemy import text
7
7
 
8
8
  from basic_memory import db
9
9
  from basic_memory.schemas.search import SearchQuery, SearchItemType
10
+ from basic_memory.services.search_service import _strip_nul
10
11
 
11
12
 
12
13
  @pytest.mark.asyncio
@@ -968,3 +969,59 @@ async def test_index_entity_multiple_categories_same_content(
968
969
  # Search for the shared content - should find both observations
969
970
  results = await search_service.search(SearchQuery(text="Shared content"))
970
971
  assert len(results) >= 2
972
+
973
+
974
+ # Tests for NUL byte stripping
975
+
976
+
977
+ def test_strip_nul_removes_nul_bytes():
978
+ """_strip_nul removes \\x00 from strings."""
979
+ assert _strip_nul("hello\x00world") == "helloworld"
980
+ assert _strip_nul("\x00\x00\x00") == ""
981
+ assert _strip_nul("clean string") == "clean string"
982
+
983
+
984
+ @pytest.mark.asyncio
985
+ async def test_index_entity_markdown_strips_nul_bytes(search_service, session_maker, test_project):
986
+ """Content with NUL bytes should be stripped before indexing.
987
+
988
+ rclone preallocation on virtual filesystems (e.g. Google Drive File Stream)
989
+ can pad files with \\x00 bytes, causing PostgreSQL CharacterNotInRepertoireError.
990
+ """
991
+ from basic_memory.repository import EntityRepository, ObservationRepository
992
+ from basic_memory.repository.search_repository import SearchRepository
993
+
994
+ entity_repo = EntityRepository(session_maker, project_id=test_project.id)
995
+ obs_repo = ObservationRepository(session_maker, project_id=test_project.id)
996
+
997
+ entity_data = {
998
+ "title": "NUL Test Entity",
999
+ "entity_type": "note",
1000
+ "entity_metadata": {},
1001
+ "content_type": "text/markdown",
1002
+ "file_path": "test/nul-test.md",
1003
+ "permalink": "test/nul-test",
1004
+ "project_id": test_project.id,
1005
+ "created_at": datetime.now(),
1006
+ "updated_at": datetime.now(),
1007
+ }
1008
+ entity = await entity_repo.create(entity_data)
1009
+
1010
+ # Add observation with NUL bytes
1011
+ await obs_repo.create(
1012
+ {"entity_id": entity.id, "category": "note", "content": "obs with\x00nul bytes"}
1013
+ )
1014
+ entity = await entity_repo.get_by_permalink("test/nul-test")
1015
+
1016
+ # Index with NUL-containing content
1017
+ nul_content = "# NUL Test\x00\x00\nSome content\x00here"
1018
+ await search_service.index_entity(entity, content=nul_content)
1019
+
1020
+ # Verify no NUL bytes in stored search index rows
1021
+ search_repo: SearchRepository = search_service.repository
1022
+ results = await search_repo.search(permalink_match="test/nul-test*")
1023
+ for row in results:
1024
+ if row.content_snippet:
1025
+ assert "\x00" not in row.content_snippet, (
1026
+ f"NUL found in content_snippet for {row.permalink}"
1027
+ )
@@ -511,3 +511,45 @@ def test_supports_create_empty_src_dirs_false_for_unknown_version():
511
511
 
512
512
  def test_min_rclone_version_constant():
513
513
  assert MIN_RCLONE_VERSION_EMPTY_DIRS == (1, 64, 0)
514
+
515
+
516
+ def test_project_sync_includes_no_preallocate_flag(tmp_path):
517
+ """Sync command includes --local-no-preallocate to prevent NUL byte padding."""
518
+ runner = _Runner(returncode=0)
519
+ filter_path = _write_filter_file(tmp_path)
520
+ project = SyncProject(name="research", path="/research", local_sync_path="/tmp/research")
521
+
522
+ project_sync(
523
+ project,
524
+ "my-bucket",
525
+ run=runner,
526
+ is_installed=lambda: True,
527
+ filter_path=filter_path,
528
+ )
529
+
530
+ cmd, _ = runner.calls[0]
531
+ assert "--local-no-preallocate" in cmd
532
+
533
+
534
+ def test_project_bisync_includes_no_preallocate_flag(tmp_path):
535
+ """Bisync command includes --local-no-preallocate to prevent NUL byte padding."""
536
+ runner = _Runner(returncode=0)
537
+ filter_path = _write_filter_file(tmp_path)
538
+ state_path = tmp_path / "state"
539
+ project = SyncProject(
540
+ name="research", path="app/data/research", local_sync_path="/tmp/research"
541
+ )
542
+
543
+ project_bisync(
544
+ project,
545
+ "my-bucket",
546
+ run=runner,
547
+ is_installed=lambda: True,
548
+ version=(1, 64, 2),
549
+ filter_path=filter_path,
550
+ state_path=state_path,
551
+ is_initialized=lambda _name: True,
552
+ )
553
+
554
+ cmd, _ = runner.calls[0]
555
+ assert "--local-no-preallocate" in cmd
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes