basic-memory 0.21.1__tar.gz → 0.21.3__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.21.1 → basic_memory-0.21.3}/AGENTS.md +9 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/PKG-INFO +2 -3
- {basic_memory-0.21.1 → basic_memory-0.21.3}/README.md +1 -2
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docker-compose-postgres.yml +5 -2
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/semantic-search.md +1 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/server.json +2 -2
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/__init__.py +1 -1
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/config.py +8 -5
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/project_context.py +101 -7
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/edit_note.py +4 -3
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/link_resolver.py +17 -5
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/conftest.py +16 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/README.md +12 -6
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/conftest.py +13 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/conftest.py +25 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_project_context.py +464 -72
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_project_context_telemetry.py +3 -16
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_edit_note.py +85 -8
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_read_content.py +107 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_read_note.py +127 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_search.py +105 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_workspace_management.py +7 -19
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_link_resolver.py +104 -6
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_config.py +19 -1
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/SKILL.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/references/javascript/frameworks.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/references/javascript/patterns.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/references/python/integrations.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/references/python/logging-patterns.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.agents/skills/instrumentation/references/rust/patterns.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/release/beta.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/release/release.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/spec.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.claude/settings.json +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.dockerignore +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.env.example +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/dependabot.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/claude-code-review.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/claude-issue-triage.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/docker.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/release.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.github/workflows/test.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.gitignore +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/.python-version +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CHANGELOG.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CITATION.cff +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CLA.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CLAUDE.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/CONTRIBUTING.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/Dockerfile +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/LICENSE +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/NOTE-FORMAT.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/SECURITY.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docker-compose.yml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/ARCHITECTURE.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/Docker.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/NOTE-FORMAT.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/SPEC-PER-PROJECT-ROUTING.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/ai-assistant-guide-extended.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/character-handling.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/cloud-cli.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/cloud-semantic-search-value.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/logfire-instrumentation-strategy.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/mcp-ui-bakeoff-instructions.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/metadata-search.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/post-v0.18.0-test-plan.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/releases/v0.19.0.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/semantic-search-test-log.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/specs/SPEC-LOCAL-PLUS-PUBLISH.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/specs/SPEC-SCHEMA-IMPL.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/specs/SPEC-SCHEMA.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/docs/testing-coverage.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/justfile +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/llms-install.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/pyproject.toml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/skills-lock.json +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/smithery.yaml +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/i2c3d4e5f6g7_auto_backfill_semantic_embeddings.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/k4e5f6g7h8i9_add_created_by_and_last_updated_by_to_entity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/l5g6h7i8j9k0_add_note_content_table.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/m6h7i8j9k0l1_add_vector_sync_fingerprints.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/alembic/versions/n7i8j9k0l1m2_cleanup_sqlite_search_orphans.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/container.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/project_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/schema_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/routers/search_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/api/v2/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/analytics.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/auth.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/auto_update.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/project_sync.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/rclone_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/cloud/workspace.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/command_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/doctor.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/format.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/orphans.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/project.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/routing.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/commands/update.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/container.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/cli/promo.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/db.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/config.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/db.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/importers.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/projects.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/repositories.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps/services.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/ignore_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/indexing/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/indexing/batch_indexer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/indexing/batching.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/indexing/models.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/directory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/knowledge.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/memory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/project.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/resource.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/clients/search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/container.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/formatting.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/cloud_info.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/release_notes.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/resources/ui.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/cloud_info.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/project_management.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/release_notes.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/ui_sdk.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/workspaces.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/note-preview-mcp-ui.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/note-preview-tool-ui.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/note-preview-vanilla.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/search-results-mcp-ui.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/search-results-tool-ui.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/html/search-results-vanilla.html +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/sdk.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/mcp/ui/templates.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/project_resolver.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/embedding_provider.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/embedding_provider_factory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/fastembed_provider.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/metadata_filters.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/note_content_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/openai_provider.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/postgres_search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/search_index_row.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/search_repository_base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/semantic_errors.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/runtime.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/diff.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/inference.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/parser.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/resolver.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schema/validator.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/cloud.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/project_info.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/sync_report.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/v2/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/v2/entity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/v2/graph.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/schemas/v2/resource.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/project_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/sync/coordinator.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/src/basic_memory/workspace_context.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/BENCHMARKS.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_cli_tool_edit_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_cli_tool_json_failure_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_cli_tool_json_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_project_commands_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_routing_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_search_notes_meta_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/cli/test_version_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/compare_search_benchmarks.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-01.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-02.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-03.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-04.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-05.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-06.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-07.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-08.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-09.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-10.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-11.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-12.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-13.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-14.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-15.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-16.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-17.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-18.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-19.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/people/drift-person-20.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/drift/schema/Person.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/array-single.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/empty-note.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/inline-and-type.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/no-frontmatter.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/relation-only.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/type-no-schema.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/edge-cases/unicode-fields.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/ada-lovelace.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/alan-turing.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/andrej-karpathy.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/barbara-liskov.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/brendan-eich.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/claude-shannon.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/dennis-ritchie.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/dijkstra.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/donald-knuth.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/fei-fei-li.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/grace-hopper.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/guido-van-rossum.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/james-gosling.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/john-carmack.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/ken-thompson.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/larry-page.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/leslie-lamport.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/linus-torvalds.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/margaret-hamilton.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/richard-stallman.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/rob-pike.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/tim-berners-lee.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/vint-cerf.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/yann-lecun.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/schemas/Book.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/schemas/Meeting.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/schemas/Person.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/schemas/SoftwareProject.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/schemas/StrictSchema.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/basic-memory.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/explicit-ref-note.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/no-schema-note.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/paul-graham.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/rich-hickey.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/valid/standup-2024-01-15.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/warnings/extra-observations.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/warnings/missing-multiple.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/warnings/missing-required.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/fixtures/schema/warnings/wrong-enum-value.md +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_build_context_underscore.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_default_project_mode_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_delete_directory_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_long_relation_type_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_move_directory_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_output_format_json_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_pagination_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_param_aliases_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_permalink_collision_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_project_state_sync_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_smoke_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_string_params_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_ui_sdk_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_workspace_permalink_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/conftest.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/corpus.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/metrics.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/report.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/test_multiterm_semantic_queries.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/test_search_diagnostics.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/test_semantic_coverage.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/semantic/test_semantic_quality.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_db_wal_mode.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_disable_permalinks_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/conftest.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/helpers.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/test_diff_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/test_inference_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/test_parser_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_schema/test_validator_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_search_performance_benchmark.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/test-int/test_sync_batching_integration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/Screenshot.png +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/conftest.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_directory_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_importer_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_knowledge_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_knowledge_router_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_memory_hydration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_memory_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_orphan_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_project_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_prompt_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_resource_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_schema_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_search_hydration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_search_router.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_search_router_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_utils_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/api/v2/test_workspace_permalink_headers.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_project_sync_command.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_rclone_installer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_upload_command_routing.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/cloud/test_upload_path.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/conftest.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_analytics.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_auth_cli_auth.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_auto_update.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_container.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_exit.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_tool_exit.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_tool_json_output.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cloud_authentication.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cloud_promo.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_cloud_status.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_db_reindex.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_db_reset_exit.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_db_reset_zombie_check.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_ignore_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_json_output.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_orphans_command.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_project_add_with_local_path.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_project_info_cloud_status.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_project_info_errors.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_project_list_and_ls.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_project_set_cloud_local.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_restore_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_routing.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_snapshot_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_update_command.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_upload.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/cli/test_workspace_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/importers/test_conversation_indexing.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/indexing/test_batch_indexer.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/indexing/test_batching.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_entity_parser_error_handling.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_markdown_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/clients/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/clients/test_clients.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_async_client_force_local.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_async_client_modes.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_async_client_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_client_schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_client_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_mcp_container.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_prompt_tool_delegation.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_server_lifespan_branches.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_server_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_cloud_discovery.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_contracts.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_json_output_modes.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_project_management.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_schema.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_utils_cloud_auth.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_tool_write_note_metadata.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_ui_resources.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_ui_sdk.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_ui_templates.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/test_workspace_permalink_resolution.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/mcp/tools/test_search_notes_multi_project.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_distance_to_similarity.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_entity_repository_upsert.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_entity_upsert_issue_187.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_fastembed_provider.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_hybrid_fusion.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_metadata_filters.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_metadata_filters_edge_cases.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_note_content_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_openai_provider.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_postgres_search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_postgres_search_repository_unit.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_search_index_row.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_search_text_with_metadata_filters.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_semantic_search_base.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_sqlite_vector_search_repository.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_vector_pagination.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/repository/test_vector_threshold.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/__init__.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/test_diff.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/test_inference.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/test_parser.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/test_resolver.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schema/test_validator.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_base_timeframe_minimum.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_memory_serialization.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_entity_service_disable_permalinks.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_entity_service_prepare.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_entity_service_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_entity_service_write_result.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_project_removal_bug.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_project_service_cloud_info.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_project_service_embedding_status.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_search_service_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_semantic_search.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_task_scheduler_semantic.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/services/test_upsert_entity_optimization.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_character_conflicts.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_coordinator.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_one_markdown_file.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_service_batching.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_service_incremental.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_service_subprocess.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_service_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_watch_service_atomic_adds.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_watch_service_reload.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/sync/test_watch_service_stress.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_alembic_env.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_coerce.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_deps.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_note_content_migration.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_permalink_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_production_cascade_delete.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_project_resolver.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_rclone_commands.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_runtime.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/test_telemetry.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_setup_logging.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_timezone_utils.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_validate_project_path.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/tests/utils/test_workspace_context.py +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/.gitignore +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/build.mjs +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/package-lock.json +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/package.json +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/_adapter.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/data-table.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/error-boundary.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/formatters.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/index.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/schema.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/types.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/data-table/utilities.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/_adapter.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/action-buttons.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/actions-config.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/error-boundary.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/index.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/aspect-ratio.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/format-utils.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/index.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/overlay-gradient.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/media/sanitize-href.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/parse.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/schema.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/use-action-buttons.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/use-copy-to-clipboard.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/tool-ui/shared/utils.ts +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/accordion.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/badge.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/button.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/dropdown-menu.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/table.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/components/ui/tooltip.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/note-preview.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/search-results.tsx +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/src/styles.css +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/ui/tool-ui-react/tailwind.config.js +0 -0
- {basic_memory-0.21.1 → basic_memory-0.21.3}/uv.lock +0 -0
|
@@ -56,6 +56,15 @@ Run `just test-smoke` when you specifically need the MCP smoke flow.
|
|
|
56
56
|
|
|
57
57
|
If testmon is “cold,” the first run may be long. Subsequent runs get much faster.
|
|
58
58
|
|
|
59
|
+
### PR CI Gate
|
|
60
|
+
|
|
61
|
+
Before opening or updating a PR, run the checks that mirror the common required CI failures:
|
|
62
|
+
|
|
63
|
+
- Run `just typecheck` in addition to targeted `ruff` and `pytest` commands when tests were added or changed.
|
|
64
|
+
- Sign commits with `git commit -s` so DCO passes. If a PR branch already has unsigned commits, rewrite the branch with signed-off commits before asking for review.
|
|
65
|
+
- Use a semantic PR title accepted by `.github/workflows/pr-title.yml`: `type(scope): summary`.
|
|
66
|
+
- Use one of the allowed scopes: `core`, `cli`, `api`, `mcp`, `sync`, `ui`, `deps`, `installer`.
|
|
67
|
+
|
|
59
68
|
### Test Structure
|
|
60
69
|
|
|
61
70
|
- `tests/` - Unit tests for individual components (mocked, fast)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.21.
|
|
3
|
+
Version: 0.21.3
|
|
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
|
|
@@ -176,8 +176,7 @@ phone.
|
|
|
176
176
|
time — same files, same format, same wikilinks. Cancel anytime, your data
|
|
177
177
|
stays yours.
|
|
178
178
|
|
|
179
|
-
Built on WorkOS AuthKit, Neon Postgres, and Tigris S3.
|
|
180
|
-
[basic-memory-cloud](https://github.com/basicmachines-co/basic-memory-cloud).
|
|
179
|
+
Built on WorkOS AuthKit, Neon Postgres, and Tigris S3.
|
|
181
180
|
|
|
182
181
|
### Pricing
|
|
183
182
|
|
|
@@ -123,8 +123,7 @@ phone.
|
|
|
123
123
|
time — same files, same format, same wikilinks. Cancel anytime, your data
|
|
124
124
|
stays yours.
|
|
125
125
|
|
|
126
|
-
Built on WorkOS AuthKit, Neon Postgres, and Tigris S3.
|
|
127
|
-
[basic-memory-cloud](https://github.com/basicmachines-co/basic-memory-cloud).
|
|
126
|
+
Built on WorkOS AuthKit, Neon Postgres, and Tigris S3.
|
|
128
127
|
|
|
129
128
|
### Pricing
|
|
130
129
|
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Docker Compose configuration for Basic Memory with PostgreSQL
|
|
2
|
-
# Use this for local development and testing with Postgres backend
|
|
2
|
+
# Use this for local development and testing with Postgres backend.
|
|
3
|
+
#
|
|
4
|
+
# The Postgres backend requires the pgvector extension (semantic search).
|
|
5
|
+
# This image bundles pgvector; plain postgres:17 will not work for vector search.
|
|
3
6
|
#
|
|
4
7
|
# Usage:
|
|
5
8
|
# docker-compose -f docker-compose-postgres.yml up -d
|
|
@@ -7,7 +10,7 @@
|
|
|
7
10
|
|
|
8
11
|
services:
|
|
9
12
|
postgres:
|
|
10
|
-
image:
|
|
13
|
+
image: pgvector/pgvector:pg17
|
|
11
14
|
container_name: basic-memory-postgres
|
|
12
15
|
environment:
|
|
13
16
|
# Local development/test credentials - NOT for production
|
|
@@ -263,6 +263,7 @@ The sqlite-vec extension is loaded per-connection. Vector tables are created laz
|
|
|
263
263
|
### Postgres (cloud)
|
|
264
264
|
|
|
265
265
|
- **Vector storage**: [pgvector](https://github.com/pgvector/pgvector) with HNSW indexing
|
|
266
|
+
- **Local Docker**: use `docker-compose-postgres.yml` (`pgvector/pgvector:pg17`). Plain `postgres:17` lacks the extension; run `CREATE EXTENSION IF NOT EXISTS vector;` on any external instance before first migration.
|
|
266
267
|
- **Chunk metadata table**: Created via Alembic migration (`search_vector_chunks` with `BIGSERIAL` primary key)
|
|
267
268
|
- **Embedding table**: `search_vector_embeddings` created at runtime (dimension-dependent, same pattern as SQLite)
|
|
268
269
|
- **Index**: HNSW index on the embedding column for fast approximate nearest-neighbour queries
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/basicmachines-co/basic-memory.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.21.
|
|
9
|
+
"version": "0.21.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "basic-memory",
|
|
14
|
-
"version": "0.21.
|
|
14
|
+
"version": "0.21.3",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
16
|
"runtimeArguments": [
|
|
17
17
|
{"type": "positional", "value": "basic-memory"},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
|
|
2
2
|
|
|
3
3
|
# Package version - updated by release automation
|
|
4
|
-
__version__ = "0.21.
|
|
4
|
+
__version__ = "0.21.3"
|
|
5
5
|
|
|
6
6
|
# API version for FastAPI - independent of package version
|
|
7
7
|
__api_version__ = "v0"
|
|
@@ -21,7 +21,7 @@ from basic_memory.utils import setup_logging, generate_permalink
|
|
|
21
21
|
|
|
22
22
|
DATABASE_NAME = "memory.db"
|
|
23
23
|
APP_DATABASE_NAME = "memory.db" # Using the same name but in the app directory
|
|
24
|
-
DATA_DIR_NAME = "
|
|
24
|
+
DATA_DIR_NAME = "basic-memory"
|
|
25
25
|
CONFIG_FILE_NAME = "config.json"
|
|
26
26
|
WATCH_STATUS_JSON = "watch-status.json"
|
|
27
27
|
CONFIG_DIR_MODE = 0o700
|
|
@@ -69,15 +69,18 @@ def resolve_data_dir() -> Path:
|
|
|
69
69
|
|
|
70
70
|
Single source of truth for the per-user state directory. Honors
|
|
71
71
|
``BASIC_MEMORY_CONFIG_DIR`` so each process/worktree can isolate config
|
|
72
|
-
and database state; otherwise falls back to ``<user home>/.basic-memory
|
|
72
|
+
and database state; otherwise falls back to ``<user home>/.basic-memory``,
|
|
73
|
+
and then to ``XDG_CONFIG_HOME``.
|
|
73
74
|
|
|
74
75
|
Cross-platform: ``Path.home()`` reads ``$HOME`` on POSIX and
|
|
75
76
|
``%USERPROFILE%`` on Windows, so there's no need to check ``$HOME``
|
|
76
77
|
explicitly here.
|
|
77
78
|
"""
|
|
78
|
-
if
|
|
79
|
-
return Path(
|
|
80
|
-
|
|
79
|
+
if basic_memory_dir := os.getenv("BASIC_MEMORY_CONFIG_DIR"):
|
|
80
|
+
return Path(basic_memory_dir)
|
|
81
|
+
if xdg_config := os.getenv("XDG_CONFIG_HOME"):
|
|
82
|
+
return Path(xdg_config) / DATA_DIR_NAME
|
|
83
|
+
return Path.home() / ("." + DATA_DIR_NAME)
|
|
81
84
|
|
|
82
85
|
|
|
83
86
|
def default_fastembed_cache_dir() -> str:
|
|
@@ -142,6 +142,15 @@ async def _set_cached_active_project(
|
|
|
142
142
|
await context.set_state("default_project_name", active_project.name)
|
|
143
143
|
|
|
144
144
|
|
|
145
|
+
async def _clear_cached_active_project(context: Optional[Context]) -> None:
|
|
146
|
+
"""Clear cached project metadata that may no longer match the active route."""
|
|
147
|
+
if not context:
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
await context.set_state("active_project", None)
|
|
151
|
+
await context.set_state("default_project_name", None)
|
|
152
|
+
|
|
153
|
+
|
|
145
154
|
async def _get_cached_active_workspace(context: Optional[Context]) -> Optional[WorkspaceInfo]:
|
|
146
155
|
"""Return the cached active workspace from context when available."""
|
|
147
156
|
if not context:
|
|
@@ -167,8 +176,7 @@ async def _set_cached_active_workspace(
|
|
|
167
176
|
# Why: project names are only unique inside one workspace, so a cached
|
|
168
177
|
# ProjectItem from the previous tenant can point at the wrong project
|
|
169
178
|
# Outcome: force the next validation call to resolve within the new tenant
|
|
170
|
-
await context
|
|
171
|
-
await context.set_state("default_project_name", None)
|
|
179
|
+
await _clear_cached_active_project(context)
|
|
172
180
|
|
|
173
181
|
await context.set_state("active_workspace", active_workspace.model_dump())
|
|
174
182
|
|
|
@@ -525,6 +533,28 @@ def _cloud_workspace_discovery_available(config: BasicMemoryConfig) -> bool:
|
|
|
525
533
|
)
|
|
526
534
|
|
|
527
535
|
|
|
536
|
+
def _workspace_identifier_discovery_available(
|
|
537
|
+
identifier: str,
|
|
538
|
+
config: BasicMemoryConfig,
|
|
539
|
+
) -> bool:
|
|
540
|
+
"""Return True when an identifier is allowed to consult workspace discovery."""
|
|
541
|
+
if _cloud_workspace_discovery_available(config):
|
|
542
|
+
return True
|
|
543
|
+
|
|
544
|
+
from basic_memory.mcp.async_client import (
|
|
545
|
+
_explicit_routing,
|
|
546
|
+
_force_local_mode,
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
if _explicit_routing() and _force_local_mode():
|
|
550
|
+
return False
|
|
551
|
+
|
|
552
|
+
return (
|
|
553
|
+
has_cloud_credentials(config)
|
|
554
|
+
and _split_workspace_identifier_segments(identifier) is not None
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
|
|
528
558
|
async def resolve_workspace_qualified_memory_url(
|
|
529
559
|
identifier: str,
|
|
530
560
|
context: Optional[Context] = None,
|
|
@@ -1326,11 +1356,23 @@ async def detect_project_from_identifier_prefix(
|
|
|
1326
1356
|
# Outcome: keep unqualified search/title input on the active/default project route.
|
|
1327
1357
|
return None
|
|
1328
1358
|
|
|
1329
|
-
if
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1359
|
+
if _workspace_identifier_discovery_available(identifier, config):
|
|
1360
|
+
workspace_discovery_fallback_errors = (
|
|
1361
|
+
"not found",
|
|
1362
|
+
"no accessible workspaces",
|
|
1363
|
+
"unable to discover",
|
|
1333
1364
|
)
|
|
1365
|
+
try:
|
|
1366
|
+
workspace_resolution = await resolve_workspace_qualified_identifier(
|
|
1367
|
+
identifier,
|
|
1368
|
+
context=context,
|
|
1369
|
+
)
|
|
1370
|
+
except ValueError as exc:
|
|
1371
|
+
message = str(exc).lower()
|
|
1372
|
+
if any(error in message for error in workspace_discovery_fallback_errors):
|
|
1373
|
+
return None
|
|
1374
|
+
raise
|
|
1375
|
+
|
|
1334
1376
|
if workspace_resolution is not None:
|
|
1335
1377
|
return workspace_resolution.project_identifier
|
|
1336
1378
|
|
|
@@ -1345,7 +1387,7 @@ async def detect_project_from_identifier_prefix(
|
|
|
1345
1387
|
)
|
|
1346
1388
|
except ValueError as exc:
|
|
1347
1389
|
message = str(exc).lower()
|
|
1348
|
-
if
|
|
1390
|
+
if any(error in message for error in workspace_discovery_fallback_errors):
|
|
1349
1391
|
return None
|
|
1350
1392
|
raise
|
|
1351
1393
|
|
|
@@ -1462,9 +1504,54 @@ async def get_project_client(
|
|
|
1462
1504
|
if project_id and not cloud_available:
|
|
1463
1505
|
project_mode = ProjectMode.LOCAL
|
|
1464
1506
|
|
|
1507
|
+
# Trigger: project_id is a local external_id in a mixed local+cloud setup.
|
|
1508
|
+
# Why: UUIDs are not local config keys, so get_project_mode() treats them as
|
|
1509
|
+
# cloud projects. A local-first probe avoids making local UUIDs depend on
|
|
1510
|
+
# healthy cloud workspace discovery.
|
|
1511
|
+
# Outcome: resolve the effective UUID against local ASGI first; if it is not
|
|
1512
|
+
# local, preserve the existing cloud workspace lookup path.
|
|
1513
|
+
if (
|
|
1514
|
+
project_id
|
|
1515
|
+
and config.projects
|
|
1516
|
+
and not factory_mode
|
|
1517
|
+
and not explicit_cloud_routing
|
|
1518
|
+
and project_mode == ProjectMode.CLOUD
|
|
1519
|
+
):
|
|
1520
|
+
try:
|
|
1521
|
+
canonical_project_id = str(UUID(resolved_project))
|
|
1522
|
+
except ValueError:
|
|
1523
|
+
pass
|
|
1524
|
+
else:
|
|
1525
|
+
with logfire.span(
|
|
1526
|
+
"routing.local_project_id_probe",
|
|
1527
|
+
project_id=canonical_project_id,
|
|
1528
|
+
):
|
|
1529
|
+
async with get_client() as client:
|
|
1530
|
+
try:
|
|
1531
|
+
active_project = await get_active_project(
|
|
1532
|
+
client,
|
|
1533
|
+
canonical_project_id,
|
|
1534
|
+
context,
|
|
1535
|
+
)
|
|
1536
|
+
except ToolError as exc:
|
|
1537
|
+
if "not found" not in str(exc).lower():
|
|
1538
|
+
raise
|
|
1539
|
+
else:
|
|
1540
|
+
route_mode = "local_asgi"
|
|
1541
|
+
await _clear_cached_active_workspace_for_local_route(context)
|
|
1542
|
+
with logfire.span(
|
|
1543
|
+
"routing.client_session",
|
|
1544
|
+
project_name=active_project.name,
|
|
1545
|
+
route_mode=route_mode,
|
|
1546
|
+
):
|
|
1547
|
+
logger.debug("Using local ASGI routing for project_id")
|
|
1548
|
+
yield client, active_project
|
|
1549
|
+
return
|
|
1550
|
+
|
|
1465
1551
|
if factory_mode or project_mode == ProjectMode.CLOUD or explicit_cloud_routing:
|
|
1466
1552
|
route_mode = "factory" if factory_mode else "cloud_proxy"
|
|
1467
1553
|
active_ws: WorkspaceInfo | None = None
|
|
1554
|
+
resolved_entry: WorkspaceProjectEntry | None = None
|
|
1468
1555
|
workspace_id: str
|
|
1469
1556
|
project_for_api = _unqualified_project_identifier(resolved_project)
|
|
1470
1557
|
|
|
@@ -1487,6 +1574,13 @@ async def get_project_client(
|
|
|
1487
1574
|
|
|
1488
1575
|
if active_ws is not None:
|
|
1489
1576
|
await _set_cached_active_workspace(context, active_ws)
|
|
1577
|
+
if resolved_entry is not None:
|
|
1578
|
+
cached_project = await _get_cached_active_project(context)
|
|
1579
|
+
if (
|
|
1580
|
+
cached_project is not None
|
|
1581
|
+
and cached_project.external_id != resolved_entry.project.external_id
|
|
1582
|
+
):
|
|
1583
|
+
await _clear_cached_active_project(context)
|
|
1490
1584
|
with logfire.span(
|
|
1491
1585
|
"routing.client_session",
|
|
1492
1586
|
project_name=project_for_api,
|
|
@@ -9,7 +9,7 @@ from pydantic import AliasChoices, Field
|
|
|
9
9
|
|
|
10
10
|
from basic_memory.config import ConfigManager
|
|
11
11
|
from basic_memory.mcp.project_context import (
|
|
12
|
-
|
|
12
|
+
_workspace_identifier_discovery_available,
|
|
13
13
|
detect_project_from_memory_url_prefix,
|
|
14
14
|
get_project_client,
|
|
15
15
|
add_project_metadata,
|
|
@@ -368,8 +368,9 @@ async def edit_note(
|
|
|
368
368
|
config,
|
|
369
369
|
context=context,
|
|
370
370
|
)
|
|
371
|
-
elif
|
|
372
|
-
|
|
371
|
+
elif _workspace_identifier_discovery_available(
|
|
372
|
+
identifier,
|
|
373
|
+
config,
|
|
373
374
|
) and is_workspace_qualified_plain_identifier(identifier):
|
|
374
375
|
detected = await detect_project_from_workspace_identifier_prefix(
|
|
375
376
|
identifier,
|
|
@@ -40,17 +40,29 @@ async def detect_project_from_workspace_identifier_prefix(
|
|
|
40
40
|
return None
|
|
41
41
|
|
|
42
42
|
from basic_memory.mcp.project_context import (
|
|
43
|
-
|
|
43
|
+
_workspace_identifier_discovery_available,
|
|
44
44
|
resolve_workspace_qualified_identifier,
|
|
45
45
|
)
|
|
46
46
|
|
|
47
|
-
if not
|
|
47
|
+
if not _workspace_identifier_discovery_available(identifier, config):
|
|
48
48
|
return None
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
workspace_discovery_fallback_errors = (
|
|
51
|
+
"not found",
|
|
52
|
+
"no accessible workspaces",
|
|
53
|
+
"unable to discover",
|
|
53
54
|
)
|
|
55
|
+
try:
|
|
56
|
+
workspace_resolution = await resolve_workspace_qualified_identifier(
|
|
57
|
+
identifier,
|
|
58
|
+
context=context,
|
|
59
|
+
)
|
|
60
|
+
except ValueError as exc:
|
|
61
|
+
message = str(exc).lower()
|
|
62
|
+
if any(error in message for error in workspace_discovery_fallback_errors):
|
|
63
|
+
return None
|
|
64
|
+
raise
|
|
65
|
+
|
|
54
66
|
if workspace_resolution is None:
|
|
55
67
|
return None
|
|
56
68
|
return workspace_resolution.project_identifier
|
|
@@ -149,6 +149,22 @@ def clean_routing_env(monkeypatch) -> None:
|
|
|
149
149
|
monkeypatch.delenv("BASIC_MEMORY_EXPLICIT_ROUTING", raising=False)
|
|
150
150
|
|
|
151
151
|
|
|
152
|
+
@pytest.fixture(autouse=True)
|
|
153
|
+
def isolate_data_dir_env(monkeypatch) -> None:
|
|
154
|
+
"""Keep host data-dir env vars from leaking into integration tests.
|
|
155
|
+
|
|
156
|
+
Why: GitHub Actions Ubuntu runners set ``XDG_CONFIG_HOME=/home/runner/.config``,
|
|
157
|
+
and ``resolve_data_dir()`` honors it ahead of ``Path.home() / ".basic-memory"``.
|
|
158
|
+
Without clearing it, the MCP tool process reads config.json from the host XDG
|
|
159
|
+
path instead of the tmp dir the ``config_manager`` fixture wrote to — so
|
|
160
|
+
``test-project`` is missing from ``config.projects``, ``get_project_mode``
|
|
161
|
+
falls through to its CLOUD default (#837), and every tool call fails with
|
|
162
|
+
"Cloud routing requested but no credentials found."
|
|
163
|
+
"""
|
|
164
|
+
monkeypatch.delenv("BASIC_MEMORY_CONFIG_DIR", raising=False)
|
|
165
|
+
monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
|
|
166
|
+
|
|
167
|
+
|
|
152
168
|
POSTGRES_EPHEMERAL_TABLES = [
|
|
153
169
|
"search_vector_embeddings",
|
|
154
170
|
"search_vector_chunks",
|
|
@@ -10,6 +10,8 @@ pytest
|
|
|
10
10
|
|
|
11
11
|
# Run tests against Postgres only (requires docker-compose)
|
|
12
12
|
docker-compose -f docker-compose-postgres.yml up -d
|
|
13
|
+
BASIC_MEMORY_TEST_POSTGRES=1 \
|
|
14
|
+
POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
|
|
13
15
|
pytest -m postgres
|
|
14
16
|
|
|
15
17
|
# Run tests against BOTH backends
|
|
@@ -54,7 +56,7 @@ database_url = None # Uses default SQLite path
|
|
|
54
56
|
|
|
55
57
|
# Postgres config
|
|
56
58
|
database_backend = DatabaseBackend.POSTGRES
|
|
57
|
-
database_url = "postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/
|
|
59
|
+
database_url = "postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory"
|
|
58
60
|
```
|
|
59
61
|
|
|
60
62
|
## Running Postgres Tests
|
|
@@ -66,18 +68,22 @@ docker-compose -f docker-compose-postgres.yml up -d
|
|
|
66
68
|
```
|
|
67
69
|
|
|
68
70
|
This starts:
|
|
69
|
-
- Postgres 17 on port **5433** (not 5432 to avoid conflicts)
|
|
70
|
-
-
|
|
71
|
+
- Postgres 17 with **pgvector** (`pgvector/pgvector:pg17`) on port **5433** (not 5432 to avoid conflicts)
|
|
72
|
+
- Database: `basic_memory`
|
|
71
73
|
- Credentials: `basic_memory_user` / `dev_password`
|
|
72
74
|
|
|
73
75
|
### 2. Run Postgres Tests
|
|
74
76
|
|
|
75
77
|
```bash
|
|
76
78
|
# Run only Postgres tests
|
|
79
|
+
BASIC_MEMORY_TEST_POSTGRES=1 \
|
|
80
|
+
POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
|
|
77
81
|
pytest -m postgres
|
|
78
82
|
|
|
79
83
|
# Run specific test with Postgres
|
|
80
|
-
|
|
84
|
+
BASIC_MEMORY_TEST_POSTGRES=1 \
|
|
85
|
+
POSTGRES_TEST_URL=postgresql+asyncpg://basic_memory_user:dev_password@localhost:5433/basic_memory \
|
|
86
|
+
pytest tests/repository/test_entity_repository.py::test_create -m postgres
|
|
81
87
|
|
|
82
88
|
# Skip Postgres tests (default behavior)
|
|
83
89
|
pytest -m "not postgres"
|
|
@@ -121,7 +127,7 @@ jobs:
|
|
|
121
127
|
# Postgres service container
|
|
122
128
|
services:
|
|
123
129
|
postgres:
|
|
124
|
-
image:
|
|
130
|
+
image: pgvector/pgvector:pg17
|
|
125
131
|
env:
|
|
126
132
|
POSTGRES_DB: basic_memory_test
|
|
127
133
|
POSTGRES_USER: basic_memory_user
|
|
@@ -169,4 +175,4 @@ docker-compose -f docker-compose-postgres.yml exec postgres pg_isready -U basic_
|
|
|
169
175
|
|
|
170
176
|
- [ ] Add `--run-all-backends` CLI flag to run both backends in sequence
|
|
171
177
|
- [ ] Implement test fixtures for backend-specific features (e.g., Postgres full-text search vs SQLite FTS5)
|
|
172
|
-
- [ ] Add performance comparison benchmarks between backends
|
|
178
|
+
- [ ] Add performance comparison benchmarks between backends
|
|
@@ -225,6 +225,19 @@ def isolate_routing_env(monkeypatch) -> None:
|
|
|
225
225
|
monkeypatch.delenv("BASIC_MEMORY_EXPLICIT_ROUTING", raising=False)
|
|
226
226
|
|
|
227
227
|
|
|
228
|
+
@pytest.fixture(autouse=True)
|
|
229
|
+
def isolate_data_dir_env(monkeypatch) -> None:
|
|
230
|
+
"""Keep host data-dir env vars from leaking into tests.
|
|
231
|
+
|
|
232
|
+
Why: GitHub Actions Ubuntu runners set ``XDG_CONFIG_HOME=/home/runner/.config``,
|
|
233
|
+
and ``resolve_data_dir()`` honors it ahead of ``Path.home() / ".basic-memory"``.
|
|
234
|
+
Without clearing it, tests that monkeypatch HOME still see the host XDG path
|
|
235
|
+
and assertions against the tmp home directory fail.
|
|
236
|
+
"""
|
|
237
|
+
monkeypatch.delenv("BASIC_MEMORY_CONFIG_DIR", raising=False)
|
|
238
|
+
monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
|
|
239
|
+
|
|
240
|
+
|
|
228
241
|
@pytest_asyncio.fixture(autouse=True)
|
|
229
242
|
async def cleanup_global_db_after_test() -> AsyncGenerator[None, None]:
|
|
230
243
|
"""Close any module-level DB engine created outside fixture ownership."""
|
|
@@ -20,6 +20,31 @@ def mcp() -> FastMCP:
|
|
|
20
20
|
return cast(Any, mcp_server)
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
class ContextState:
|
|
24
|
+
"""Minimal FastMCP context-state stub for MCP tests."""
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
self._state: dict[str, object] = {}
|
|
28
|
+
|
|
29
|
+
async def get_state(self, key: str):
|
|
30
|
+
return self._state.get(key)
|
|
31
|
+
|
|
32
|
+
async def set_state(self, key: str, value: object, **kwargs) -> None:
|
|
33
|
+
self._state[key] = value
|
|
34
|
+
|
|
35
|
+
async def info(self, message: str) -> None:
|
|
36
|
+
self._state["info_message"] = message
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ctx(context: ContextState) -> Any:
|
|
40
|
+
return cast(Any, context)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.fixture
|
|
44
|
+
def context_state() -> ContextState:
|
|
45
|
+
return ContextState()
|
|
46
|
+
|
|
47
|
+
|
|
23
48
|
@pytest.fixture(scope="function")
|
|
24
49
|
def app(
|
|
25
50
|
app_config, project_config, engine_factory, config_manager
|