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">×</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 |
```