basic-memory 0.18.3__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 (499) hide show
  1. {basic_memory-0.18.3 → basic_memory-0.18.5}/CHANGELOG.md +2 -2
  2. {basic_memory-0.18.3 → basic_memory-0.18.5}/PKG-INFO +1 -1
  3. {basic_memory-0.18.3 → basic_memory-0.18.5}/server.json +2 -2
  4. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/__init__.py +1 -1
  5. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/app.py +0 -2
  6. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/__init__.py +0 -2
  7. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/__init__.py +1 -2
  8. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_commands.py +6 -0
  9. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/main.py +0 -1
  10. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/__init__.py +0 -2
  11. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/__init__.py +0 -6
  12. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/postgres_search_repository.py +10 -1
  13. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/search_service.py +16 -7
  14. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_postgres_search_repository.py +23 -1
  15. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_search_service.py +57 -0
  16. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_rclone_commands.py +42 -0
  17. basic_memory-0.18.3/docs/NOTE-FORMAT.md +0 -494
  18. basic_memory-0.18.3/docs/specs/SPEC-SCHEMA-IMPL.md +0 -365
  19. basic_memory-0.18.3/docs/specs/SPEC-SCHEMA.md +0 -462
  20. basic_memory-0.18.3/src/basic_memory/api/v2/routers/schema_router.py +0 -305
  21. basic_memory-0.18.3/src/basic_memory/cli/commands/schema.py +0 -336
  22. basic_memory-0.18.3/src/basic_memory/mcp/clients/schema.py +0 -113
  23. basic_memory-0.18.3/src/basic_memory/mcp/tools/schema.py +0 -244
  24. basic_memory-0.18.3/src/basic_memory/schema/__init__.py +0 -58
  25. basic_memory-0.18.3/src/basic_memory/schema/diff.py +0 -111
  26. basic_memory-0.18.3/src/basic_memory/schema/inference.py +0 -323
  27. basic_memory-0.18.3/src/basic_memory/schema/parser.py +0 -236
  28. basic_memory-0.18.3/src/basic_memory/schema/resolver.py +0 -118
  29. basic_memory-0.18.3/src/basic_memory/schema/validator.py +0 -259
  30. basic_memory-0.18.3/src/basic_memory/schemas/schema.py +0 -121
  31. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -17
  32. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -16
  33. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -16
  34. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -15
  35. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -16
  36. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -16
  37. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -17
  38. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -17
  39. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -16
  40. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -16
  41. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -15
  42. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -17
  43. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -15
  44. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -16
  45. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -15
  46. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -15
  47. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -14
  48. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -16
  49. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -15
  50. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -16
  51. basic_memory-0.18.3/test-int/fixtures/schema/drift/schema/Person.md +0 -18
  52. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/array-single.md +0 -17
  53. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/empty-note.md +0 -5
  54. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -20
  55. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -20
  56. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -11
  57. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/relation-only.md +0 -15
  58. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -17
  59. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -19
  60. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -20
  61. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/alan-turing.md +0 -24
  62. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -25
  63. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -21
  64. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -22
  65. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -20
  66. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -22
  67. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -22
  68. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -23
  69. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dijkstra.md +0 -21
  70. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -22
  71. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -20
  72. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -23
  73. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -24
  74. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -22
  75. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/james-gosling.md +0 -21
  76. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/john-carmack.md +0 -24
  77. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -22
  78. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/larry-page.md +0 -18
  79. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -24
  80. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -26
  81. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -24
  82. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -18
  83. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -23
  84. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rob-pike.md +0 -23
  85. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -18
  86. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -25
  87. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -21
  88. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -24
  89. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -19
  90. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Book.md +0 -22
  91. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Meeting.md +0 -22
  92. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Person.md +0 -27
  93. basic_memory-0.18.3/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -23
  94. basic_memory-0.18.3/test-int/fixtures/schema/schemas/StrictSchema.md +0 -22
  95. basic_memory-0.18.3/test-int/fixtures/schema/valid/basic-memory.md +0 -27
  96. basic_memory-0.18.3/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -24
  97. basic_memory-0.18.3/test-int/fixtures/schema/valid/no-schema-note.md +0 -17
  98. basic_memory-0.18.3/test-int/fixtures/schema/valid/paul-graham.md +0 -29
  99. basic_memory-0.18.3/test-int/fixtures/schema/valid/rich-hickey.md +0 -24
  100. basic_memory-0.18.3/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -32
  101. basic_memory-0.18.3/test-int/fixtures/schema/warnings/extra-observations.md +0 -27
  102. basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-multiple.md +0 -19
  103. basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-required.md +0 -19
  104. basic_memory-0.18.3/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -21
  105. basic_memory-0.18.3/test-int/test_schema/__init__.py +0 -1
  106. basic_memory-0.18.3/test-int/test_schema/conftest.py +0 -85
  107. basic_memory-0.18.3/test-int/test_schema/helpers.py +0 -61
  108. basic_memory-0.18.3/test-int/test_schema/test_diff_integration.py +0 -72
  109. basic_memory-0.18.3/test-int/test_schema/test_inference_integration.py +0 -112
  110. basic_memory-0.18.3/test-int/test_schema/test_parser_integration.py +0 -83
  111. basic_memory-0.18.3/test-int/test_schema/test_validator_integration.py +0 -179
  112. basic_memory-0.18.3/tests/api/v2/test_schema_router.py +0 -347
  113. basic_memory-0.18.3/tests/schema/__init__.py +0 -1
  114. basic_memory-0.18.3/tests/schema/test_diff.py +0 -204
  115. basic_memory-0.18.3/tests/schema/test_inference.py +0 -270
  116. basic_memory-0.18.3/tests/schema/test_parser.py +0 -255
  117. basic_memory-0.18.3/tests/schema/test_resolver.py +0 -162
  118. basic_memory-0.18.3/tests/schema/test_validator.py +0 -257
  119. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/beta.md +0 -0
  120. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/changelog.md +0 -0
  121. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/release-check.md +0 -0
  122. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/release.md +0 -0
  123. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/spec.md +0 -0
  124. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/test-live.md +0 -0
  125. {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/settings.json +0 -0
  126. {basic_memory-0.18.3 → basic_memory-0.18.5}/.dockerignore +0 -0
  127. {basic_memory-0.18.3 → basic_memory-0.18.5}/.env.example +0 -0
  128. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  129. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  130. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  131. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  132. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/dependabot.yml +0 -0
  133. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude-code-review.yml +0 -0
  134. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude-issue-triage.yml +0 -0
  135. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude.yml +0 -0
  136. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/dev-release.yml +0 -0
  137. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/docker.yml +0 -0
  138. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/pr-title.yml +0 -0
  139. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/release.yml +0 -0
  140. {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/test.yml +0 -0
  141. {basic_memory-0.18.3 → basic_memory-0.18.5}/.gitignore +0 -0
  142. {basic_memory-0.18.3 → basic_memory-0.18.5}/.python-version +0 -0
  143. {basic_memory-0.18.3 → basic_memory-0.18.5}/AGENTS.md +0 -0
  144. {basic_memory-0.18.3 → basic_memory-0.18.5}/CITATION.cff +0 -0
  145. {basic_memory-0.18.3 → basic_memory-0.18.5}/CLA.md +0 -0
  146. {basic_memory-0.18.3 → basic_memory-0.18.5}/CLAUDE.md +0 -0
  147. {basic_memory-0.18.3 → basic_memory-0.18.5}/CODE_OF_CONDUCT.md +0 -0
  148. {basic_memory-0.18.3 → basic_memory-0.18.5}/CONTRIBUTING.md +0 -0
  149. {basic_memory-0.18.3 → basic_memory-0.18.5}/Dockerfile +0 -0
  150. {basic_memory-0.18.3 → basic_memory-0.18.5}/LICENSE +0 -0
  151. {basic_memory-0.18.3 → basic_memory-0.18.5}/README.md +0 -0
  152. {basic_memory-0.18.3 → basic_memory-0.18.5}/SECURITY.md +0 -0
  153. {basic_memory-0.18.3 → basic_memory-0.18.5}/docker-compose-postgres.yml +0 -0
  154. {basic_memory-0.18.3 → basic_memory-0.18.5}/docker-compose.yml +0 -0
  155. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/ARCHITECTURE.md +0 -0
  156. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/Docker.md +0 -0
  157. {basic_memory-0.18.3 → basic_memory-0.18.5/docs}/NOTE-FORMAT.md +0 -0
  158. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/ai-assistant-guide-extended.md +0 -0
  159. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/character-handling.md +0 -0
  160. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/cloud-cli.md +0 -0
  161. {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/testing-coverage.md +0 -0
  162. {basic_memory-0.18.3 → basic_memory-0.18.5}/justfile +0 -0
  163. {basic_memory-0.18.3 → basic_memory-0.18.5}/llms-install.md +0 -0
  164. {basic_memory-0.18.3 → basic_memory-0.18.5}/pyproject.toml +0 -0
  165. {basic_memory-0.18.3 → basic_memory-0.18.5}/smithery.yaml +0 -0
  166. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/alembic.ini +0 -0
  167. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/env.py +0 -0
  168. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/migrations.py +0 -0
  169. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/script.py.mako +0 -0
  170. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  171. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  172. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  173. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  174. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  175. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  176. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  177. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  178. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  179. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  180. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  181. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
  182. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  183. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  184. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  185. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/__init__.py +0 -0
  186. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/container.py +0 -0
  187. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/template_loader.py +0 -0
  188. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/__init__.py +0 -0
  189. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  190. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  191. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  192. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  193. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  194. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  195. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  196. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  197. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/utils.py +0 -0
  198. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/__init__.py +0 -0
  199. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/app.py +0 -0
  200. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/auth.py +0 -0
  201. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  202. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  203. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  204. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  205. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  206. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  207. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  208. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  209. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  210. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  211. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  212. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  213. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/command_utils.py +0 -0
  214. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/db.py +0 -0
  215. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/doctor.py +0 -0
  216. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/format.py +0 -0
  217. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  218. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  219. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  220. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  221. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/mcp.py +0 -0
  222. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/project.py +0 -0
  223. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/routing.py +0 -0
  224. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/status.py +0 -0
  225. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/tool.py +0 -0
  226. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/container.py +0 -0
  227. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/config.py +0 -0
  228. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/db.py +0 -0
  229. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/__init__.py +0 -0
  230. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/config.py +0 -0
  231. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/db.py +0 -0
  232. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/importers.py +0 -0
  233. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/projects.py +0 -0
  234. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/repositories.py +0 -0
  235. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/services.py +0 -0
  236. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps.py +0 -0
  237. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/file_utils.py +0 -0
  238. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/ignore_utils.py +0 -0
  239. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/__init__.py +0 -0
  240. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/base.py +0 -0
  241. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  242. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  243. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  244. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/memory_json_importer.py +0 -0
  245. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/utils.py +0 -0
  246. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/__init__.py +0 -0
  247. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/entity_parser.py +0 -0
  248. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/markdown_processor.py +0 -0
  249. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/plugins.py +0 -0
  250. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/schemas.py +0 -0
  251. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/utils.py +0 -0
  252. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/__init__.py +0 -0
  253. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/async_client.py +0 -0
  254. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/directory.py +0 -0
  255. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  256. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/memory.py +0 -0
  257. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/project.py +0 -0
  258. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/resource.py +0 -0
  259. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/search.py +0 -0
  260. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/container.py +0 -0
  261. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/project_context.py +0 -0
  262. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  263. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  264. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  265. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  266. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/search.py +0 -0
  267. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/utils.py +0 -0
  268. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  269. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/project_info.py +0 -0
  270. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/server.py +0 -0
  271. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/build_context.py +0 -0
  272. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/canvas.py +0 -0
  273. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  274. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  275. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  276. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  277. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/move_note.py +0 -0
  278. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/project_management.py +0 -0
  279. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_content.py +0 -0
  280. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_note.py +0 -0
  281. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  282. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/search.py +0 -0
  283. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/utils.py +0 -0
  284. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/view_note.py +0 -0
  285. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/write_note.py +0 -0
  286. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/__init__.py +0 -0
  287. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/base.py +0 -0
  288. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/knowledge.py +0 -0
  289. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/project.py +0 -0
  290. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/search.py +0 -0
  291. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/project_resolver.py +0 -0
  292. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/__init__.py +0 -0
  293. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/entity_repository.py +0 -0
  294. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/metadata_filters.py +0 -0
  295. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/observation_repository.py +0 -0
  296. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/project_info_repository.py +0 -0
  297. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/project_repository.py +0 -0
  298. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/relation_repository.py +0 -0
  299. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/repository.py +0 -0
  300. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_index_row.py +0 -0
  301. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository.py +0 -0
  302. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository_base.py +0 -0
  303. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  304. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/runtime.py +0 -0
  305. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/__init__.py +0 -0
  306. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/base.py +0 -0
  307. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/cloud.py +0 -0
  308. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/delete.py +0 -0
  309. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/directory.py +0 -0
  310. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/importer.py +0 -0
  311. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/memory.py +0 -0
  312. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/project_info.py +0 -0
  313. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/prompt.py +0 -0
  314. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/request.py +0 -0
  315. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/response.py +0 -0
  316. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/search.py +0 -0
  317. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/sync_report.py +0 -0
  318. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/__init__.py +0 -0
  319. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/entity.py +0 -0
  320. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/resource.py +0 -0
  321. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/__init__.py +0 -0
  322. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/context_service.py +0 -0
  323. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/directory_service.py +0 -0
  324. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/entity_service.py +0 -0
  325. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/exceptions.py +0 -0
  326. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/file_service.py +0 -0
  327. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/initialization.py +0 -0
  328. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/link_resolver.py +0 -0
  329. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/project_service.py +0 -0
  330. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/service.py +0 -0
  331. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/__init__.py +0 -0
  332. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/background_sync.py +0 -0
  333. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/coordinator.py +0 -0
  334. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/sync_service.py +0 -0
  335. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/watch_service.py +0 -0
  336. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  337. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/search.hbs +0 -0
  338. {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/utils.py +0 -0
  339. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/BENCHMARKS.md +0 -0
  340. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  341. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_project_commands_integration.py +0 -0
  342. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_routing_integration.py +0 -0
  343. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_version_integration.py +0 -0
  344. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/conftest.py +0 -0
  345. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_build_context_underscore.py +0 -0
  346. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_build_context_validation.py +0 -0
  347. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  348. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  349. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_delete_directory_integration.py +0 -0
  350. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_delete_note_integration.py +0 -0
  351. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_edit_note_integration.py +0 -0
  352. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  353. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_list_directory_integration.py +0 -0
  354. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_move_directory_integration.py +0 -0
  355. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_move_note_integration.py +0 -0
  356. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_project_management_integration.py +0 -0
  357. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  358. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_read_content_integration.py +0 -0
  359. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_read_note_integration.py +0 -0
  360. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_search_integration.py +0 -0
  361. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  362. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_smoke_integration.py +0 -0
  363. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_write_note_integration.py +0 -0
  364. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/test_db_wal_mode.py +0 -0
  365. {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/test_disable_permalinks_integration.py +0 -0
  366. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/Non-MarkdownFileSupport.pdf +0 -0
  367. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/README.md +0 -0
  368. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/Screenshot.png +0 -0
  369. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/__init__.py +0 -0
  370. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/__init__.py +0 -0
  371. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/conftest.py +0 -0
  372. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_directory_router.py +0 -0
  373. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_importer_router.py +0 -0
  374. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_knowledge_router.py +0 -0
  375. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_memory_router.py +0 -0
  376. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_project_router.py +0 -0
  377. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_prompt_router.py +0 -0
  378. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_resource_router.py +0 -0
  379. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_search_router.py +0 -0
  380. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  381. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  382. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_upload_path.py +0 -0
  383. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/conftest.py +0 -0
  384. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_auth_cli_auth.py +0 -0
  385. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_container.py +0 -0
  386. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_exit.py +0 -0
  387. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tool_exit.py +0 -0
  388. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tool_json_output.py +0 -0
  389. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tools.py +0 -0
  390. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cloud_authentication.py +0 -0
  391. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_ignore_utils.py +0 -0
  392. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_chatgpt.py +0 -0
  393. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_claude_conversations.py +0 -0
  394. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_claude_projects.py +0 -0
  395. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_memory_json.py +0 -0
  396. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_project_add_with_local_path.py +0 -0
  397. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_restore_commands.py +0 -0
  398. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_routing.py +0 -0
  399. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_snapshot_commands.py +0 -0
  400. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_upload.py +0 -0
  401. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/conftest.py +0 -0
  402. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  403. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_conversation_indexing.py +0 -0
  404. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_importer_base.py +0 -0
  405. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_importer_utils.py +0 -0
  406. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/__init__.py +0 -0
  407. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  408. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_entity_parser.py +0 -0
  409. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  410. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_plugins.py +0 -0
  411. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_processor.py +0 -0
  412. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_utils.py +0 -0
  413. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_observation_edge_cases.py +0 -0
  414. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_parser_edge_cases.py +0 -0
  415. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_relation_edge_cases.py +0 -0
  416. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_task_detection.py +0 -0
  417. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/clients/__init__.py +0 -0
  418. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/clients/test_clients.py +0 -0
  419. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/conftest.py +0 -0
  420. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_async_client_force_local.py +0 -0
  421. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_async_client_modes.py +0 -0
  422. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_mcp_container.py +0 -0
  423. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  424. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  425. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_project_context.py +0 -0
  426. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_prompts.py +0 -0
  427. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  428. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_resources.py +0 -0
  429. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_server_lifespan_branches.py +0 -0
  430. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_build_context.py +0 -0
  431. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_canvas.py +0 -0
  432. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_contracts.py +0 -0
  433. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_delete_note.py +0 -0
  434. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_edit_note.py +0 -0
  435. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_list_directory.py +0 -0
  436. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_move_note.py +0 -0
  437. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_project_management.py +0 -0
  438. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_read_content.py +0 -0
  439. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_read_note.py +0 -0
  440. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_recent_activity.py +0 -0
  441. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_resource.py +0 -0
  442. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_search.py +0 -0
  443. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_utils.py +0 -0
  444. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_view_note.py +0 -0
  445. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note.py +0 -0
  446. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  447. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  448. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_repository.py +0 -0
  449. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_repository_upsert.py +0 -0
  450. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  451. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_metadata_filters.py +0 -0
  452. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_observation_repository.py +0 -0
  453. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_project_info_repository.py +0 -0
  454. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_project_repository.py +0 -0
  455. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_relation_repository.py +0 -0
  456. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_repository.py +0 -0
  457. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_search_repository.py +0 -0
  458. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  459. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  460. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_serialization.py +0 -0
  461. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_url.py +0 -0
  462. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_url_validation.py +0 -0
  463. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  464. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_schemas.py +0 -0
  465. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_search.py +0 -0
  466. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_context_service.py +0 -0
  467. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_directory_service.py +0 -0
  468. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_entity_service.py +0 -0
  469. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  470. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_file_service.py +0 -0
  471. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_initialization.py +0 -0
  472. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  473. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_link_resolver.py +0 -0
  474. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_removal_bug.py +0 -0
  475. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_service.py +0 -0
  476. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_service_operations.py +0 -0
  477. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_character_conflicts.py +0 -0
  478. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_coordinator.py +0 -0
  479. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_service.py +0 -0
  480. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_service_incremental.py +0 -0
  481. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_wikilink_issue.py +0 -0
  482. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_tmp_files.py +0 -0
  483. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service.py +0 -0
  484. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  485. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_edge_cases.py +0 -0
  486. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_reload.py +0 -0
  487. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_config.py +0 -0
  488. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_deps.py +0 -0
  489. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_production_cascade_delete.py +0 -0
  490. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_project_resolver.py +0 -0
  491. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_runtime.py +0 -0
  492. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_file_utils.py +0 -0
  493. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  494. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_parse_tags.py +0 -0
  495. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_permalink_formatting.py +0 -0
  496. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_timezone_utils.py +0 -0
  497. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_utf8_handling.py +0 -0
  498. {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_validate_project_path.py +0 -0
  499. {basic_memory-0.18.3 → basic_memory-0.18.5}/uv.lock +0 -0
@@ -1,11 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
- ## v0.18.3 (2026-02-12)
3
+ ## v0.18.4 (2026-02-12)
4
4
 
5
5
  ### Bug Fixes
6
6
 
7
7
  - Use global `--header` flag for Tigris consistency on all rclone transactions
8
- ([`7fcf587`](https://github.com/basicmachines-co/basic-memory/commit/7fcf587))
8
+ ([`0eae0e1`](https://github.com/basicmachines-co/basic-memory/commit/0eae0e1))
9
9
  - `--header-download` / `--header-upload` only apply to GET/PUT requests, missing S3
10
10
  ListObjectsV2 calls that bisync issues first. Non-US users saw stale edge-cached metadata.
11
11
  - `--header` applies to ALL HTTP transactions (list, download, upload), fixing bisync for
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.18.3
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.3",
9
+ "version": "0.18.5",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "basic-memory",
14
- "version": "0.18.3",
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.3"
4
+ __version__ = "0.18.5"
5
5
 
6
6
  # API version for FastAPI - independent of package version
7
7
  __api_version__ = "v0"
@@ -18,7 +18,6 @@ from basic_memory.api.v2.routers import (
18
18
  directory_router as v2_directory,
19
19
  prompt_router as v2_prompt,
20
20
  importer_router as v2_importer,
21
- schema_router as v2_schema,
22
21
  )
23
22
  from basic_memory.api.v2.routers.project_router import (
24
23
  add_project,
@@ -85,7 +84,6 @@ app.include_router(v2_resource, prefix="/v2/projects/{project_id}")
85
84
  app.include_router(v2_directory, prefix="/v2/projects/{project_id}")
86
85
  app.include_router(v2_prompt, prefix="/v2/projects/{project_id}")
87
86
  app.include_router(v2_importer, prefix="/v2/projects/{project_id}")
88
- app.include_router(v2_schema, prefix="/v2/projects/{project_id}")
89
87
  app.include_router(v2_project, prefix="/v2")
90
88
 
91
89
  # Legacy web app proxy paths (compat with /proxy/projects/projects)
@@ -8,7 +8,6 @@ from basic_memory.api.v2.routers.resource_router import router as resource_route
8
8
  from basic_memory.api.v2.routers.directory_router import router as directory_router
9
9
  from basic_memory.api.v2.routers.prompt_router import router as prompt_router
10
10
  from basic_memory.api.v2.routers.importer_router import router as importer_router
11
- from basic_memory.api.v2.routers.schema_router import router as schema_router
12
11
 
13
12
  __all__ = [
14
13
  "knowledge_router",
@@ -19,5 +18,4 @@ __all__ = [
19
18
  "directory_router",
20
19
  "prompt_router",
21
20
  "importer_router",
22
- "schema_router",
23
21
  ]
@@ -1,7 +1,7 @@
1
1
  """CLI commands for basic-memory."""
2
2
 
3
3
  from . import status, db, doctor, import_memory_json, mcp, import_claude_conversations
4
- from . import import_claude_projects, import_chatgpt, tool, project, format, schema
4
+ from . import import_claude_projects, import_chatgpt, tool, project, format
5
5
 
6
6
  __all__ = [
7
7
  "status",
@@ -15,5 +15,4 @@ __all__ = [
15
15
  "tool",
16
16
  "project",
17
17
  "format",
18
- "schema",
19
18
  ]
@@ -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+)
@@ -13,7 +13,6 @@ from basic_memory.cli.commands import ( # noqa: F401 # pragma: no cover
13
13
  import_memory_json,
14
14
  mcp,
15
15
  project,
16
- schema,
17
16
  status,
18
17
  tool,
19
18
  )
@@ -17,7 +17,6 @@ from basic_memory.mcp.clients.memory import MemoryClient
17
17
  from basic_memory.mcp.clients.directory import DirectoryClient
18
18
  from basic_memory.mcp.clients.resource import ResourceClient
19
19
  from basic_memory.mcp.clients.project import ProjectClient
20
- from basic_memory.mcp.clients.schema import SchemaClient
21
20
 
22
21
  __all__ = [
23
22
  "KnowledgeClient",
@@ -26,5 +25,4 @@ __all__ = [
26
25
  "DirectoryClient",
27
26
  "ResourceClient",
28
27
  "ProjectClient",
29
- "SchemaClient",
30
28
  ]
@@ -27,9 +27,6 @@ from basic_memory.mcp.tools.project_management import (
27
27
  # ChatGPT-compatible tools
28
28
  from basic_memory.mcp.tools.chatgpt_tools import search, fetch
29
29
 
30
- # Schema tools
31
- from basic_memory.mcp.tools.schema import schema_validate, schema_infer, schema_diff
32
-
33
30
  __all__ = [
34
31
  "build_context",
35
32
  "canvas",
@@ -44,9 +41,6 @@ __all__ = [
44
41
  "read_content",
45
42
  "read_note",
46
43
  "recent_activity",
47
- "schema_diff",
48
- "schema_infer",
49
- "schema_validate",
50
44
  "search",
51
45
  "search_by_metadata",
52
46
  "search_notes",
@@ -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