#
tokens: 32921/50000 1/772 files (page 55/62)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 55 of 62. Use http://codebase.md/doobidoo/mcp-memory-service?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .claude
│   ├── agents
│   │   ├── amp-bridge.md
│   │   ├── amp-pr-automator.md
│   │   ├── code-quality-guard.md
│   │   ├── gemini-pr-automator.md
│   │   └── github-release-manager.md
│   ├── commands
│   │   ├── README.md
│   │   ├── refactor-function
│   │   ├── refactor-function-prod
│   │   └── refactor-function.md
│   ├── consolidation-fix-handoff.md
│   ├── consolidation-hang-fix-summary.md
│   ├── directives
│   │   ├── agents.md
│   │   ├── code-quality-workflow.md
│   │   ├── consolidation-details.md
│   │   ├── development-setup.md
│   │   ├── hooks-configuration.md
│   │   ├── memory-first.md
│   │   ├── memory-tagging.md
│   │   ├── pr-workflow.md
│   │   ├── quality-system-details.md
│   │   ├── README.md
│   │   ├── refactoring-checklist.md
│   │   ├── storage-backends.md
│   │   └── version-management.md
│   ├── prompts
│   │   └── hybrid-cleanup-integration.md
│   ├── settings.local.json.backup
│   └── settings.local.json.local
├── .commit-message
├── .coveragerc
├── .dockerignore
├── .env.example
├── .env.sqlite.backup
├── .envnn#
├── .gitattributes
├── .github
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── performance_issue.yml
│   ├── pull_request_template.md
│   └── workflows
│       ├── bridge-tests.yml
│       ├── CACHE_FIX.md
│       ├── claude-branch-automation.yml
│       ├── claude-code-review.yml
│       ├── claude.yml
│       ├── cleanup-images.yml.disabled
│       ├── dev-setup-validation.yml
│       ├── docker-publish.yml
│       ├── dockerfile-lint.yml
│       ├── LATEST_FIXES.md
│       ├── main-optimized.yml.disabled
│       ├── main.yml
│       ├── publish-and-test.yml
│       ├── publish-dual.yml
│       ├── README_OPTIMIZATION.md
│       ├── release-tag.yml.disabled
│       ├── release.yml
│       ├── roadmap-review-reminder.yml
│       ├── SECRET_CONDITIONAL_FIX.md
│       └── WORKFLOW_FIXES.md
├── .gitignore
├── .mcp.json.backup
├── .mcp.json.template
├── .metrics
│   ├── baseline_cc_install_hooks.txt
│   ├── baseline_mi_install_hooks.txt
│   ├── baseline_nesting_install_hooks.txt
│   ├── BASELINE_REPORT.md
│   ├── COMPLEXITY_COMPARISON.txt
│   ├── QUICK_REFERENCE.txt
│   ├── README.md
│   ├── REFACTORED_BASELINE.md
│   ├── REFACTORING_COMPLETION_REPORT.md
│   └── TRACKING_TABLE.md
├── .pyscn
│   ├── .gitignore
│   └── reports
│       └── analyze_20251123_214224.html
├── AGENTS.md
├── ai-optimized-tool-descriptions.py
├── archive
│   ├── deployment
│   │   ├── deploy_fastmcp_fixed.sh
│   │   ├── deploy_http_with_mcp.sh
│   │   └── deploy_mcp_v4.sh
│   ├── deployment-configs
│   │   ├── empty_config.yml
│   │   └── smithery.yaml
│   ├── development
│   │   └── test_fastmcp.py
│   ├── docs-removed-2025-08-23
│   │   ├── authentication.md
│   │   ├── claude_integration.md
│   │   ├── claude-code-compatibility.md
│   │   ├── claude-code-integration.md
│   │   ├── claude-code-quickstart.md
│   │   ├── claude-desktop-setup.md
│   │   ├── complete-setup-guide.md
│   │   ├── database-synchronization.md
│   │   ├── development
│   │   │   ├── autonomous-memory-consolidation.md
│   │   │   ├── CLEANUP_PLAN.md
│   │   │   ├── CLEANUP_README.md
│   │   │   ├── CLEANUP_SUMMARY.md
│   │   │   ├── dream-inspired-memory-consolidation.md
│   │   │   ├── hybrid-slm-memory-consolidation.md
│   │   │   ├── mcp-milestone.md
│   │   │   ├── multi-client-architecture.md
│   │   │   ├── test-results.md
│   │   │   └── TIMESTAMP_FIX_SUMMARY.md
│   │   ├── distributed-sync.md
│   │   ├── invocation_guide.md
│   │   ├── macos-intel.md
│   │   ├── master-guide.md
│   │   ├── mcp-client-configuration.md
│   │   ├── multi-client-server.md
│   │   ├── service-installation.md
│   │   ├── sessions
│   │   │   └── MCP_ENHANCEMENT_SESSION_MEMORY_v4.1.0.md
│   │   ├── UBUNTU_SETUP.md
│   │   ├── ubuntu.md
│   │   ├── windows-setup.md
│   │   └── windows.md
│   ├── docs-root-cleanup-2025-08-23
│   │   ├── AWESOME_LIST_SUBMISSION.md
│   │   ├── CLOUDFLARE_IMPLEMENTATION.md
│   │   ├── DOCUMENTATION_ANALYSIS.md
│   │   ├── DOCUMENTATION_CLEANUP_PLAN.md
│   │   ├── DOCUMENTATION_CONSOLIDATION_COMPLETE.md
│   │   ├── LITESTREAM_SETUP_GUIDE.md
│   │   ├── lm_studio_system_prompt.md
│   │   ├── PYTORCH_DOWNLOAD_FIX.md
│   │   └── README-ORIGINAL-BACKUP.md
│   ├── investigations
│   │   └── MACOS_HOOKS_INVESTIGATION.md
│   ├── litestream-configs-v6.3.0
│   │   ├── install_service.sh
│   │   ├── litestream_master_config_fixed.yml
│   │   ├── litestream_master_config.yml
│   │   ├── litestream_replica_config_fixed.yml
│   │   ├── litestream_replica_config.yml
│   │   ├── litestream_replica_simple.yml
│   │   ├── litestream-http.service
│   │   ├── litestream.service
│   │   └── requirements-cloudflare.txt
│   ├── release-notes
│   │   └── release-notes-v7.1.4.md
│   └── setup-development
│       ├── README.md
│       ├── setup_consolidation_mdns.sh
│       ├── STARTUP_SETUP_GUIDE.md
│       └── test_service.sh
├── CHANGELOG-HISTORIC.md
├── CHANGELOG.md
├── claude_commands
│   ├── memory-context.md
│   ├── memory-health.md
│   ├── memory-ingest-dir.md
│   ├── memory-ingest.md
│   ├── memory-recall.md
│   ├── memory-search.md
│   ├── memory-store.md
│   ├── README.md
│   └── session-start.md
├── claude-hooks
│   ├── config.json
│   ├── config.template.json
│   ├── CONFIGURATION.md
│   ├── core
│   │   ├── auto-capture-hook.js
│   │   ├── auto-capture-hook.ps1
│   │   ├── memory-retrieval.js
│   │   ├── mid-conversation.js
│   │   ├── permission-request.js
│   │   ├── session-end.js
│   │   ├── session-start.js
│   │   └── topic-change.js
│   ├── debug-pattern-test.js
│   ├── install_claude_hooks_windows.ps1
│   ├── install_hooks.py
│   ├── memory-mode-controller.js
│   ├── MIGRATION.md
│   ├── README-AUTO-CAPTURE.md
│   ├── README-NATURAL-TRIGGERS.md
│   ├── README-PERMISSION-REQUEST.md
│   ├── README-phase2.md
│   ├── README.md
│   ├── simple-test.js
│   ├── statusline.sh
│   ├── test-adaptive-weights.js
│   ├── test-dual-protocol-hook.js
│   ├── test-mcp-hook.js
│   ├── test-natural-triggers.js
│   ├── test-recency-scoring.js
│   ├── tests
│   │   ├── integration-test.js
│   │   ├── phase2-integration-test.js
│   │   ├── test-code-execution.js
│   │   ├── test-cross-session.json
│   │   ├── test-permission-request.js
│   │   ├── test-session-tracking.json
│   │   └── test-threading.json
│   ├── utilities
│   │   ├── adaptive-pattern-detector.js
│   │   ├── auto-capture-patterns.js
│   │   ├── context-formatter.js
│   │   ├── context-shift-detector.js
│   │   ├── conversation-analyzer.js
│   │   ├── dynamic-context-updater.js
│   │   ├── git-analyzer.js
│   │   ├── mcp-client.js
│   │   ├── memory-client.js
│   │   ├── memory-scorer.js
│   │   ├── performance-manager.js
│   │   ├── project-detector.js
│   │   ├── session-cache.json
│   │   ├── session-tracker.js
│   │   ├── tiered-conversation-monitor.js
│   │   ├── user-override-detector.js
│   │   └── version-checker.js
│   └── WINDOWS-SESSIONSTART-BUG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── COMMIT_MESSAGE.md
├── CONTRIBUTING.md
├── Development-Sprint-November-2025.md
├── docs
│   ├── amp-cli-bridge.md
│   ├── api
│   │   ├── code-execution-interface.md
│   │   ├── memory-metadata-api.md
│   │   ├── PHASE1_IMPLEMENTATION_SUMMARY.md
│   │   ├── PHASE2_IMPLEMENTATION_SUMMARY.md
│   │   ├── PHASE2_REPORT.md
│   │   └── tag-standardization.md
│   ├── architecture
│   │   ├── graph-database-design.md
│   │   ├── search-enhancement-spec.md
│   │   └── search-examples.md
│   ├── architecture.md
│   ├── archive
│   │   └── obsolete-workflows
│   │       ├── load_memory_context.md
│   │       └── README.md
│   ├── assets
│   │   └── images
│   │       ├── dashboard-v3.3.0-preview.png
│   │       ├── memory-awareness-hooks-example.png
│   │       ├── project-infographic.svg
│   │       └── README.md
│   ├── CLAUDE_CODE_QUICK_REFERENCE.md
│   ├── cloudflare-setup.md
│   ├── demo-recording-script.md
│   ├── deployment
│   │   ├── docker.md
│   │   ├── dual-service.md
│   │   ├── production-guide.md
│   │   └── systemd-service.md
│   ├── development
│   │   ├── ai-agent-instructions.md
│   │   ├── code-quality
│   │   │   ├── phase-2a-completion.md
│   │   │   ├── phase-2a-handle-get-prompt.md
│   │   │   ├── phase-2a-index.md
│   │   │   ├── phase-2a-install-package.md
│   │   │   └── phase-2b-session-summary.md
│   │   ├── code-quality-workflow.md
│   │   ├── dashboard-workflow.md
│   │   ├── issue-management.md
│   │   ├── pr-280-post-mortem.md
│   │   ├── pr-review-guide.md
│   │   ├── refactoring-notes.md
│   │   ├── release-checklist.md
│   │   └── todo-tracker.md
│   ├── docker-optimized-build.md
│   ├── document-ingestion.md
│   ├── DOCUMENTATION_AUDIT.md
│   ├── enhancement-roadmap-issue-14.md
│   ├── examples
│   │   ├── analysis-scripts.js
│   │   ├── maintenance-session-example.md
│   │   ├── memory-distribution-chart.jsx
│   │   ├── quality-system-configs.md
│   │   └── tag-schema.json
│   ├── features
│   │   └── association-quality-boost.md
│   ├── first-time-setup.md
│   ├── glama-deployment.md
│   ├── guides
│   │   ├── advanced-command-examples.md
│   │   ├── chromadb-migration.md
│   │   ├── commands-vs-mcp-server.md
│   │   ├── mcp-enhancements.md
│   │   ├── mdns-service-discovery.md
│   │   ├── memory-consolidation-guide.md
│   │   ├── memory-quality-guide.md
│   │   ├── migration.md
│   │   ├── scripts.md
│   │   └── STORAGE_BACKENDS.md
│   ├── HOOK_IMPROVEMENTS.md
│   ├── hooks
│   │   └── phase2-code-execution-migration.md
│   ├── http-server-management.md
│   ├── ide-compatability.md
│   ├── IMAGE_RETENTION_POLICY.md
│   ├── images
│   │   ├── dashboard-placeholder.md
│   │   └── update-restart-demo.png
│   ├── implementation
│   │   ├── health_checks.md
│   │   └── performance.md
│   ├── IMPLEMENTATION_PLAN_HTTP_SSE.md
│   ├── integration
│   │   ├── homebrew.md
│   │   └── multi-client.md
│   ├── integrations
│   │   ├── gemini.md
│   │   ├── groq-bridge.md
│   │   ├── groq-integration-summary.md
│   │   └── groq-model-comparison.md
│   ├── integrations.md
│   ├── legacy
│   │   └── dual-protocol-hooks.md
│   ├── LIGHTWEIGHT_ONNX_SETUP.md
│   ├── LM_STUDIO_COMPATIBILITY.md
│   ├── maintenance
│   │   └── memory-maintenance.md
│   ├── mastery
│   │   ├── api-reference.md
│   │   ├── architecture-overview.md
│   │   ├── configuration-guide.md
│   │   ├── local-setup-and-run.md
│   │   ├── testing-guide.md
│   │   └── troubleshooting.md
│   ├── migration
│   │   ├── code-execution-api-quick-start.md
│   │   └── graph-migration-guide.md
│   ├── natural-memory-triggers
│   │   ├── cli-reference.md
│   │   ├── installation-guide.md
│   │   └── performance-optimization.md
│   ├── oauth-setup.md
│   ├── pr-graphql-integration.md
│   ├── quality-system-ui-implementation.md
│   ├── quick-setup-cloudflare-dual-environment.md
│   ├── README.md
│   ├── refactoring
│   │   └── phase-3-3-analysis.md
│   ├── releases
│   │   └── v8.72.0-testing.md
│   ├── remote-configuration-wiki-section.md
│   ├── research
│   │   ├── code-execution-interface-implementation.md
│   │   └── code-execution-interface-summary.md
│   ├── ROADMAP.md
│   ├── sqlite-vec-backend.md
│   ├── statistics
│   │   ├── charts
│   │   │   ├── activity_patterns.png
│   │   │   ├── contributors.png
│   │   │   ├── growth_trajectory.png
│   │   │   ├── monthly_activity.png
│   │   │   └── october_sprint.png
│   │   ├── data
│   │   │   ├── activity_by_day.csv
│   │   │   ├── activity_by_hour.csv
│   │   │   ├── contributors.csv
│   │   │   └── monthly_activity.csv
│   │   ├── generate_charts.py
│   │   └── REPOSITORY_STATISTICS.md
│   ├── technical
│   │   ├── development.md
│   │   ├── memory-migration.md
│   │   ├── migration-log.md
│   │   ├── sqlite-vec-embedding-fixes.md
│   │   └── tag-storage.md
│   ├── testing
│   │   └── regression-tests.md
│   ├── testing-cloudflare-backend.md
│   ├── troubleshooting
│   │   ├── cloudflare-api-token-setup.md
│   │   ├── cloudflare-authentication.md
│   │   ├── database-transfer-migration.md
│   │   ├── general.md
│   │   ├── hooks-quick-reference.md
│   │   ├── memory-management.md
│   │   ├── pr162-schema-caching-issue.md
│   │   ├── session-end-hooks.md
│   │   └── sync-issues.md
│   ├── tutorials
│   │   ├── advanced-techniques.md
│   │   ├── data-analysis.md
│   │   └── demo-session-walkthrough.md
│   ├── wiki-documentation-plan.md
│   └── wiki-Graph-Database-Architecture.md
├── examples
│   ├── claude_desktop_config_template.json
│   ├── claude_desktop_config_windows.json
│   ├── claude-desktop-http-config.json
│   ├── config
│   │   └── claude_desktop_config.json
│   ├── http-mcp-bridge.js
│   ├── memory_export_template.json
│   ├── README.md
│   ├── setup
│   │   └── setup_multi_client_complete.py
│   └── start_https_example.sh
├── IMPLEMENTATION_SUMMARY.md
├── install_service.py
├── install.py
├── LICENSE
├── NOTICE
├── PR_DESCRIPTION.md
├── pyproject-lite.toml
├── pyproject.toml
├── pytest.ini
├── README.md
├── release-notes-v8.61.0.md
├── run_server.py
├── scripts
│   ├── .claude
│   │   └── settings.local.json
│   ├── archive
│   │   └── check_missing_timestamps.py
│   ├── backup
│   │   ├── backup_memories.py
│   │   ├── backup_sqlite_vec.sh
│   │   ├── export_distributable_memories.sh
│   │   └── restore_memories.py
│   ├── benchmarks
│   │   ├── benchmark_code_execution_api.py
│   │   ├── benchmark_hybrid_sync.py
│   │   └── benchmark_server_caching.py
│   ├── ci
│   │   ├── check_dockerfile_args.sh
│   │   └── validate_imports.sh
│   ├── database
│   │   ├── analyze_sqlite_vec_db.py
│   │   ├── check_sqlite_vec_status.py
│   │   ├── db_health_check.py
│   │   └── simple_timestamp_check.py
│   ├── development
│   │   ├── debug_server_initialization.py
│   │   ├── find_orphaned_files.py
│   │   ├── fix_mdns.sh
│   │   ├── fix_sitecustomize.py
│   │   ├── remote_ingest.sh
│   │   ├── setup-git-merge-drivers.sh
│   │   ├── uv-lock-merge.sh
│   │   └── verify_hybrid_sync.py
│   ├── hooks
│   │   └── pre-commit
│   ├── installation
│   │   ├── install_linux_service.py
│   │   ├── install_macos_service.py
│   │   ├── install_uv.py
│   │   ├── install_windows_service.py
│   │   ├── install.py
│   │   ├── setup_backup_cron.sh
│   │   ├── setup_claude_mcp.sh
│   │   └── setup_cloudflare_resources.py
│   ├── linux
│   │   ├── service_status.sh
│   │   ├── start_service.sh
│   │   ├── stop_service.sh
│   │   ├── uninstall_service.sh
│   │   └── view_logs.sh
│   ├── maintenance
│   │   ├── add_project_tags.py
│   │   ├── apply_quality_boost_retroactively.py
│   │   ├── assign_memory_types.py
│   │   ├── auto_retag_memory_merge.py
│   │   ├── auto_retag_memory.py
│   │   ├── backfill_graph_table.py
│   │   ├── check_memory_types.py
│   │   ├── cleanup_association_memories_hybrid.py
│   │   ├── cleanup_association_memories.py
│   │   ├── cleanup_corrupted_encoding.py
│   │   ├── cleanup_low_quality.py
│   │   ├── cleanup_memories.py
│   │   ├── cleanup_organize.py
│   │   ├── consolidate_memory_types.py
│   │   ├── consolidation_mappings.json
│   │   ├── delete_orphaned_vectors_fixed.py
│   │   ├── delete_test_memories.py
│   │   ├── fast_cleanup_duplicates_with_tracking.sh
│   │   ├── find_all_duplicates.py
│   │   ├── find_cloudflare_duplicates.py
│   │   ├── find_duplicates.py
│   │   ├── memory-types.md
│   │   ├── README.md
│   │   ├── recover_timestamps_from_cloudflare.py
│   │   ├── regenerate_embeddings.py
│   │   ├── repair_malformed_tags.py
│   │   ├── repair_memories.py
│   │   ├── repair_sqlite_vec_embeddings.py
│   │   ├── repair_zero_embeddings.py
│   │   ├── restore_from_json_export.py
│   │   ├── retag_valuable_memories.py
│   │   ├── scan_todos.sh
│   │   ├── soft_delete_test_memories.py
│   │   └── sync_status.py
│   ├── migration
│   │   ├── cleanup_mcp_timestamps.py
│   │   ├── legacy
│   │   │   └── migrate_chroma_to_sqlite.py
│   │   ├── mcp-migration.py
│   │   ├── migrate_sqlite_vec_embeddings.py
│   │   ├── migrate_storage.py
│   │   ├── migrate_tags.py
│   │   ├── migrate_timestamps.py
│   │   ├── migrate_to_cloudflare.py
│   │   ├── migrate_to_sqlite_vec.py
│   │   ├── migrate_v5_enhanced.py
│   │   ├── TIMESTAMP_CLEANUP_README.md
│   │   └── verify_mcp_timestamps.py
│   ├── pr
│   │   ├── amp_collect_results.sh
│   │   ├── amp_detect_breaking_changes.sh
│   │   ├── amp_generate_tests.sh
│   │   ├── amp_pr_review.sh
│   │   ├── amp_quality_gate.sh
│   │   ├── amp_suggest_fixes.sh
│   │   ├── auto_review.sh
│   │   ├── detect_breaking_changes.sh
│   │   ├── generate_tests.sh
│   │   ├── lib
│   │   │   └── graphql_helpers.sh
│   │   ├── pre_pr_check.sh
│   │   ├── quality_gate.sh
│   │   ├── resolve_threads.sh
│   │   ├── run_pyscn_analysis.sh
│   │   ├── run_quality_checks_on_files.sh
│   │   ├── run_quality_checks.sh
│   │   ├── thread_status.sh
│   │   └── watch_reviews.sh
│   ├── quality
│   │   ├── bulk_evaluate_onnx.py
│   │   ├── check_test_scores.py
│   │   ├── debug_deberta_scoring.py
│   │   ├── export_deberta_onnx.py
│   │   ├── fix_dead_code_install.sh
│   │   ├── migrate_to_deberta.py
│   │   ├── phase1_dead_code_analysis.md
│   │   ├── phase2_complexity_analysis.md
│   │   ├── README_PHASE1.md
│   │   ├── README_PHASE2.md
│   │   ├── rescore_deberta.py
│   │   ├── rescore_fallback.py
│   │   ├── reset_onnx_scores.py
│   │   ├── track_pyscn_metrics.sh
│   │   └── weekly_quality_review.sh
│   ├── README.md
│   ├── run
│   │   ├── memory_wrapper_cleanup.ps1
│   │   ├── memory_wrapper_cleanup.py
│   │   ├── memory_wrapper_cleanup.sh
│   │   ├── README_CLEANUP_WRAPPER.md
│   │   ├── run_mcp_memory.sh
│   │   ├── run-with-uv.sh
│   │   └── start_sqlite_vec.sh
│   ├── run_memory_server.py
│   ├── server
│   │   ├── check_http_server.py
│   │   ├── check_server_health.py
│   │   ├── memory_offline.py
│   │   ├── preload_models.py
│   │   ├── run_http_server.py
│   │   ├── run_memory_server.py
│   │   ├── start_http_server.bat
│   │   └── start_http_server.sh
│   ├── service
│   │   ├── deploy_dual_services.sh
│   │   ├── http_server_manager.sh
│   │   ├── install_http_service.sh
│   │   ├── mcp-memory-http.service
│   │   ├── mcp-memory.service
│   │   ├── memory_service_manager.sh
│   │   ├── service_control.sh
│   │   ├── service_utils.py
│   │   ├── update_service.sh
│   │   └── windows
│   │       ├── add_watchdog_trigger.ps1
│   │       ├── install_scheduled_task.ps1
│   │       ├── manage_service.ps1
│   │       ├── run_http_server_background.ps1
│   │       ├── uninstall_scheduled_task.ps1
│   │       └── update_and_restart.ps1
│   ├── setup-lightweight.sh
│   ├── sync
│   │   ├── check_drift.py
│   │   ├── claude_sync_commands.py
│   │   ├── export_memories.py
│   │   ├── import_memories.py
│   │   ├── litestream
│   │   │   ├── apply_local_changes.sh
│   │   │   ├── enhanced_memory_store.sh
│   │   │   ├── init_staging_db.sh
│   │   │   ├── io.litestream.replication.plist
│   │   │   ├── manual_sync.sh
│   │   │   ├── memory_sync.sh
│   │   │   ├── pull_remote_changes.sh
│   │   │   ├── push_to_remote.sh
│   │   │   ├── README.md
│   │   │   ├── resolve_conflicts.sh
│   │   │   ├── setup_local_litestream.sh
│   │   │   ├── setup_remote_litestream.sh
│   │   │   ├── staging_db_init.sql
│   │   │   ├── stash_local_changes.sh
│   │   │   ├── sync_from_remote_noconfig.sh
│   │   │   └── sync_from_remote.sh
│   │   ├── README.md
│   │   ├── safe_cloudflare_update.sh
│   │   ├── sync_memory_backends.py
│   │   └── sync_now.py
│   ├── testing
│   │   ├── run_complete_test.py
│   │   ├── run_memory_test.sh
│   │   ├── simple_test.py
│   │   ├── test_cleanup_logic.py
│   │   ├── test_cloudflare_backend.py
│   │   ├── test_docker_functionality.py
│   │   ├── test_installation.py
│   │   ├── test_mdns.py
│   │   ├── test_memory_api.py
│   │   ├── test_memory_simple.py
│   │   ├── test_migration.py
│   │   ├── test_search_api.py
│   │   ├── test_sqlite_vec_embeddings.py
│   │   ├── test_sse_events.py
│   │   ├── test-connection.py
│   │   └── test-hook.js
│   ├── update_and_restart.sh
│   ├── utils
│   │   ├── claude_commands_utils.py
│   │   ├── detect_platform.py
│   │   ├── generate_personalized_claude_md.sh
│   │   ├── groq
│   │   ├── groq_agent_bridge.py
│   │   ├── list-collections.py
│   │   ├── memory_wrapper_uv.py
│   │   ├── query_memories.py
│   │   ├── README_detect_platform.md
│   │   ├── smithery_wrapper.py
│   │   ├── test_groq_bridge.sh
│   │   └── uv_wrapper.py
│   └── validation
│       ├── check_dev_setup.py
│       ├── check_documentation_links.py
│       ├── check_handler_coverage.py
│       ├── diagnose_backend_config.py
│       ├── validate_configuration_complete.py
│       ├── validate_graph_tools.py
│       ├── validate_memories.py
│       ├── validate_migration.py
│       ├── validate_timestamp_integrity.py
│       ├── verify_environment.py
│       ├── verify_pytorch_windows.py
│       └── verify_torch.py
├── SECURITY.md
├── selective_timestamp_recovery.py
├── SPONSORS.md
├── src
│   └── mcp_memory_service
│       ├── __init__.py
│       ├── _version.py
│       ├── api
│       │   ├── __init__.py
│       │   ├── client.py
│       │   ├── operations.py
│       │   ├── sync_wrapper.py
│       │   └── types.py
│       ├── backup
│       │   ├── __init__.py
│       │   └── scheduler.py
│       ├── cli
│       │   ├── __init__.py
│       │   ├── ingestion.py
│       │   ├── main.py
│       │   └── utils.py
│       ├── config.py
│       ├── consolidation
│       │   ├── __init__.py
│       │   ├── associations.py
│       │   ├── base.py
│       │   ├── clustering.py
│       │   ├── compression.py
│       │   ├── consolidator.py
│       │   ├── decay.py
│       │   ├── forgetting.py
│       │   ├── health.py
│       │   └── scheduler.py
│       ├── dependency_check.py
│       ├── discovery
│       │   ├── __init__.py
│       │   ├── client.py
│       │   └── mdns_service.py
│       ├── embeddings
│       │   ├── __init__.py
│       │   └── onnx_embeddings.py
│       ├── ingestion
│       │   ├── __init__.py
│       │   ├── base.py
│       │   ├── chunker.py
│       │   ├── csv_loader.py
│       │   ├── json_loader.py
│       │   ├── pdf_loader.py
│       │   ├── registry.py
│       │   ├── semtools_loader.py
│       │   └── text_loader.py
│       ├── lm_studio_compat.py
│       ├── mcp_server.py
│       ├── models
│       │   ├── __init__.py
│       │   └── memory.py
│       ├── quality
│       │   ├── __init__.py
│       │   ├── ai_evaluator.py
│       │   ├── async_scorer.py
│       │   ├── config.py
│       │   ├── implicit_signals.py
│       │   ├── metadata_codec.py
│       │   ├── onnx_ranker.py
│       │   └── scorer.py
│       ├── server
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── cache_manager.py
│       │   ├── client_detection.py
│       │   ├── environment.py
│       │   ├── handlers
│       │   │   ├── __init__.py
│       │   │   ├── consolidation.py
│       │   │   ├── documents.py
│       │   │   ├── graph.py
│       │   │   ├── memory.py
│       │   │   ├── quality.py
│       │   │   └── utility.py
│       │   └── logging_config.py
│       ├── server_impl.py
│       ├── services
│       │   ├── __init__.py
│       │   └── memory_service.py
│       ├── storage
│       │   ├── __init__.py
│       │   ├── base.py
│       │   ├── cloudflare.py
│       │   ├── factory.py
│       │   ├── graph.py
│       │   ├── http_client.py
│       │   ├── hybrid.py
│       │   ├── migrations
│       │   │   └── 008_add_graph_table.sql
│       │   └── sqlite_vec.py
│       ├── sync
│       │   ├── __init__.py
│       │   ├── exporter.py
│       │   ├── importer.py
│       │   └── litestream_config.py
│       ├── utils
│       │   ├── __init__.py
│       │   ├── cache_manager.py
│       │   ├── content_splitter.py
│       │   ├── db_utils.py
│       │   ├── debug.py
│       │   ├── directory_ingestion.py
│       │   ├── document_processing.py
│       │   ├── gpu_detection.py
│       │   ├── hashing.py
│       │   ├── health_check.py
│       │   ├── http_server_manager.py
│       │   ├── port_detection.py
│       │   ├── quality_analytics.py
│       │   ├── startup_orchestrator.py
│       │   ├── system_detection.py
│       │   └── time_parser.py
│       └── web
│           ├── __init__.py
│           ├── api
│           │   ├── __init__.py
│           │   ├── analytics.py
│           │   ├── backup.py
│           │   ├── consolidation.py
│           │   ├── documents.py
│           │   ├── events.py
│           │   ├── health.py
│           │   ├── manage.py
│           │   ├── mcp.py
│           │   ├── memories.py
│           │   ├── quality.py
│           │   ├── search.py
│           │   └── sync.py
│           ├── app.py
│           ├── dependencies.py
│           ├── oauth
│           │   ├── __init__.py
│           │   ├── authorization.py
│           │   ├── discovery.py
│           │   ├── middleware.py
│           │   ├── models.py
│           │   ├── registration.py
│           │   └── storage.py
│           ├── sse.py
│           └── static
│               ├── app.js
│               ├── i18n
│               │   ├── de.json
│               │   ├── en.json
│               │   ├── es.json
│               │   ├── fr.json
│               │   ├── ja.json
│               │   ├── ko.json
│               │   └── zh.json
│               ├── index.html
│               ├── README.md
│               ├── sse_test.html
│               └── style.css
├── start_http_debug.bat
├── start_http_server.sh
├── test_document.txt
├── test_version_checker.js
├── TESTING_NOTES.md
├── tests
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── test_compact_types.py
│   │   └── test_operations.py
│   ├── bridge
│   │   ├── mock_responses.js
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   └── test_http_mcp_bridge.js
│   ├── conftest.py
│   ├── consolidation
│   │   ├── __init__.py
│   │   ├── conftest.py
│   │   ├── test_associations.py
│   │   ├── test_clustering.py
│   │   ├── test_compression.py
│   │   ├── test_consolidator.py
│   │   ├── test_decay.py
│   │   ├── test_forgetting.py
│   │   └── test_graph_modes.py
│   ├── contracts
│   │   └── api-specification.yml
│   ├── integration
│   │   ├── conftest.py
│   │   ├── HANDLER_COVERAGE_REPORT.md
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── test_all_memory_handlers.py
│   │   ├── test_api_key_fallback.py
│   │   ├── test_api_memories_chronological.py
│   │   ├── test_api_tag_time_search.py
│   │   ├── test_api_with_memory_service.py
│   │   ├── test_bridge_integration.js
│   │   ├── test_cli_interfaces.py
│   │   ├── test_cloudflare_connection.py
│   │   ├── test_concurrent_clients.py
│   │   ├── test_data_serialization_consistency.py
│   │   ├── test_http_server_startup.py
│   │   ├── test_mcp_memory.py
│   │   ├── test_mdns_integration.py
│   │   ├── test_oauth_basic_auth.py
│   │   ├── test_oauth_flow.py
│   │   ├── test_server_handlers.py
│   │   └── test_store_memory.py
│   ├── performance
│   │   ├── test_background_sync.py
│   │   └── test_hybrid_live.py
│   ├── README.md
│   ├── smithery
│   │   └── test_smithery.py
│   ├── sqlite
│   │   └── simple_sqlite_vec_test.py
│   ├── storage
│   │   ├── conftest.py
│   │   └── test_graph_storage.py
│   ├── test_client.py
│   ├── test_content_splitting.py
│   ├── test_database.py
│   ├── test_deberta_quality.py
│   ├── test_fallback_quality.py
│   ├── test_graph_traversal.py
│   ├── test_hybrid_cloudflare_limits.py
│   ├── test_hybrid_storage.py
│   ├── test_lightweight_onnx.py
│   ├── test_memory_ops.py
│   ├── test_memory_wrapper_cleanup.py
│   ├── test_quality_integration.py
│   ├── test_quality_system.py
│   ├── test_semantic_search.py
│   ├── test_sqlite_vec_storage.py
│   ├── test_time_parser.py
│   ├── test_timestamp_preservation.py
│   ├── timestamp
│   │   ├── test_hook_vs_manual_storage.py
│   │   ├── test_issue99_final_validation.py
│   │   ├── test_search_retrieval_inconsistency.py
│   │   ├── test_timestamp_issue.py
│   │   └── test_timestamp_simple.py
│   └── unit
│       ├── conftest.py
│       ├── test_cloudflare_storage.py
│       ├── test_csv_loader.py
│       ├── test_fastapi_dependencies.py
│       ├── test_import.py
│       ├── test_imports.py
│       ├── test_json_loader.py
│       ├── test_mdns_simple.py
│       ├── test_mdns.py
│       ├── test_memory_service.py
│       ├── test_memory.py
│       ├── test_semtools_loader.py
│       ├── test_storage_interface_compatibility.py
│       ├── test_tag_time_filtering.py
│       └── test_uv_no_pip_installer_fallback.py
├── tools
│   ├── docker
│   │   ├── DEPRECATED.md
│   │   ├── docker-compose.http.yml
│   │   ├── docker-compose.pythonpath.yml
│   │   ├── docker-compose.standalone.yml
│   │   ├── docker-compose.uv.yml
│   │   ├── docker-compose.yml
│   │   ├── docker-entrypoint-persistent.sh
│   │   ├── docker-entrypoint-unified.sh
│   │   ├── docker-entrypoint.sh
│   │   ├── Dockerfile
│   │   ├── Dockerfile.glama
│   │   ├── Dockerfile.slim
│   │   ├── README.md
│   │   └── test-docker-modes.sh
│   └── README.md
├── uv.lock
└── verify_compression.sh
```

# Files

--------------------------------------------------------------------------------
/src/mcp_memory_service/web/static/index.html:
--------------------------------------------------------------------------------

```html
   1 | <!DOCTYPE html>
   2 | <html lang="en">
   3 | <head>
   4 |     <meta charset="UTF-8">
   5 |     <meta name="viewport" content="width=device-width, initial-scale=1.0">
   6 |     <title data-i18n="meta.title">MCP Memory Service - Dashboard</title>
   7 |     <link rel="stylesheet" href="/static/style.css">
   8 |     <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🧠</text></svg>">
   9 |     <!-- Chart.js for quality analytics visualizations -->
  10 |     <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/chart.umd.min.js"></script>
  11 | </head>
  12 | <body>
  13 |     <!-- Main Application Container -->
  14 |     <div id="app" class="app-container">
  15 | 
  16 |         <!-- Header with Navigation -->
  17 |         <header class="app-header">
  18 |             <div class="header-content">
  19 |                 <div class="logo-section">
  20 |                     <h1 class="app-title" data-i18n="header.title">🧠 MCP Memory</h1>
  21 |                     <span id="versionBadge" class="version-badge" data-i18n="header.versionLoading">Loading...</span>
  22 |                 </div>
  23 | 
  24 |                 <!-- SVG Icon Definitions -->
  25 |                 <svg style="display: none;" aria-hidden="true">
  26 |                     <defs>
  27 |                         <symbol id="info-icon" viewBox="0 0 24 24">
  28 |                             <circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" fill="none"/>
  29 |                             <path d="M12 8v.01M12 12v4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
  30 |                         </symbol>
  31 |                     </defs>
  32 |                 </svg>
  33 | 
  34 |                 <!-- Quick Search Bar -->
  35 |                 <div class="search-section">
  36 |                     <div class="search-container">
  37 |                         <input type="text"
  38 |                                id="quickSearch"
  39 |                                class="search-input"
  40 |                                data-i18n-placeholder="search.placeholder"
  41 |                                placeholder="🔍 Search your memories..."
  42 |                                autocomplete="off">
  43 |                         <button class="search-btn" type="button" aria-label="Search">
  44 |                             <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
  45 |                                 <path d="M21.71 20.29L18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a1 1 0 0 0 1.42-1.42zM11 18a7 7 0 1 1 7-7 7 7 0 0 1-7 7z"/>
  46 |                             </svg>
  47 |                         </button>
  48 |                     </div>
  49 |                 </div>
  50 | 
  51 |                 <!-- Action Buttons -->
  52 |                 <div class="action-buttons">
  53 |                     <button id="addMemoryBtn" class="btn btn-primary" title="Add New Memory">
  54 |                         <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
  55 |                             <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
  56 |                         </svg>
  57 |                         <span class="btn-text" data-i18n="actions.addMemory">Add Memory</span>
  58 |                     </button>
  59 |                     <button id="themeToggleBtn" class="btn btn-secondary" title="Toggle Dark Mode">
  60 |                         <svg id="sunIcon" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24">
  61 |                             <circle cx="12" cy="12" r="5"/>
  62 |                             <line x1="12" y1="1" x2="12" y2="3"/>
  63 |                             <line x1="12" y1="21" x2="12" y2="23"/>
  64 |                             <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
  65 |                             <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
  66 |                             <line x1="1" y1="12" x2="3" y2="12"/>
  67 |                             <line x1="21" y1="12" x2="23" y2="12"/>
  68 |                             <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
  69 |                             <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
  70 |                         </svg>
  71 |                         <svg id="moonIcon" class="hidden" width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
  72 |                             <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
  73 |                         </svg>
  74 |                     </button>
  75 |                     <button id="settingsBtn" class="btn btn-secondary" title="Settings">
  76 |                         <svg width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24">
  77 |                             <circle cx="12" cy="12" r="3"/>
  78 |                             <path d="M12 1v6m0 6v10M1 12h6m6 0h10"/>
  79 |                             <path d="M4.22 4.22l4.24 4.24m7.08 7.08l4.24 4.24M4.22 19.78l4.24-4.24m7.08-7.08l4.24-4.24"/>
  80 |                         </svg>
  81 |                     </button>
  82 |                     <div class="language-selector" aria-label="Language">
  83 |                         <button type="button" class="lang-dropdown-trigger" aria-haspopup="true" aria-expanded="false">
  84 |                             <svg class="lang-icon" width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  85 |                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/>
  86 |                             </svg>
  87 |                             <span class="lang-current" data-i18n="lang.english">English</span>
  88 |                             <svg class="lang-chevron" width="16" height="16" fill="currentColor" viewBox="0 0 20 20">
  89 |                                 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/>
  90 |                             </svg>
  91 |                         </button>
  92 |                         <div class="lang-dropdown-menu" role="menu" hidden>
  93 |                             <!-- Dynamically populated by JavaScript -->
  94 |                         </div>
  95 |                     </div>
  96 |                 </div>
  97 |             </div>
  98 |         </header>
  99 | 
 100 |         <!-- Main Navigation -->
 101 |         <nav class="main-nav">
 102 |             <div class="nav-container">
 103 |                 <button class="nav-item active" data-view="dashboard" data-i18n="nav.dashboard">
 104 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 105 |                         <path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/>
 106 |                     </svg>
 107 |                     Dashboard
 108 |                 </button>
 109 |                 <button class="nav-item" data-view="search" data-i18n="nav.search">
 110 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 111 |                         <path d="M21.71 20.29L18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a1 1 0 0 0 1.42-1.42zM11 18a7 7 0 1 1 7-7 7 7 0 0 1-7 7z"/>
 112 |                     </svg>
 113 |                     Search
 114 |                 </button>
 115 |                 <button class="nav-item" data-view="browse" data-i18n="nav.browse">
 116 |                 <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 117 |                 <path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z"/>
 118 |                 </svg>
 119 |                 Browse
 120 |                 </button>
 121 |                 <button class="nav-item" data-view="documents" data-i18n="nav.documents">
 122 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 123 |                         <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"/>
 124 |                     </svg>
 125 |                     Documents
 126 |                 </button>
 127 |                 <button class="nav-item" data-view="manage" data-i18n="nav.manage">
 128 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 129 |                         <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>
 130 |                     </svg>
 131 |                     Manage
 132 |                 </button>
 133 |                 <button class="nav-item" data-view="analytics" data-i18n="nav.analytics">
 134 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 135 |                         <path d="M5 9.2h3V19H5zM10.6 5h2.8v14h-2.8zm5.6 8H19v6h-2.8z"/>
 136 |                     </svg>
 137 |                     Analytics
 138 |                 </button>
 139 |                 <button class="nav-item" data-view="qualityAnalytics" data-i18n="nav.qualityAnalytics">
 140 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 141 |                         <path d="M12 2L9.19 8.63L2 9.24L7.46 13.97L5.82 21L12 17.27L18.18 21L16.54 13.97L22 9.24L14.81 8.63L12 2Z"/>
 142 |                     </svg>
 143 |                     Quality
 144 |                 </button>
 145 |                 <button class="nav-item" data-view="apiDocs" data-i18n="nav.apiDocs">
 146 |                     <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 147 |                         <path d="M14,17H7V15H14M17,13H7V11H17M17,9H7V7H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z"/>
 148 |                     </svg>
 149 |                     API Docs
 150 |                 </button>
 151 |             </div>
 152 |         </nav>
 153 | 
 154 |         <!-- Main Content Area -->
 155 |         <main class="main-content">
 156 |             <!-- Dashboard View -->
 157 |             <div id="dashboardView" class="view-container active">
 158 |                 <div class="dashboard-grid">
 159 |                     <!-- Welcome Section -->
 160 |                     <section class="welcome-card">
 161 |                         <h2 data-i18n="home.welcome">Welcome to your Memory Dashboard</h2>
 162 |                         <p data-i18n="home.subtitle">Manage your AI memories with semantic search, real-time updates, and intelligent organization.</p>
 163 |                         <div class="quick-stats">
 164 |                             <div class="stat-item">
 165 |                                 <span class="stat-number" id="totalMemories">—</span>
 166 |                                 <span class="stat-label" data-i18n="stats.total">Total Memories</span>
 167 |                             </div>
 168 |                             <div class="stat-item">
 169 |                                 <span class="stat-number" id="recentMemories">—</span>
 170 |                                 <span class="stat-label" data-i18n="stats.thisWeek">This Week</span>
 171 |                             </div>
 172 |                             <div class="stat-item">
 173 |                                 <span class="stat-number" id="uniqueTags">—</span>
 174 |                                 <span class="stat-label" data-i18n="stats.tags">Tags</span>
 175 |                             </div>
 176 |                         </div>
 177 |                     </section>
 178 | 
 179 |                     <!-- Recent Memories -->
 180 |                     <section class="recent-memories">
 181 |                         <h3 data-i18n="sections.recentMemories">Recent Memories</h3>
 182 |                         <div id="recentMemoriesList" class="memory-list">
 183 |                             <!-- Dynamic content will be loaded here -->
 184 |                         </div>
 185 |                     </section>
 186 | 
 187 |                     <!-- Quick Actions -->
 188 |                     <section class="quick-actions">
 189 |                         <h3 data-i18n="sections.quickActions">Quick Actions</h3>
 190 |                         <div class="action-grid">
 191 |                             <button class="action-card" data-action="quick-search">
 192 |                                 <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
 193 |                                     <path d="M21.71 20.29L18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a1 1 0 0 0 1.42-1.42zM11 18a7 7 0 1 1 7-7 7 7 0 0 1-7 7z"/>
 194 |                                 </svg>
 195 |                                 <span data-i18n="actions.advancedSearch">Advanced Search</span>
 196 |                             </button>
 197 |                             <button class="action-card" data-action="add-memory">
 198 |                                 <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
 199 |                                     <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
 200 |                                 </svg>
 201 |                                 <span data-i18n="actions.addMemory">Add Memory</span>
 202 |                             </button>
 203 |                             <button class="action-card" data-action="browse-tags">
 204 |                                 <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
 205 |                                     <path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16z"/>
 206 |                                 </svg>
 207 |                                 <span data-i18n="actions.browseTags">Browse Tags</span>
 208 |                             </button>
 209 |                             <button class="action-card" data-action="export-data">
 210 |                                 <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
 211 |                                     <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"/>
 212 |                                 </svg>
 213 |                                 <span data-i18n="actions.exportData">Export Data</span>
 214 |                             </button>
 215 |                         </div>
 216 | 
 217 |                         <!-- Compact Sync Control (Hybrid Mode Only) -->
 218 |                         <div id="syncControl" class="sync-control-compact">
 219 |                             <div class="sync-row">
 220 |                                 <div class="sync-status">
 221 |                                     <span id="syncStatusDot" class="sync-dot"></span>
 222 |                                     <span id="syncStatusText" class="sync-text-sm">Checking...</span>
 223 |                                 </div>
 224 |                                 <span id="syncProgress" class="sync-progress-sm"></span>
 225 |                                 <div class="sync-buttons-sm">
 226 |                                     <button type="button" id="pauseSyncButton" class="btn-icon-sm" title="Pause sync">
 227 |                                         <svg width="14" height="14" fill="currentColor" viewBox="0 0 24 24">
 228 |                                             <path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/>
 229 |                                         </svg>
 230 |                                     </button>
 231 |                                     <button type="button" id="resumeSyncButton" class="btn-icon-sm" title="Resume sync">
 232 |                                         <svg width="14" height="14" fill="currentColor" viewBox="0 0 24 24">
 233 |                                             <path d="M8 5v14l11-7z"/>
 234 |                                         </svg>
 235 |                                     </button>
 236 |                                     <button type="button" id="forceSyncButton" class="btn-icon-sm btn-icon-primary" title="Sync now">
 237 |                                         <svg width="14" height="14" fill="currentColor" viewBox="0 0 24 24">
 238 |                                             <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/>
 239 |                                         </svg>
 240 |                                     </button>
 241 |                                 </div>
 242 |                             </div>
 243 |                         </div>
 244 |                     </section>
 245 |                 </div>
 246 |             </div>
 247 | 
 248 |             <!-- Search View -->
 249 |             <div id="searchView" class="view-container">
 250 |                 <div class="search-layout">
 251 |                     <!-- Advanced Search Panel -->
 252 |                     <aside class="search-filters">
 253 |                         <div class="filters-header">
 254 |                             <h3 data-i18n="search.filters.title">Search Filters
 255 |                                 <span class="tooltip" title="Filters work together: combine tags, dates, and types to narrow your search" data-i18n-aria="search.filters.tooltip">
 256 |                                     <svg width="16" height="16" fill="currentColor"><use href="#info-icon"/></svg>
 257 |                                 </span>
 258 |                             </h3>
 259 |                             <div class="mode-toggle-compact">
 260 |                                 <label class="toggle-switch">
 261 |                                     <input type="checkbox" id="liveSearchToggle" checked>
 262 |                                     <span class="slider"></span>
 263 |                                 </label>
 264 |                                 <span class="tooltip" title="Toggle between live search (updates as you type) and manual search mode" data-i18n-aria="search.filters.modeTooltip">
 265 |                                     <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
 266 |                                         <path d="M13 2L3 14h8l-1 8 10-12h-8l1-8z" fill="currentColor"/>
 267 |                                     </svg>
 268 |                                 </span>
 269 |                             </div>
 270 |                         </div>
 271 | 
 272 |                         <!-- Search Mode Indicator -->
 273 |                         <div class="search-mode-indicator">
 274 |                             <span class="mode-status">
 275 |                                 <span id="searchModeText">Live Search</span> <span data-i18n="search.filters.modeSuffix">mode</span>
 276 |                             </span>
 277 |                         </div>
 278 | 
 279 |                         <div class="filter-section">
 280 |                             <label for="tagFilter" data-i18n="search.filters.tags">Tags
 281 |                                 <span class="tooltip" title="Enter tags separated by commas (e.g., work, coding, important)" data-i18n-aria="search.filters.tagsTip">
 282 |                                     <svg width="16" height="16" fill="currentColor"><use href="#info-icon"/></svg>
 283 |                                 </span>
 284 |                             </label>
 285 |                             <input type="text" id="tagFilter" data-i18n-placeholder="search.filters.tagsPlaceholder" placeholder="e.g., work, coding, important">
 286 |                             <small class="help-text" data-i18n="search.filters.tagsHelp">Separate multiple tags with commas</small>
 287 |                         </div>
 288 | 
 289 |                         <div class="filter-section">
 290 |                             <label for="dateFilter" data-i18n="search.filters.date">Date Range
 291 |                                 <span class="tooltip" title="Filter memories by when they were created" data-i18n-aria="search.filters.dateTip">
 292 |                                     <svg width="16" height="16" fill="currentColor"><use href="#info-icon"/></svg>
 293 |                                 </span>
 294 |                             </label>
 295 |                             <select id="dateFilter">
 296 |                                 <option value="" data-i18n="search.filters.date.all">All time</option>
 297 |                                 <option value="today" data-i18n="search.filters.date.today">Today</option>
 298 |                                 <option value="yesterday" data-i18n="search.filters.date.yesterday">Yesterday</option>
 299 |                                 <option value="week" data-i18n="search.filters.date.week">This week</option>
 300 |                                 <option value="month" data-i18n="search.filters.date.month">This month</option>
 301 |                                 <option value="quarter" data-i18n="search.filters.date.quarter">This quarter</option>
 302 |                                 <option value="year" data-i18n="search.filters.date.year">This year</option>
 303 |                             </select>
 304 |                             <small class="help-text" data-i18n="search.filters.dateHelp">Select a time period to filter memories</small>
 305 |                         </div>
 306 | 
 307 |                         <div class="filter-section">
 308 |                             <label for="typeFilter" data-i18n="search.filters.type">Content Type
 309 |                                 <span class="tooltip" title="Filter by the type of content stored" data-i18n-aria="search.filters.typeTip">
 310 |                                     <svg width="16" height="16" fill="currentColor"><use href="#info-icon"/></svg>
 311 |                                 </span>
 312 |                             </label>
 313 |                             <select id="typeFilter">
 314 |                                 <option value="" data-i18n="search.filters.type.all">All types</option>
 315 |                                 <option value="note" data-i18n="search.filters.type.note">Notes</option>
 316 |                                 <option value="code" data-i18n="search.filters.type.code">Code</option>
 317 |                                 <option value="reference" data-i18n="search.filters.type.reference">References</option>
 318 |                                 <option value="idea" data-i18n="search.filters.type.idea">Ideas</option>
 319 |                             </select>
 320 |                             <small class="help-text" data-i18n="search.filters.typeHelp">Choose the type of memories to show</small>
 321 |                         </div>
 322 | 
 323 |                         <!-- Filter Actions -->
 324 |                         <div class="filter-actions">
 325 |                             <button type="button" id="applyFiltersBtn" class="btn btn-primary" data-i18n="actions.search">
 326 |                                 <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
 327 |                                     <path d="M21.71 20.29L18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a1 1 0 0 0 1.42-1.42zM11 18a7 7 0 1 1 7-7 7 7 0 0 1-7 7z"/>
 328 |                                 </svg>
 329 |                                 Search
 330 |                             </button>
 331 |                             <button type="button" id="clearFiltersBtn" class="btn btn-secondary" data-i18n="actions.clearAll">
 332 |                                 <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
 333 |                                     <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
 334 |                                 </svg>
 335 |                                 Clear All
 336 |                             </button>
 337 |                         </div>
 338 | 
 339 |                         <!-- Active Filters Display -->
 340 |                         <div id="activeFilters" class="active-filters" style="display: none;">
 341 |                             <h4 data-i18n="search.filters.activeTitle">Active Filters:</h4>
 342 |                             <div id="activeFiltersList" class="filter-pills">
 343 |                                 <!-- Dynamic filter pills will be added here -->
 344 |                             </div>
 345 |                         </div>
 346 |                     </aside>
 347 | 
 348 |                     <!-- Search Results -->
 349 |                     <div class="search-results">
 350 |                         <div class="search-header">
 351 |                             <h2 data-i18n="search.results.title">Search Results</h2>
 352 |                             <div class="results-meta">
 353 |                                 <span id="resultsCount">0 results</span>
 354 |                                 <div class="view-options">
 355 |                                     <button class="view-btn active" data-view="grid" data-i18n="search.view.grid">Grid</button>
 356 |                                     <button class="view-btn" data-view="list" data-i18n="search.view.list">List</button>
 357 |                                 </div>
 358 |                             </div>
 359 |                         </div>
 360 |                         <div id="searchResultsList" class="memory-grid">
 361 |                             <!-- Dynamic search results will be loaded here -->
 362 |                         </div>
 363 |                     </div>
 364 |                 </div>
 365 |             </div>
 366 | 
 367 |             <!-- Documents View -->
 368 |             <div id="documentsView" class="view-container">
 369 |                 <div class="documents-layout">
 370 |                     <!-- Document Upload Section -->
 371 |                     <section class="documents-section">
 372 |                         <h2 data-i18n="documents.title">📄 Document Ingestion</h2>
 373 |                         <div class="upload-area">
 374 |                             <div id="dropZone" class="drop-zone">
 375 |                                 <div class="drop-zone-content">
 376 |                                     <svg width="48" height="48" fill="currentColor" viewBox="0 0 24 24">
 377 |                                         <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"/>
 378 |                                     </svg>
 379 |                                     <h3 data-i18n="documents.dropTitle">Drag & drop files here</h3>
 380 |                                     <p data-i18n-html="documents.dropSubtitle">or <button id="fileSelectBtn" class="link-button">browse to select files</button></p>
 381 |                                     <p class="supported-formats" data-i18n="documents.supported">Supported formats: PDF, TXT, MD, JSON</p>
 382 |                                     <input type="file" id="fileInput" multiple accept=".pdf,.txt,.md,.json" style="display: none;">
 383 |                                 </div>
 384 |                             </div>
 385 |                         </div>
 386 | 
 387 |                         <!-- Upload Configuration -->
 388 |                         <div class="upload-config">
 389 |                         <div class="config-section">
 390 |                         <label for="docTags" data-i18n="documents.tagsLabel">Tags (comma-separated)</label>
 391 |                         <input type="text" id="docTags" placeholder="e.g., documentation, reference, manual" data-i18n-placeholder="documents.tagsPlaceholder" class="form-control">
 392 |                             <small class="form-help" data-i18n="documents.tagsHelp">Tags will be applied to all files. Use spaces or commas as separators.</small>
 393 |                         </div>
 394 | 
 395 |                              <!-- Processing Mode Toggle (shown when multiple files selected) -->
 396 |                              <div class="config-section" id="processingModeSection" style="display: none;">
 397 |                              <label data-i18n="documents.processingMode">Processing Mode <span class="info-icon info-icon-processing" title="Click for processing mode explanation" data-i18n-aria="documents.processingTip">ℹ️</span></label>
 398 |                                  <div class="processing-mode-toggle">
 399 |                                      <button type="button" id="batchModeBtn" class="mode-btn active" data-mode="batch" data-i18n="documents.modeBatch">
 400 |                                           <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
 401 |                                               <path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z"/>
 402 |                                           </svg>
 403 |                                           Batch Processing
 404 |                                       </button>
 405 |                                      <button type="button" id="individualModeBtn" class="mode-btn" data-mode="individual" data-i18n="documents.modeIndividual">
 406 |                                           <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
 407 |                                               <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"/>
 408 |                                           </svg>
 409 |                                           Individual Processing
 410 |                                       </button>
 411 |                                  </div>
 412 |                                  <div class="mode-description" id="modeDescription" data-i18n-html="documents.modeDescription">
 413 |                                      <small>All selected files will be processed together with the same tags.</small>
 414 |                                  </div>
 415 |                              </div>
 416 |                             <div class="config-row">
 417 |                                 <div class="config-section">
 418 |                                     <label for="chunkSize" data-i18n-html="documents.chunkSizeLabel">
 419 |                                         Chunk Size: <span id="chunkSizeValue">1000</span> chars
 420 |                                         <span class="info-icon" title="Click for chunking recommendations" data-i18n-aria="documents.chunkSizeTip">ℹ️</span>
 421 |                                     </label>
 422 |                                     <input type="range" id="chunkSize" min="500" max="2000" value="1000" step="100" class="form-control">
 423 |                                 </div>
 424 |                                 <div class="config-section">
 425 |                                     <label for="chunkOverlap" data-i18n-html="documents.chunkOverlapLabel">
 426 |                                         Overlap: <span id="chunkOverlapValue">200</span> chars
 427 |                                         <span class="info-icon info-icon-overlap" title="Click for overlap explanation" data-i18n-aria="documents.chunkOverlapTip">ℹ️</span>
 428 |                                     </label>
 429 |                                     <input type="range" id="chunkOverlap" min="0" max="500" value="200" step="50" class="form-control">
 430 |                                 </div>
 431 |                             </div>
 432 | 
 433 |                             <!-- Chunking Help Section (collapsible) -->
 434 |                             <div id="chunkingHelpSection" class="chunking-help" style="display: none;">
 435 |                                 <div class="help-header">
 436 |                                     <strong data-i18n="documents.chunkHelp.title">📚 Chunking Configuration Guide</strong>
 437 |                                     <button class="close-help" data-action="hideChunkingHelp">×</button>
 438 |                                 </div>
 439 |                                 <div class="help-content">
 440 |                                     <p class="help-note" data-i18n-html="documents.chunkHelp.note">
 441 |                                         <strong>Note:</strong> Actual chunk sizes may vary as the system respects paragraph boundaries
 442 |                                         to maintain semantic coherence.
 443 |                                     </p>
 444 | 
 445 |                                     <div class="help-recommendations">
 446 |                                         <div class="help-option">
 447 |                                             <div class="help-option-header">
 448 |                                                 <strong data-i18n="documents.chunkHelp.defaultTitle">✅ Default (1000 chars, 200 overlap)</strong>
 449 |                                                 <span class="help-tag" data-i18n="documents.chunkHelp.recommended">Recommended</span>
 450 |                                             </div>
 451 |                                             <p data-i18n-html="documents.chunkHelp.defaultBest"><strong>Best for:</strong> Technical documentation, reference manuals, knowledge bases</p>
 452 |                                             <p data-i18n-html="documents.chunkHelp.defaultWhy"><strong>Why:</strong> Paragraph-aware chunking preserves complete thoughts and context</p>
 453 |                                         </div>
 454 | 
 455 |                                         <div class="help-option">
 456 |                                             <div class="help-option-header">
 457 |                                                 <strong data-i18n="documents.chunkHelp.smallTitle">🔍 Smaller Chunks (500 chars, 100 overlap)</strong>
 458 |                                             </div>
 459 |                                             <p data-i18n-html="documents.chunkHelp.smallBest"><strong>Best for:</strong> Dense technical docs, code documentation, API references</p>
 460 |                                             <p data-i18n-html="documents.chunkHelp.smallTradeoff"><strong>Trade-off:</strong> More granular retrieval but may split paragraphs more aggressively</p>
 461 |                                         </div>
 462 | 
 463 |                                         <div class="help-option">
 464 |                                             <div class="help-option-header">
 465 |                                                 <strong data-i18n="documents.chunkHelp.largeTitle">📖 Larger Chunks (2000 chars, 400 overlap)</strong>
 466 |                                             </div>
 467 |                                             <p data-i18n-html="documents.chunkHelp.largeBest"><strong>Best for:</strong> Narrative documents, articles, blogs, long-form content</p>
 468 |                                             <p data-i18n-html="documents.chunkHelp.largeTradeoff"><strong>Trade-off:</strong> Better context but less precise retrieval</p>
 469 |                                         </div>
 470 |                                     </div>
 471 | 
 472 |                                     <div class="help-tips">
 473 |                                         <strong data-i18n="documents.chunkHelp.tipsTitle">💡 Tips:</strong>
 474 |                                         <ul>
 475 |                                             <li data-i18n-html="documents.chunkHelp.tipOverlap"><strong>Overlap</strong> helps maintain context across chunk boundaries</li>
 476 |                                             <li data-i18n-html="documents.chunkHelp.tipHigherOverlap"><strong>Higher overlap</strong> = better continuity but more redundancy</li>
 477 |                                             <li data-i18n="documents.chunkHelp.tipTest">Test different settings on a sample document to find optimal configuration</li>
 478 |                                             <li data-i18n="documents.chunkHelp.tipPreserve">Chunks preserve complete sentences and paragraphs when possible</li>
 479 |                                         </ul>
 480 |                                     </div>
 481 |                                 </div>
 482 |                             </div>
 483 | 
 484 |                             <!-- Overlap Help Section (collapsible) -->
 485 |                             <div id="overlapHelpSection" class="chunking-help overlap-help" style="display: none;">
 486 |                                 <div class="help-header">
 487 |                                     <strong data-i18n="documents.overlapHelp.title">🔗 Chunk Overlap Explained</strong>
 488 |                                     <button class="close-help" data-action="hideOverlapHelp">×</button>
 489 |                                 </div>
 490 |                                 <div class="help-content">
 491 |                                     <p class="help-note" data-i18n-html="documents.overlapHelp.note">
 492 |                                         <strong>What is overlap?</strong> Overlap is the number of characters that are duplicated
 493 |                                         between consecutive chunks. This helps maintain context across chunk boundaries.
 494 |                                     </p>
 495 | 
 496 |                                     <div class="help-example">
 497 |                                         <strong data-i18n="documents.overlapHelp.visual">Visual Example:</strong>
 498 |                                         <div class="overlap-diagram">
 499 |                                             <div class="chunk-demo">
 500 |                                                 <span class="chunk-part unique">Chunk 1 unique content...</span>
 501 |                                                 <span class="chunk-part overlap">shared overlap region</span>
 502 |                                             </div>
 503 |                                             <div class="chunk-demo">
 504 |                                                 <span class="chunk-part overlap">shared overlap region</span>
 505 |                                                 <span class="chunk-part unique">Chunk 2 unique content...</span>
 506 |                                             </div>
 507 |                                         </div>
 508 |                                     </div>
 509 | 
 510 |                                     <div class="help-recommendations">
 511 |                                         <div class="help-option">
 512 |                                             <div class="help-option-header">
 513 |                                                 <strong data-i18n="documents.overlapHelp.noneTitle">🎯 No Overlap (0 chars)</strong>
 514 |                                             </div>
 515 |                                             <p data-i18n-html="documents.overlapHelp.noneBest"><strong>Best for:</strong> Maximum storage efficiency, no redundancy needed</p>
 516 |                                             <p data-i18n-html="documents.overlapHelp.noneTradeoff"><strong>Trade-off:</strong> Context may be lost at chunk boundaries</p>
 517 |                                         </div>
 518 | 
 519 |                                         <div class="help-option">
 520 |                                             <div class="help-option-header">
 521 |                                                 <strong data-i18n="documents.overlapHelp.mediumTitle">✅ Medium Overlap (200 chars)</strong>
 522 |                                                 <span class="help-tag" data-i18n="documents.chunkHelp.recommended">Recommended</span>
 523 |                                             </div>
 524 |                                             <p data-i18n-html="documents.overlapHelp.mediumBest"><strong>Best for:</strong> Most documents - balances context and efficiency</p>
 525 |                                             <p data-i18n-html="documents.overlapHelp.mediumWhy"><strong>Why:</strong> Preserves 1-2 sentences of context across boundaries</p>
 526 |                                         </div>
 527 | 
 528 |                                         <div class="help-option">
 529 |                                             <div class="help-option-header">
 530 |                                                 <strong data-i18n="documents.overlapHelp.highTitle">🔄 High Overlap (400+ chars)</strong>
 531 |                                             </div>
 532 |                                             <p data-i18n-html="documents.overlapHelp.highBest"><strong>Best for:</strong> Complex technical content requiring maximum context</p>
 533 |                                             <p data-i18n-html="documents.overlapHelp.highTradeoff"><strong>Trade-off:</strong> More storage and processing, higher redundancy</p>
 534 |                                         </div>
 535 |                                     </div>
 536 | 
 537 |                                     <div class="help-tips">
 538 |                                         <strong data-i18n="documents.overlapHelp.tipsTitle">💡 Guidelines:</strong>
 539 |                                         <ul>
 540 |                                             <li data-i18n-html="documents.overlapHelp.tipRule"><strong>Rule of thumb:</strong> Overlap should be 15-25% of chunk size</li>
 541 |                                             <li data-i18n-html="documents.overlapHelp.tipSmall"><strong>Small chunks (500)</strong> → Use 100-150 overlap</li>
 542 |                                             <li data-i18n-html="documents.overlapHelp.tipMedium"><strong>Medium chunks (1000)</strong> → Use 200-250 overlap</li>
 543 |                                             <li data-i18n-html="documents.overlapHelp.tipLarge"><strong>Large chunks (2000)</strong> → Use 400-500 overlap</li>
 544 |                                             <li data-i18n="documents.overlapHelp.tipAccuracy">Higher overlap helps with search accuracy but increases storage</li>
 545 |                                             <li data-i18n="documents.overlapHelp.tipZero">Zero overlap is fine for well-structured documents with clear sections</li>
 546 |                                         </ul>
 547 |                                     </div>
 548 |                                 </div>
 549 |                             </div>
 550 | 
 551 |                             <!-- Processing Mode Help Section (collapsible) -->
 552 |                              <div id="processingModeHelpSection" class="chunking-help processing-mode-help" style="display: none;">
 553 |                                  <div class="help-header">
 554 |                                      <strong>⚙️ Processing Mode Options</strong>
 555 |                                      <button class="close-help" data-action="hideProcessingModeHelp">×</button>
 556 |                                  </div>
 557 |                              <div class="help-content">
 558 |                                      <p class="help-note" data-i18n-html="documents.processingHelp.note">
 559 |                                          <strong>When uploading multiple files,</strong> choose how they should be processed.
 560 |                                          Both modes apply the same tags to all files.
 561 |                                      </p>
 562 | 
 563 |                                      <div class="help-recommendations">
 564 |                                          <div class="help-option">
 565 |                                              <div class="help-option-header">
 566 |                                                  <strong data-i18n="documents.processingHelp.batchTitle">📦 Batch Processing</strong>
 567 |                                                  <span class="help-tag" data-i18n="documents.processingHelp.default">Default</span>
 568 |                                              </div>
 569 |                                              <p data-i18n-html="documents.processingHelp.batchWhat"><strong>What it does:</strong> Uploads all files together as one operation</p>
 570 |                                              <p data-i18n-html="documents.processingHelp.batchBest"><strong>Best for:</strong> Similar files, fast bulk processing, when you want files grouped together</p>
 571 |                                              <p data-i18n-html="documents.processingHelp.batchPros"><strong>Pros:</strong> Faster, simpler, single progress indicator</p>
 572 |                                              <p data-i18n-html="documents.processingHelp.batchCons"><strong>Cons:</strong> One file failure can affect the whole batch</p>
 573 |                                          </div>
 574 | 
 575 |                                          <div class="help-option">
 576 |                                              <div class="help-option-header">
 577 |                                                  <strong data-i18n="documents.processingHelp.individualTitle">🔄 Individual Processing</strong>
 578 |                                              </div>
 579 |                                              <p data-i18n-html="documents.processingHelp.individualWhat"><strong>What it does:</strong> Uploads each file separately with individual API calls</p>
 580 |                                              <p data-i18n-html="documents.processingHelp.individualBest"><strong>Best for:</strong> Mixed file types, when you want error isolation, or need individual progress tracking</p>
 581 |                                              <p data-i18n-html="documents.processingHelp.individualPros"><strong>Pros:</strong> Better error handling, individual progress, more robust</p>
 582 |                                              <p data-i18n-html="documents.processingHelp.individualCons"><strong>Cons:</strong> Slightly slower due to sequential processing</p>
 583 |                                          </div>
 584 |                                      </div>
 585 | 
 586 |                                          <div class="help-tips">
 587 |                                              <strong data-i18n="documents.processingHelp.tipsTitle">💡 When to choose each mode:</strong>
 588 |                                              <ul>
 589 |                                                  <li data-i18n-html="documents.processingHelp.tipBatch"><strong>Batch mode:</strong> When files are similar and you want them processed quickly together</li>
 590 |                                                  <li data-i18n-html="documents.processingHelp.tipIndividual"><strong>Individual mode:</strong> When files might have different processing requirements or you want to ensure all files get processed even if some fail</li>
 591 |                                                  <li data-i18n-html="documents.processingHelp.tipSingle"><strong>Single files:</strong> Always processed individually (no choice needed)</li>
 592 |                                                  <li data-i18n="documents.processingHelp.tipTags">Both modes apply the same tags to all files</li>
 593 |                                              </ul>
 594 |                                          </div>
 595 |                                  </div>
 596 |                              </div>
 597 | 
 598 |                              <div class="config-section">
 599 |                                 <label for="memoryType" data-i18n="documents.memoryTypeLabel">Memory Type</label>
 600 |                                 <select id="memoryType" class="form-control">
 601 |                                     <option value="document" data-i18n="documents.memoryType.document">Document</option>
 602 |                                     <option value="reference" data-i18n="documents.memoryType.reference">Reference</option>
 603 |                                     <option value="knowledge" data-i18n="documents.memoryType.knowledge">Knowledge</option>
 604 |                                     <option value="note" data-i18n="documents.memoryType.note">Note</option>
 605 |                                 </select>
 606 |                              </div>
 607 |                         </div>
 608 | 
 609 |                         <!-- Upload Button -->
 610 |                         <div class="upload-actions">
 611 |                             <button id="uploadBtn" class="btn btn-primary" disabled data-i18n="documents.upload">
 612 |                                 <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 613 |                                     <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"/>
 614 |                                 </svg>
 615 |                                 Upload & Ingest
 616 |                             </button>
 617 |                         </div>
 618 |                     </section>
 619 | 
 620 |                     <!-- Upload Queue/History Section -->
 621 |                     <section class="documents-section">
 622 |                         <h2 data-i18n="documents.historyTitle">📊 Upload History</h2>
 623 |                         <div id="uploadHistory" class="upload-history">
 624 |                             <div class="loading-spinner"></div>
 625 |                             <p data-i18n="documents.historyLoading">Loading upload history...</p>
 626 |                         </div>
 627 |                     </section>
 628 | 
 629 |                     <!-- Document Content Search Section -->
 630 |                     <section class="documents-section">
 631 |                         <h2 data-i18n="documents.searchTitle">🔍 Search Ingested Content</h2>
 632 |                         <p class="section-description" data-i18n="documents.searchDesc">Search within your uploaded documents to verify content is indexed</p>
 633 |                         <div class="doc-search-container">
 634 |                             <input type="text"
 635 |                                    id="docSearchInput"
 636 |                                    class="search-input"
 637 |                                    placeholder="Search for content within ingested documents..."
 638 |                                    data-i18n-placeholder="documents.searchPlaceholder">
 639 |                             <button id="docSearchBtn" class="btn btn-primary" data-i18n="documents.searchBtn">Search Documents</button>
 640 |                         </div>
 641 |                         <div id="docSearchResults" class="doc-search-results" style="display: none;">
 642 |                             <div class="search-results-header">
 643 |                                 <h3>Search Results</h3>
 644 |                                 <span id="docSearchCount" class="results-count">0 results</span>
 645 |                             </div>
 646 |                             <div id="docSearchResultsList" class="search-results-list">
 647 |                                 <!-- Results will be populated here -->
 648 |                             </div>
 649 |                         </div>
 650 |                     </section>
 651 |                 </div>
 652 |             </div>
 653 | 
 654 |             <!-- Other views (Browse, Manage, Analytics) will be added in subsequent phases -->
 655 |             <div id="browseView" class="view-container">
 656 |                 <div class="view-header">
 657 |                     <h2 data-i18n="browse.title">Browse by Tags</h2>
 658 |                     <p data-i18n="browse.subtitle">Explore your memories organized by tags</p>
 659 |                 </div>
 660 | 
 661 |                 <div class="browse-content">
 662 |                     <div id="tagsCloudContainer" class="tags-cloud">
 663 |                         <!-- Dynamic tags will be loaded here -->
 664 |                     </div>
 665 | 
 666 |                     <div id="taggedMemoriesContainer" class="tagged-memories" style="display: none;">
 667 |                         <div class="section-header">
 668 |                             <h3 id="selectedTagTitle"><span data-i18n="browse.memoriesTagged">Memories tagged with:</span> <span id="selectedTagName"></span></h3>
 669 |                             <button id="clearTagFilter" class="btn btn-secondary" data-i18n="browse.showAllTags">Show All Tags</button>
 670 |                         </div>
 671 |                         <div id="taggedMemoriesList" class="memory-grid">
 672 |                             <!-- Filtered memories will be shown here -->
 673 |                         </div>
 674 |                     </div>
 675 |                 </div>
 676 |             </div>
 677 | 
 678 |             <!-- Manage View -->
 679 |             <div id="manageView" class="view-container">
 680 |                 <div class="manage-layout">
 681 |                     <!-- Bulk Operations Section -->
 682 |                     <section class="manage-section">
 683 |                         <h2 data-i18n="manage.bulk.title">🧹 Bulk Operations</h2>
 684 |                         <div class="bulk-ops-grid">
 685 |                             <div class="bulk-op-card">
 686 |                                 <h3 data-i18n="manage.bulk.deleteTag.title">Delete by Tag</h3>
 687 |                                 <p data-i18n="manage.bulk.deleteTag.desc">Remove all memories with a specific tag</p>
 688 |                                 <div class="op-controls">
 689 |                                     <select id="deleteTagSelect" class="form-control">
 690 |                                         <option value="" data-i18n="manage.bulk.deleteTag.placeholder">Select tag...</option>
 691 |                                     </select>
 692 |                                     <button id="deleteByTagBtn" class="btn btn-danger" data-i18n="manage.bulk.delete">Delete</button>
 693 |                                 </div>
 694 |                             </div>
 695 | 
 696 |                             <div class="bulk-op-card">
 697 |                                 <h3 data-i18n="manage.bulk.cleanup.title">Cleanup Duplicates</h3>
 698 |                                 <p data-i18n="manage.bulk.cleanup.desc">Remove duplicate memories based on content</p>
 699 |                                 <div class="op-controls">
 700 |                                     <button id="cleanupDuplicatesBtn" class="btn btn-warning" data-i18n="manage.bulk.cleanup.run">Run Cleanup</button>
 701 |                                 </div>
 702 |                             </div>
 703 | 
 704 |                             <div class="bulk-op-card">
 705 |                                 <h3 data-i18n="manage.bulk.deleteDate.title">Delete by Date</h3>
 706 |                                 <p data-i18n="manage.bulk.deleteDate.desc">Remove memories older than a specific date</p>
 707 |                                 <div class="op-controls">
 708 |                                     <input type="date" id="deleteDateInput" class="form-control">
 709 |                                     <button id="deleteByDateBtn" class="btn btn-danger" data-i18n="manage.bulk.delete">Delete</button>
 710 |                                 </div>
 711 |                             </div>
 712 | 
 713 |                             <div id="deleteUntaggedCard" class="bulk-op-card" style="display: none;">
 714 |                                 <h3 data-i18n="manage.bulk.deleteUntagged.title">Delete Untagged</h3>
 715 |                                 <p>Remove memories without any tags (<span id="untaggedCount">0</span> found)</p>
 716 |                                 <div class="op-controls">
 717 |                                     <button id="deleteUntaggedBtn" class="btn btn-danger" data-i18n="manage.bulk.delete">Delete</button>
 718 |                                 </div>
 719 |                             </div>
 720 |                         </div>
 721 |                     </section>
 722 | 
 723 |                     <!-- Tag Management Section -->
 724 |                     <section class="manage-section">
 725 |                         <h2 data-i18n="manage.tags.title">🏷️ Tag Management</h2>
 726 |                         <div id="tagManagementContainer">
 727 |                             <div class="loading-spinner"></div>
 728 |                             <p data-i18n="manage.tags.loading">Loading tag statistics...</p>
 729 |                         </div>
 730 |                     </section>
 731 | 
 732 |                     <!-- System Operations Section -->
 733 |                     <section class="manage-section">
 734 |                         <h2 data-i18n="manage.system.title">⚙️ System Maintenance</h2>
 735 |                         <div class="system-ops-grid">
 736 |                             <div class="system-op-card">
 737 |                                 <h3 data-i18n="manage.system.dbOpt.title">Database Optimization</h3>
 738 |                                 <p data-i18n="manage.system.dbOpt.desc">Optimize database performance</p>
 739 |                                 <button id="optimizeDbBtn" class="btn btn-secondary" disabled data-i18n="manage.system.dbOpt.btn">Optimize DB</button>
 740 |                             </div>
 741 | 
 742 |                             <div class="system-op-card">
 743 |                                 <h3 data-i18n="manage.system.rebuild.title">Rebuild Search Index</h3>
 744 |                                 <p data-i18n="manage.system.rebuild.desc">Rebuild search indexes for better performance</p>
 745 |                                 <button id="rebuildIndexBtn" class="btn btn-secondary" disabled data-i18n="manage.system.rebuild.btn">Rebuild Index</button>
 746 |                             </div>
 747 |                         </div>
 748 |                     </section>
 749 |                 </div>
 750 |             </div>
 751 | 
 752 |             <!-- Analytics View -->
 753 |             <div id="analyticsView" class="view-container">
 754 |                 <div class="analytics-layout">
 755 |                     <!-- Key Metrics Cards -->
 756 |                     <section class="analytics-section">
 757 |                         <h2 data-i18n="analytics.keyMetrics">📊 Key Metrics</h2>
 758 |                         <div class="metrics-grid">
 759 |                             <div class="metric-card">
 760 |                                 <div class="metric-value" id="analyticsTotalMemories">-</div>
 761 |                                 <div class="metric-label" data-i18n="analytics.totalMemories">Total Memories</div>
 762 |                             </div>
 763 |                             <div class="metric-card">
 764 |                                 <div class="metric-value" id="analyticsThisWeek">-</div>
 765 |                                 <div class="metric-label" data-i18n="analytics.thisWeek">This Week</div>
 766 |                             </div>
 767 |                             <div class="metric-card">
 768 |                                 <div class="metric-value" id="analyticsUniqueTags">-</div>
 769 |                                 <div class="metric-label" data-i18n="analytics.uniqueTags">Unique Tags</div>
 770 |                             </div>
 771 |                             <div class="metric-card">
 772 |                                 <div class="metric-value" id="analyticsDbSize">-</div>
 773 |                                 <div class="metric-label" data-i18n="analytics.databaseSize">Database Size</div>
 774 |                             </div>
 775 |                         </div>
 776 |                     </section>
 777 | 
 778 |                     <!-- Charts Section -->
 779 |                     <section class="analytics-section">
 780 |                         <h2 data-i18n="analytics.trends">📈 Trends & Charts</h2>
 781 |                         <div class="charts-grid">
 782 |                             <div class="chart-card">
 783 |                                 <h3 data-i18n="analytics.growth">Memory Growth Over Time</h3>
 784 |                                 <div class="chart-controls">
 785 |                                     <select id="growthPeriodSelect" class="form-control">
 786 |                                         <option value="week" data-i18n="analytics.period.week">Last Week</option>
 787 |                                         <option value="month" selected data-i18n="analytics.period.month">Last Month</option>
 788 |                                         <option value="quarter" data-i18n="analytics.period.quarter">Last Quarter</option>
 789 |                                         <option value="year" data-i18n="analytics.period.year">Last Year</option>
 790 |                                     </select>
 791 |                                 </div>
 792 |                                 <div id="memoryGrowthChart" class="chart-container">
 793 |                                     <div class="loading-spinner"></div>
 794 |                                     <p data-i18n="analytics.loadingChart">Loading chart...</p>
 795 |                                 </div>
 796 |                             </div>
 797 | 
 798 |                             <div class="chart-card">
 799 |                                 <h3 data-i18n="analytics.tagUsage">Tag Usage Distribution</h3>
 800 |                                 <div id="tagUsageChart" class="chart-container">
 801 |                                     <div class="loading-spinner"></div>
 802 |                                     <p data-i18n="analytics.loadingChart">Loading chart...</p>
 803 |                                 </div>
 804 |                             </div>
 805 | 
 806 |                             <div class="chart-card">
 807 |                                 <h3 data-i18n="analytics.memoryTypes">Memory Types Distribution</h3>
 808 |                                 <div id="memoryTypesChart" class="chart-container">
 809 |                                     <div class="loading-spinner"></div>
 810 |                                     <p data-i18n="analytics.loadingChart">Loading chart...</p>
 811 |                                 </div>
 812 |                             </div>
 813 | 
 814 |                                     <div class="chart-card">
 815 |                                     <h3 data-i18n="analytics.heatmap">Activity Heatmap</h3>
 816 |                                     <div class="chart-controls">
 817 |                                     <select id="heatmapPeriodSelect" class="form-control">
 818 |                                     <option value="90" selected data-i18n="analytics.period.90d">Last 90 Days</option>
 819 |                                     <option value="180" data-i18n="analytics.period.180d">Last 6 Months</option>
 820 |                                     <option value="365" data-i18n="analytics.period.year">Last Year</option>
 821 |                                         </select>
 822 |                                         </div>
 823 |                                         <div id="activityHeatmapChart" class="chart-container">
 824 |                                             <div class="loading-spinner"></div>
 825 |                                         <p data-i18n="analytics.loadingHeatmap">Loading heatmap...</p>
 826 |                                     </div>
 827 |                                     </div>
 828 |                             </section>
 829 | 
 830 |                             <!-- Detailed Analytics -->
 831 |                             <section class="analytics-section">
 832 |                             <h2 data-i18n="analytics.reports">📋 Detailed Reports</h2>
 833 |                             <div class="reports-grid">
 834 |                             <div class="report-card">
 835 |                             <h3 data-i18n="analytics.topTags">Top Tags</h3>
 836 |                             <div class="chart-controls">
 837 |                             <select id="topTagsPeriodSelect" class="form-control">
 838 |                             <option value="7d" data-i18n="analytics.period.7d">Last 7 Days</option>
 839 |                             <option value="30d" selected data-i18n="analytics.period.30d">Last 30 Days</option>
 840 |                             <option value="90d" data-i18n="analytics.period.90d">Last 90 Days</option>
 841 |                             <option value="all" data-i18n="analytics.period.all">All Time</option>
 842 |                             </select>
 843 |                             </div>
 844 |                             <div id="topTagsList" class="report-content">
 845 |                                      <div class="loading-spinner"></div>
 846 |                                      <p data-i18n="analytics.loading">Loading...</p>
 847 |                                  </div>
 848 |                              </div>
 849 | 
 850 |                              <div class="report-card">
 851 |                                  <h3 data-i18n="analytics.recentActivity">Recent Activity</h3>
 852 |                                  <div class="chart-controls">
 853 |                                      <select id="activityGranularitySelect" class="form-control">
 854 |                                          <option value="hourly" data-i18n="analytics.granularity.hour">By Hour</option>
 855 |                                          <option value="daily" selected data-i18n="analytics.granularity.day">By Day</option>
 856 |                                          <option value="weekly" data-i18n="analytics.granularity.week">By Week</option>
 857 |                                      </select>
 858 |                                  </div>
 859 |                                  <div id="recentActivityList" class="report-content">
 860 |                                      <div class="loading-spinner"></div>
 861 |                                      <p data-i18n="analytics.loading">Loading...</p>
 862 |                                  </div>
 863 |                              </div>
 864 | 
 865 |                              <div class="report-card">
 866 |                                  <h3 data-i18n="analytics.storage">Storage Report</h3>
 867 |                                  <div id="storageReport" class="report-content">
 868 |                                      <div class="loading-spinner"></div>
 869 |                                      <p data-i18n="analytics.loading">Loading...</p>
 870 |                                  </div>
 871 |                              </div>
 872 |                          </div>
 873 |                      </section>
 874 |                 </div>
 875 |             </div>
 876 | 
 877 |             <!-- Quality Analytics View -->
 878 |             <div id="qualityAnalyticsView" class="view-container">
 879 |                 <div class="quality-analytics-section">
 880 |                     <h2 data-i18n="quality.analytics.title">⭐ Memory Quality Analytics</h2>
 881 |                     <p data-i18n="quality.analytics.subtitle">Track and improve your memory quality with AI-powered scoring</p>
 882 | 
 883 |                     <!-- Quality Distribution Summary -->
 884 |                     <div class="quality-summary">
 885 |                         <div class="stat-card">
 886 |                             <div class="stat-value" id="quality-total-memories">-</div>
 887 |                             <div class="stat-label" data-i18n="quality.stats.total">Total Memories</div>
 888 |                         </div>
 889 | 
 890 |                         <div class="stat-card stat-high">
 891 |                             <div class="stat-value" id="quality-high-count">-</div>
 892 |                             <div class="stat-label" data-i18n="quality.stats.high">High Quality (≥0.7)</div>
 893 |                         </div>
 894 | 
 895 |                         <div class="stat-card stat-medium">
 896 |                             <div class="stat-value" id="quality-medium-count">-</div>
 897 |                             <div class="stat-label" data-i18n="quality.stats.medium">Medium (0.5-0.7)</div>
 898 |                         </div>
 899 | 
 900 |                         <div class="stat-card stat-low">
 901 |                             <div class="stat-value" id="quality-low-count">-</div>
 902 |                             <div class="stat-label" data-i18n="quality.stats.low">Low (<0.5)</div>
 903 |                         </div>
 904 | 
 905 |                         <div class="stat-card">
 906 |                             <div class="stat-value" id="quality-average-score">-</div>
 907 |                             <div class="stat-label" data-i18n="quality.stats.average">Average Score</div>
 908 |                         </div>
 909 |                     </div>
 910 | 
 911 |                     <!-- Distribution Chart -->
 912 |                     <div class="chart-container">
 913 |                         <h3 data-i18n="quality.chart.distribution.title">Quality Score Distribution</h3>
 914 |                         <canvas id="quality-distribution-chart"></canvas>
 915 |                     </div>
 916 | 
 917 |                     <!-- Provider Breakdown -->
 918 |                     <div class="chart-container">
 919 |                         <h3 data-i18n="quality.chart.providers.title">Scoring Provider Breakdown</h3>
 920 |                         <canvas id="quality-provider-chart"></canvas>
 921 |                     </div>
 922 | 
 923 |                     <!-- Top Performers -->
 924 |                     <div class="top-performers">
 925 |                         <h3 data-i18n="quality.top.title">🏆 Top Quality Memories</h3>
 926 |                         <div id="quality-top-memories-list"></div>
 927 |                     </div>
 928 | 
 929 |                     <!-- Bottom Performers (for improvement) -->
 930 |                     <div class="bottom-performers">
 931 |                         <h3 data-i18n="quality.bottom.title">📈 Memories for Improvement</h3>
 932 |                         <div id="quality-bottom-memories-list"></div>
 933 |                     </div>
 934 |                 </div>
 935 |             </div>
 936 | 
 937 |             <!-- API Documentation View -->
 938 |             <div id="apiDocsView" class="view-container">
 939 |                 <div class="api-docs-header">
 940 |                     <h2 data-i18n="api.title">🔗 API Documentation</h2>
 941 |                     <p data-i18n="api.subtitle">Comprehensive REST API endpoints for MCP Memory Service</p>
 942 |                     <div class="api-docs-links">
 943 |                         <a href="/api/docs" target="_blank" class="btn btn-primary" data-i18n="api.link.swagger">
 944 |                             <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 945 |                                 <path d="M14,17H7V15H14M17,13H7V11H17M17,9H7V7H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z"/>
 946 |                             </svg>
 947 |                             Interactive Swagger UI
 948 |                         </a>
 949 |                         <a href="/api/redoc" target="_blank" class="btn btn-secondary" data-i18n="api.link.redoc">
 950 |                             <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 951 |                                 <path d="M14,17H7V15H14M17,13H7V11H17M17,9H7V7H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z"/>
 952 |                             </svg>
 953 |                             ReDoc Documentation
 954 |                         </a>
 955 |                         <a href="/api-overview" target="_blank" class="btn btn-secondary" data-i18n="api.link.overview">
 956 |                             <svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24">
 957 |                                 <path d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4M11,16.5L18,9.5L16.59,8.09L11,13.67L7.91,10.59L6.5,12L11,16.5Z"/>
 958 |                             </svg>
 959 |                             API Overview Page
 960 |                         </a>
 961 |                     </div>
 962 |                 </div>
 963 | 
 964 |                 <div class="api-endpoints-grid">
 965 |                     <!-- Memory Management -->
 966 |                     <div class="endpoint-section">
 967 |                         <h3 data-i18n="api.section.memory">💾 Memory Management</h3>
 968 |                         <div class="endpoint-list">
 969 |                             <div class="endpoint-item">
 970 |                                 <span class="method post">POST</span>
 971 |                                 <span class="path">/api/memories</span>
 972 |                                 <span class="description" data-i18n="api.memory.store">Store a new memory with automatic embedding generation</span>
 973 |                             </div>
 974 |                             <div class="endpoint-item">
 975 |                                 <span class="method get">GET</span>
 976 |                                 <span class="path">/api/memories</span>
 977 |                                 <span class="description" data-i18n="api.memory.list">List all memories with pagination support</span>
 978 |                             </div>
 979 |                             <div class="endpoint-item">
 980 |                                 <span class="method get">GET</span>
 981 |                                 <span class="path">/api/memories/{content_hash}</span>
 982 |                                 <span class="description" data-i18n="api.memory.get">Retrieve a specific memory by content hash</span>
 983 |                             </div>
 984 |                             <div class="endpoint-item">
 985 |                                 <span class="method delete">DELETE</span>
 986 |                                 <span class="path">/api/memories/{content_hash}</span>
 987 |                                 <span class="description" data-i18n="api.memory.delete">Delete a memory and its embeddings</span>
 988 |                             </div>
 989 |                         </div>
 990 |                     </div>
 991 | 
 992 |                     <!-- Search Operations -->
 993 |                     <div class="endpoint-section">
 994 |                         <h3 data-i18n="api.section.search">🔍 Search Operations</h3>
 995 |                         <div class="endpoint-list">
 996 |                             <div class="endpoint-item">
 997 |                                 <span class="method post">POST</span>
 998 |                                 <span class="path">/api/search</span>
 999 |                                 <span class="description" data-i18n="api.search.semantic">Semantic similarity search using embeddings</span>
