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.
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CHANGELOG.md +2 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/PKG-INFO +1 -1
- {basic_memory-0.18.3 → basic_memory-0.18.5}/server.json +2 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/app.py +0 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/__init__.py +0 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/__init__.py +1 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_commands.py +6 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/main.py +0 -1
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/__init__.py +0 -2
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/__init__.py +0 -6
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/postgres_search_repository.py +10 -1
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/search_service.py +16 -7
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_postgres_search_repository.py +23 -1
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_search_service.py +57 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_rclone_commands.py +42 -0
- basic_memory-0.18.3/docs/NOTE-FORMAT.md +0 -494
- basic_memory-0.18.3/docs/specs/SPEC-SCHEMA-IMPL.md +0 -365
- basic_memory-0.18.3/docs/specs/SPEC-SCHEMA.md +0 -462
- basic_memory-0.18.3/src/basic_memory/api/v2/routers/schema_router.py +0 -305
- basic_memory-0.18.3/src/basic_memory/cli/commands/schema.py +0 -336
- basic_memory-0.18.3/src/basic_memory/mcp/clients/schema.py +0 -113
- basic_memory-0.18.3/src/basic_memory/mcp/tools/schema.py +0 -244
- basic_memory-0.18.3/src/basic_memory/schema/__init__.py +0 -58
- basic_memory-0.18.3/src/basic_memory/schema/diff.py +0 -111
- basic_memory-0.18.3/src/basic_memory/schema/inference.py +0 -323
- basic_memory-0.18.3/src/basic_memory/schema/parser.py +0 -236
- basic_memory-0.18.3/src/basic_memory/schema/resolver.py +0 -118
- basic_memory-0.18.3/src/basic_memory/schema/validator.py +0 -259
- basic_memory-0.18.3/src/basic_memory/schemas/schema.py +0 -121
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -14
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -16
- basic_memory-0.18.3/test-int/fixtures/schema/drift/schema/Person.md +0 -18
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/array-single.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/empty-note.md +0 -5
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -20
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -20
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -11
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/relation-only.md +0 -15
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -19
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -20
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/alan-turing.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -25
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -21
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -20
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -23
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dijkstra.md +0 -21
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -20
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -23
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/james-gosling.md +0 -21
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/john-carmack.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/larry-page.md +0 -18
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -26
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -18
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -23
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rob-pike.md +0 -23
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -18
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -25
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -21
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -19
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Book.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Meeting.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/Person.md +0 -27
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -23
- basic_memory-0.18.3/test-int/fixtures/schema/schemas/StrictSchema.md +0 -22
- basic_memory-0.18.3/test-int/fixtures/schema/valid/basic-memory.md +0 -27
- basic_memory-0.18.3/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/valid/no-schema-note.md +0 -17
- basic_memory-0.18.3/test-int/fixtures/schema/valid/paul-graham.md +0 -29
- basic_memory-0.18.3/test-int/fixtures/schema/valid/rich-hickey.md +0 -24
- basic_memory-0.18.3/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -32
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/extra-observations.md +0 -27
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-multiple.md +0 -19
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-required.md +0 -19
- basic_memory-0.18.3/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -21
- basic_memory-0.18.3/test-int/test_schema/__init__.py +0 -1
- basic_memory-0.18.3/test-int/test_schema/conftest.py +0 -85
- basic_memory-0.18.3/test-int/test_schema/helpers.py +0 -61
- basic_memory-0.18.3/test-int/test_schema/test_diff_integration.py +0 -72
- basic_memory-0.18.3/test-int/test_schema/test_inference_integration.py +0 -112
- basic_memory-0.18.3/test-int/test_schema/test_parser_integration.py +0 -83
- basic_memory-0.18.3/test-int/test_schema/test_validator_integration.py +0 -179
- basic_memory-0.18.3/tests/api/v2/test_schema_router.py +0 -347
- basic_memory-0.18.3/tests/schema/__init__.py +0 -1
- basic_memory-0.18.3/tests/schema/test_diff.py +0 -204
- basic_memory-0.18.3/tests/schema/test_inference.py +0 -270
- basic_memory-0.18.3/tests/schema/test_parser.py +0 -255
- basic_memory-0.18.3/tests/schema/test_resolver.py +0 -162
- basic_memory-0.18.3/tests/schema/test_validator.py +0 -257
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/spec.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.claude/settings.json +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.dockerignore +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.env.example +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/dependabot.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/release.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.github/workflows/test.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.gitignore +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/.python-version +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/AGENTS.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CITATION.cff +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CLA.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CLAUDE.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/CONTRIBUTING.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/Dockerfile +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/LICENSE +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/README.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/SECURITY.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docker-compose-postgres.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docker-compose.yml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/Docker.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5/docs}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/character-handling.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/cloud-cli.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/docs/testing-coverage.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/justfile +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/llms-install.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/pyproject.toml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/smithery.yaml +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/script.py.mako +0 -0
- {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
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {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
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {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
- {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
- {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
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/config.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/db.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/project_context.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/conftest.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/README.md +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/Screenshot.png +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/conftest.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/conftest.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_project_context.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_read_content.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_config.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_deps.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/test_runtime.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.18.3 → basic_memory-0.18.5}/tests/utils/test_validate_project_path.py +0 -0
- {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
|
+
## 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
|
-
([`
|
|
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
|
+
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.
|
|
9
|
+
"version": "0.18.5",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.18.
|
|
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
|
+
__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
|
|
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
|
]
|
{basic_memory-0.18.3 → basic_memory-0.18.5}/src/basic_memory/cli/commands/cloud/rclone_commands.py
RENAMED
|
@@ -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+)
|
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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(
|
{basic_memory-0.18.3 → basic_memory-0.18.5}/tests/repository/test_postgres_search_repository.py
RENAMED
|
@@ -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
|
|
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
|