1000 |                             </div>
1001 |                             <div class="endpoint-item">
1002 |                                 <span class="method post">POST</span>
1003 |                                 <span class="path">/api/search/by-tag</span>
1004 |                                 <span class="description" data-i18n="api.search.tag">Search memories by tags (AND/OR logic)</span>
1005 |                             </div>
1006 |                             <div class="endpoint-item">
1007 |                                 <span class="method post">POST</span>
1008 |                                 <span class="path">/api/search/by-time</span>
1009 |                                 <span class="description" data-i18n="api.search.time">Natural language time-based queries</span>
1010 |                             </div>
1011 |                             <div class="endpoint-item">
1012 |                                 <span class="method get">GET</span>
1013 |                                 <span class="path">/api/search/similar/{content_hash}</span>
1014 |                                 <span class="description" data-i18n="api.search.similar">Find memories similar to a specific one</span>
1015 |                             </div>
1016 |                         </div>
1017 |                     </div>
1018 | 
1019 |                     <!-- Real-time Events -->
1020 |                     <div class="endpoint-section">
1021 |                         <h3 data-i18n="api.section.events">📡 Real-time Events</h3>
1022 |                         <div class="endpoint-list">
1023 |                             <div class="endpoint-item">
1024 |                                 <span class="method get">GET</span>
1025 |                                 <span class="path">/api/events</span>
1026 |                                 <span class="description" data-i18n="api.events.stream">Subscribe to real-time memory events stream</span>
1027 |                             </div>
1028 |                             <div class="endpoint-item">
1029 |                                 <span class="method get">GET</span>
1030 |                                 <span class="path">/api/events/stats</span>
1031 |                                 <span class="description" data-i18n="api.events.stats">View SSE connection statistics</span>
1032 |                             </div>
1033 |                         </div>
1034 |                     </div>
1035 | 
1036 |                     <!-- Health & Status -->
1037 |                     <div class="endpoint-section">
1038 |                         <h3 data-i18n="api.section.health">🏥 Health & Status</h3>
1039 |                         <div class="endpoint-list">
1040 |                             <div class="endpoint-item">
1041 |                                 <span class="method get">GET</span>
1042 |                                 <span class="path">/api/health</span>
1043 |                                 <span class="description" data-i18n="api.health.quick">Quick health check endpoint</span>
1044 |                             </div>
1045 |                             <div class="endpoint-item">
1046 |                                 <span class="method get">GET</span>
1047 |                                 <span class="path">/api/health/detailed</span>
1048 |                                 <span class="description" data-i18n="api.health.detailed">Detailed health with database statistics</span>
1049 |                             </div>
1050 |                         </div>
1051 |                     </div>
1052 |                 </div>
1053 |             </div>
1054 |         </main>
1055 | 
1056 |         <!-- Footer -->
1057 |         <footer class="app-footer">
1058 |             <div class="footer-content">
1059 |                 <div class="footer-section">
1060 |                     <h4 data-i18n="footer.docs.title">Documentation</h4>
1061 |                     <ul class="footer-links">
1062 |                         <li><a href="https://github.com/doobidoo/mcp-memory-service/wiki" target="_blank" rel="noopener" data-i18n="footer.docs.wiki">📚 Wiki Home</a></li>
1063 |                         <li><a href="https://github.com/doobidoo/mcp-memory-service/wiki/07-TROUBLESHOOTING" target="_blank" rel="noopener" data-i18n="footer.docs.troubleshoot">🔧 Troubleshooting Guide</a></li>
1064 |                         <li><a href="https://github.com/doobidoo/mcp-memory-service/wiki/07-TROUBLESHOOTING#backend-configuration-issues" target="_blank" rel="noopener" data-i18n="footer.docs.config">⚙️ Configuration Issues</a></li>
1065 |                     </ul>
1066 |                 </div>
1067 | 
1068 |                 <div class="footer-section">
1069 |                     <h4 data-i18n="footer.resources.title">Resources</h4>
1070 |                     <ul class="footer-links">
1071 |                         <li><a href="https://github.com/doobidoo/mcp-memory-service" target="_blank" rel="noopener" data-i18n="footer.resources.repo">
1072 |                             <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
1073 |                                 <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
1074 |                             </svg>
1075 |                             GitHub Repository
1076 |                         </a></li>
1077 |                         <li><a href="https://doobidoo.github.io" target="_blank" rel="noopener" data-i18n="footer.resources.portfolio">
1078 |                             🌐 Portfolio
1079 |                         </a></li>
1080 |                         <li><a href="/api/docs" target="_blank" data-i18n="footer.resources.apiDoc">
1081 |                             📖 API Documentation
1082 |                         </a></li>
1083 |                     </ul>
1084 |                 </div>
1085 | 
1086 |                 <div class="footer-section">
1087 |                     <h4 data-i18n="footer.about.title">About</h4>
1088 |                     <p class="footer-description" data-i18n="footer.about.desc">
1089 |                         MCP Memory Service - Semantic memory management for AI assistants
1090 |                     </p>
1091 |                     <div class="footer-license">
1092 |                         <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
1093 |                             <path d="M14,17H7V15H14M17,13H7V11H17M17,9H7V7H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z"/>
1094 |                         </svg>
1095 |                         <a href="https://github.com/doobidoo/mcp-memory-service/blob/main/LICENSE" target="_blank" rel="noopener" data-i18n="footer.about.license">
1096 |                             Licensed under Apache 2.0
1097 |                         </a>
1098 |                     </div>
1099 |                     <div class="footer-copyright" data-i18n="footer.about.copyright">
1100 |                         © 2024 Heinrich Krupp
1101 |                     </div>
1102 |                 </div>
1103 |             </div>
1104 |         </footer>
1105 | 
1106 |         <!-- Memory Detail Modal -->
1107 |         <div id="memoryModal" class="modal-overlay">
1108 |             <div class="modal-content">
1109 |                 <div class="modal-header">
1110 |                     <h3 id="modalTitle" data-i18n="modal.memoryDetails.title">Memory Details</h3>
1111 |                     <button class="modal-close" aria-label="Close">
1112 |                         <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
1113 |                             <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
1114 |                         </svg>
1115 |                     </button>
1116 |                 </div>
1117 |                 <div class="modal-body">
1118 |                     <div id="modalContent">
1119 |                         <!-- Dynamic memory content -->
1120 |                     </div>
1121 |                 </div>
1122 |                 <div class="modal-footer">
1123 |                     <button class="btn btn-secondary" id="editMemoryBtn" data-i18n="modal.memoryDetails.edit">Edit</button>
1124 |                     <button class="btn btn-danger" id="deleteMemoryBtn" data-i18n="modal.memoryDetails.delete">Delete</button>
1125 |                     <button class="btn btn-primary" id="shareMemoryBtn" data-i18n="modal.memoryDetails.share">Share</button>
1126 |                 </div>
1127 |             </div>
1128 |         </div>
1129 | 
1130 |         <!-- Add Memory Modal -->
1131 |         <div id="addMemoryModal" class="modal-overlay">
1132 |             <div class="modal-content">
1133 |                 <div class="modal-header">
1134 |                     <h3 data-i18n="modal.addMemory.title">Add New Memory</h3>
1135 |                     <button class="modal-close" aria-label="Close">
1136 |                         <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
1137 |                             <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
1138 |                         </svg>
1139 |                     </button>
1140 |                 </div>
1141 |                 <div class="modal-body">
1142 |                     <form id="addMemoryForm">
1143 |                         <div class="form-group">
1144 |                             <label for="memoryContent" data-i18n="modal.addMemory.contentLabel">Content</label>
1145 |                             <textarea id="memoryContent" rows="6" data-i18n-placeholder="modal.addMemory.contentPlaceholder" placeholder="Enter your memory content..."></textarea>
1146 |                         </div>
1147 |                         <div class="form-group">
1148 |                             <label for="memoryTags" data-i18n="modal.addMemory.tagsLabel">Tags (comma-separated)</label>
1149 |                             <input type="text" id="memoryTags" data-i18n-placeholder="modal.addMemory.tagsPlaceholder" placeholder="e.g., coding, javascript, api">
1150 |                         </div>
1151 |                         <div class="form-group">
1152 |                             <label for="memoryType" data-i18n="modal.addMemory.typeLabel">Type</label>
1153 |                             <select id="memoryType">
1154 |                                 <option value="note" data-i18n="modal.addMemory.typeNote">Note</option>
1155 |                                 <option value="code" data-i18n="modal.addMemory.typeCode">Code</option>
1156 |                                 <option value="reference" data-i18n="modal.addMemory.typeReference">Reference</option>
1157 |                                 <option value="idea" data-i18n="modal.addMemory.typeIdea">Idea</option>
1158 |                             </select>
1159 |                         </div>
1160 |                     </form>
1161 |                 </div>
1162 |                 <div class="modal-footer">
1163 |                     <button class="btn btn-secondary" id="cancelAddBtn" data-i18n="modal.addMemory.cancel">Cancel</button>
1164 |                     <button class="btn btn-primary" id="saveMemoryBtn" data-i18n="modal.addMemory.save">Save Memory</button>
1165 |                 </div>
1166 |             </div>
1167 |         </div>
1168 | 
1169 |         <!-- Settings Modal -->
1170 |         <div id="settingsModal" class="modal-overlay">
1171 |             <div class="modal-content">
1172 |                 <div class="modal-header">
1173 |                     <h3 data-i18n="modal.settings.title">Settings</h3>
1174 |                     <button class="modal-close" aria-label="Close">
1175 |                         <svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
1176 |                             <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
1177 |                         </svg>
1178 |                     </button>
1179 |                 </div>
1180 |                 <div class="modal-body">
1181 |                     <form id="settingsForm">
1182 |                         <h4 class="settings-section-heading" data-i18n="modal.settings.preferences">Preferences</h4>
1183 |                         <div class="form-group">
1184 |                             <label for="themeSelect" data-i18n="modal.settings.theme">Theme</label>
1185 |                             <select id="themeSelect">
1186 |                                 <option value="light" data-i18n="modal.settings.themeLight">Light</option>
1187 |                                 <option value="dark" data-i18n="modal.settings.themeDark">Dark</option>
1188 |                             </select>
1189 |                         </div>
1190 |                         <div class="form-group">
1191 |                             <label for="viewDensity" data-i18n="modal.settings.viewDensity">View Density</label>
1192 |                             <select id="viewDensity">
1193 |                                 <option value="comfortable" data-i18n="modal.settings.viewDensityComfortable">Comfortable</option>
1194 |                                 <option value="compact" data-i18n="modal.settings.viewDensityCompact">Compact</option>
1195 |                             </select>
1196 |                         </div>
1197 |                         <div class="form-group">
1198 |                             <label for="previewLines" data-i18n="modal.settings.previewLines">Memory Preview Lines</label>
1199 |                             <input type="number" id="previewLines" min="1" max="10" value="3">
1200 |                         </div>
1201 | 
1202 |                         <hr class="settings-divider">
1203 | 
1204 |                         <h4 class="settings-section-heading" style="margin-bottom: var(--space-4);" data-i18n="modal.settings.systemInfo">System Information</h4>
1205 |                         <div class="system-info">
1206 |                             <div class="info-row">
1207 |                                 <span class="info-label" data-i18n="modal.settings.version">Version:</span>
1208 |                                 <span class="info-value" id="settingsVersion" data-i18n="status.loading">Loading...</span>
1209 |                             </div>
1210 |                             <div class="info-row">
1211 |                                 <span class="info-label" data-i18n="modal.settings.storageBackend">Storage Backend:</span>
1212 |                                 <span class="info-value" id="settingsBackend" data-i18n="status.loading">Loading...</span>
1213 |                             </div>
1214 |                             <div class="info-row">
1215 |                                 <span class="info-label" data-i18n="modal.settings.primaryBackend">Primary Backend:</span>
1216 |                                 <span class="info-value" id="settingsPrimaryBackend" data-i18n="status.loading">Loading...</span>
1217 |                             </div>
1218 |                             <div class="info-row">
1219 |                                 <span class="info-label" data-i18n="modal.settings.embeddingModel">Embedding Model:</span>
1220 |                                 <span class="info-value" id="settingsEmbeddingModel" data-i18n="status.loading">Loading...</span>
1221 |                             </div>
1222 |                             <div class="info-row">
1223 |                                 <span class="info-label" data-i18n="modal.settings.embeddingDimensions">Embedding Dimensions:</span>
1224 |                                 <span class="info-value" id="settingsEmbeddingDim" data-i18n="status.loading">Loading...</span>
1225 |                             </div>
1226 |                             <div class="info-row">
1227 |                                 <span class="info-label" data-i18n="modal.settings.databaseSize">Database Size:</span>
1228 |                                 <span class="info-value" id="settingsDbSize" data-i18n="status.loading">Loading...</span>
1229 |                             </div>
1230 |                             <div class="info-row">
1231 |                                 <span class="info-label" data-i18n="modal.settings.totalMemories">Total Memories:</span>
1232 |                                 <span class="info-value" id="settingsTotalMemories" data-i18n="status.loading">Loading...</span>
1233 |                             </div>
1234 |                             <div class="info-row">
1235 |                                 <span class="info-label" data-i18n="modal.settings.uptime">Uptime:</span>
1236 |                                 <span class="info-value" id="settingsUptime" data-i18n="status.loading">Loading...</span>
1237 |                             </div>
1238 |                         </div>
1239 | 
1240 |                         <hr class="settings-divider">
1241 | 
1242 |                         <h4 class="settings-section-heading" data-i18n="modal.settings.qualitySystem">Quality System</h4>
1243 |                         <div class="quality-settings">
1244 |                             <!-- AI Provider Selection -->
1245 |                             <div class="setting-item">
1246 |                                 <label for="quality-provider" data-i18n="settings.quality.provider.label">
1247 |                                     AI Provider
1248 |                                 </label>
1249 |                                 <select id="quality-provider" class="form-select">
1250 |                                     <option value="local" data-i18n="settings.quality.provider.local">
1251 |                                         Local SLM (Privacy Mode)
1252 |                                     </option>
1253 |                                     <option value="groq" data-i18n="settings.quality.provider.groq">
1254 |                                         Groq API
1255 |                                     </option>
1256 |                                     <option value="gemini" data-i18n="settings.quality.provider.gemini">
1257 |                                         Gemini API
1258 |                                     </option>
1259 |                                     <option value="auto" data-i18n="settings.quality.provider.auto">
1260 |                                         Auto (All Available)
1261 |                                     </option>
1262 |                                     <option value="none" data-i18n="settings.quality.provider.none">
1263 |                                         Implicit Only (No AI)
1264 |                                     </option>
1265 |                                 </select>
1266 |                                 <small class="form-text" data-i18n="settings.quality.provider.help">
1267 |                                     Local SLM provides zero-cost, privacy-preserving quality scoring
1268 |                                 </small>
1269 |                             </div>
1270 | 
1271 |                             <!-- Quality Boost Toggle -->
1272 |                             <div class="setting-item">
1273 |                                 <label class="checkbox-label">
1274 |                                     <input type="checkbox" id="quality-boost-enabled" checked>
1275 |                                     <span data-i18n="settings.quality.boost.label">
1276 |                                         Enable Quality-Boosted Search
1277 |                                     </span>
1278 |                                 </label>
1279 |                                 <small class="form-text" data-i18n="settings.quality.boost.help">
1280 |                                     Rerank search results to prioritize high-quality memories
1281 |                                 </small>
1282 |                             </div>
1283 | 
1284 |                             <!-- Current Provider Info -->
1285 |                             <div class="setting-info">
1286 |                                 <div data-i18n="settings.quality.current.label">Current Provider:</div>
1287 |                                 <div id="current-provider-info" class="info-value">
1288 |                                     <strong>Local SLM</strong> (ms-marco-MiniLM-L-6-v2)
1289 |                                     <br>
1290 |                                     <span class="text-muted">Zero cost • Full privacy • 50-100ms latency</span>
1291 |                                 </div>
1292 |                             </div>
1293 |                         </div>
1294 | 
1295 |                         <hr class="settings-divider">
1296 | 
1297 |                         <h4 class="settings-section-heading" data-i18n="modal.settings.backupRestore">Backup & Restore</h4>
1298 |                         <div class="backup-settings">
1299 |                             <div class="info-row">
1300 |                                 <span class="info-label" data-i18n="modal.settings.lastBackup">Last Backup:</span>
1301 |                                 <span class="info-value" id="settingsLastBackup" data-i18n="modal.settings.never">Never</span>
1302 |                             </div>
1303 |                             <div class="info-row">
1304 |                                 <span class="info-label" data-i18n="modal.settings.backupCount">Backup Count:</span>
1305 |                                 <span class="info-value" id="settingsBackupCount">0</span>
1306 |                             </div>
1307 |                             <div class="info-row">
1308 |                                 <span class="info-label" data-i18n="modal.settings.nextScheduled">Next Scheduled:</span>
1309 |                                 <span class="info-value" id="settingsNextBackup">-</span>
1310 |                             </div>
1311 |                             <div class="backup-actions">
1312 |                                 <button id="backupNowButton" class="btn btn-sm btn-primary" data-i18n="modal.settings.backupNow">Create Backup Now</button>
1313 |                                 <button id="viewBackupsButton" class="btn btn-sm btn-secondary" data-i18n="modal.settings.viewBackups">View Backups</button>
1314 |                             </div>
1315 |                         </div>
1316 |                     </form>
1317 |                 </div>
1318 |                 <div class="modal-footer">
1319 |                     <button class="btn btn-secondary" id="cancelSettingsBtn" data-i18n="modal.settings.cancel">Cancel</button>
1320 |                     <button class="btn btn-primary" id="saveSettingsBtn" data-i18n="modal.settings.save">Save Settings</button>
1321 |                 </div>
1322 |             </div>
1323 |         </div>
1324 | 
1325 |         <!-- Loading Overlay -->
1326 |         <div id="loadingOverlay" class="loading-overlay">
1327 |             <div class="loading-spinner"></div>
1328 |             <p data-i18n="status.loading">Loading...</p>
1329 |         </div>
1330 | 
1331 |         <!-- Toast Notifications -->
1332 |         <div id="toastContainer" class="toast-container"></div>
1333 |     </div>
1334 | 
1335 |     <!-- Connection Status Indicator -->
1336 |     <div id="connectionStatus" class="connection-status">
1337 |         <div class="status-indicator"></div>
1338 |         <span class="status-text" data-i18n="status.connected">Connected</span>
1339 |     </div>
1340 | 
1341 |     <!-- Memory Viewer Modal -->
1342 |     <div id="memoryViewerModal" class="modal" style="display: none;">
1343 |         <div class="modal-content memory-viewer-content">
1344 |             <div class="modal-header">
1345 |                 <h2 data-i18n="modal.memoryViewer.title">📝 Document Memory Chunks</h2>
1346 |                 <button class="modal-close" data-action="closeMemoryViewer">&times;</button>
1347 |             </div>
1348 |             <div class="modal-body">
1349 |                 <div class="document-info">
1350 |                     <h3 id="memoryViewerFilename" data-i18n="status.loading">Loading...</h3>
1351 |                     <p id="memoryViewerStats" class="text-muted">0 chunks found</p>
1352 |                 </div>
1353 |                 <div class="memory-chunks-container">
1354 |                     <div id="memoryChunksList" class="memory-chunks-list">
1355 |                         <!-- Chunks will be populated here -->
1356 |                     </div>
1357 |                 </div>
1358 |             </div>
1359 |             <div class="modal-footer">
1360 |                 <button class="btn btn-secondary" data-action="closeMemoryViewer" data-i18n="modal.memoryViewer.close">Close</button>
1361 |             </div>
1362 |         </div>
1363 |     </div>
1364 | 
1365 |     <script src="/static/app.js?v=8.62.14-I18N-FIX"></script>
1366 |     <link rel="stylesheet" href="/static/style.css?v=8.27.2-TOAST-AND-ICON">
1367 | </body>
1368 | </html>
1369 | 
```
Page 55/62FirstPrevNextLast