memento-mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/cache-management.mdc +171 -0
- package/.cursor/rules/database-schema.mdc +344 -0
- package/.cursor/rules/deployment.mdc +596 -0
- package/.cursor/rules/error-logging.mdc +298 -0
- package/.cursor/rules/forgetting-algorithms.mdc +426 -0
- package/.cursor/rules/http-server.mdc +432 -0
- package/.cursor/rules/hybrid-search.mdc +424 -0
- package/.cursor/rules/implementation.mdc +369 -0
- package/.cursor/rules/lightweight-embedding.mdc +178 -0
- package/.cursor/rules/mcp-client-development.mdc +0 -0
- package/.cursor/rules/mcp-server-development.mdc +0 -0
- package/.cursor/rules/mcp-tools-architecture.mdc +205 -0
- package/.cursor/rules/memento-memory-rule.mdc +8 -0
- package/.cursor/rules/memento-project-overview.mdc +0 -0
- package/.cursor/rules/memory-algorithms.mdc +502 -0
- package/.cursor/rules/monitoring.mdc +622 -0
- package/.cursor/rules/performance-alerts.mdc +537 -0
- package/.cursor/rules/performance-monitoring.mdc +345 -0
- package/.cursor/rules/performance-optimization.mdc +563 -0
- package/.cursor/rules/project-structure.mdc +310 -0
- package/.cursor/rules/testing.mdc +473 -0
- package/.dockerignore +15 -0
- package/.eslintrc.json +34 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +51 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
- package/.github/ISSUE_TEMPLATE/question.md +31 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +97 -0
- package/AGENTS.md +28 -0
- package/CHANGELOG.md +416 -0
- package/CODE_OF_CONDUCT.md +62 -0
- package/CONTRIBUTING.md +165 -0
- package/DOCKER_SETUP_GUIDE.md +84 -0
- package/Dockerfile +90 -0
- package/INSTALL.en.md +303 -0
- package/INSTALL.md +303 -0
- package/README.en.md +330 -0
- package/README.md +427 -0
- package/backup/legacy-removal-20250930-201816/http-server-legacy.ts +1068 -0
- package/backup/legacy-removal-20250930-201816/rollback-to-legacy.ps1 +46 -0
- package/backup/legacy-removal-20250930-201816/rollback-to-legacy.sh +48 -0
- package/dist/algorithms/forgetting-algorithm.d.ts +90 -0
- package/dist/algorithms/forgetting-algorithm.d.ts.map +1 -0
- package/dist/algorithms/forgetting-algorithm.js +160 -0
- package/dist/algorithms/forgetting-algorithm.js.map +1 -0
- package/dist/algorithms/hybrid-search-engine.d.ts +108 -0
- package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -0
- package/dist/algorithms/hybrid-search-engine.js +384 -0
- package/dist/algorithms/hybrid-search-engine.js.map +1 -0
- package/dist/algorithms/search-engine.d.ts +64 -0
- package/dist/algorithms/search-engine.d.ts.map +1 -0
- package/dist/algorithms/search-engine.js +304 -0
- package/dist/algorithms/search-engine.js.map +1 -0
- package/dist/algorithms/search-ranking.d.ts +145 -0
- package/dist/algorithms/search-ranking.d.ts.map +1 -0
- package/dist/algorithms/search-ranking.js +311 -0
- package/dist/algorithms/search-ranking.js.map +1 -0
- package/dist/algorithms/spaced-repetition.d.ts +83 -0
- package/dist/algorithms/spaced-repetition.d.ts.map +1 -0
- package/dist/algorithms/spaced-repetition.js +153 -0
- package/dist/algorithms/spaced-repetition.js.map +1 -0
- package/dist/algorithms/vector-search-engine.d.ts +96 -0
- package/dist/algorithms/vector-search-engine.d.ts.map +1 -0
- package/dist/algorithms/vector-search-engine.js +410 -0
- package/dist/algorithms/vector-search-engine.js.map +1 -0
- package/dist/client/index.d.ts +55 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +179 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/index.d.ts +20 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +87 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/init.d.ts +7 -0
- package/dist/database/init.d.ts.map +1 -0
- package/dist/database/init.js +117 -0
- package/dist/database/init.js.map +1 -0
- package/dist/database/migrate.d.ts +6 -0
- package/dist/database/migrate.d.ts.map +1 -0
- package/dist/database/migrate.js +84 -0
- package/dist/database/migrate.js.map +1 -0
- package/dist/database/schema.sql +159 -0
- package/dist/npm-client/context-injector.d.ts +106 -0
- package/dist/npm-client/context-injector.d.ts.map +1 -0
- package/dist/npm-client/context-injector.js +296 -0
- package/dist/npm-client/context-injector.js.map +1 -0
- package/dist/npm-client/index.d.ts +42 -0
- package/dist/npm-client/index.d.ts.map +1 -0
- package/dist/npm-client/index.js +43 -0
- package/dist/npm-client/index.js.map +1 -0
- package/dist/npm-client/memento-client.d.ts +114 -0
- package/dist/npm-client/memento-client.d.ts.map +1 -0
- package/dist/npm-client/memento-client.js +391 -0
- package/dist/npm-client/memento-client.js.map +1 -0
- package/dist/npm-client/memory-manager.d.ts +137 -0
- package/dist/npm-client/memory-manager.d.ts.map +1 -0
- package/dist/npm-client/memory-manager.js +341 -0
- package/dist/npm-client/memory-manager.js.map +1 -0
- package/dist/npm-client/types.d.ts +216 -0
- package/dist/npm-client/types.d.ts.map +1 -0
- package/dist/npm-client/types.js +44 -0
- package/dist/npm-client/types.js.map +1 -0
- package/dist/npm-client/utils.d.ts +91 -0
- package/dist/npm-client/utils.d.ts.map +1 -0
- package/dist/npm-client/utils.js +351 -0
- package/dist/npm-client/utils.js.map +1 -0
- package/dist/scripts/copy-assets.d.ts +3 -0
- package/dist/scripts/copy-assets.d.ts.map +1 -0
- package/dist/scripts/copy-assets.js +31 -0
- package/dist/scripts/copy-assets.js.map +1 -0
- package/dist/server/http-server.d.ts +28 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +930 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index-backup.d.ts +5 -0
- package/dist/server/index-backup.d.ts.map +1 -0
- package/dist/server/index-backup.js +793 -0
- package/dist/server/index-backup.js.map +1 -0
- package/dist/server/index-refactored.d.ts +6 -0
- package/dist/server/index-refactored.d.ts.map +1 -0
- package/dist/server/index-refactored.js +206 -0
- package/dist/server/index-refactored.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +301 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/simple-mcp-server.d.ts +8 -0
- package/dist/server/simple-mcp-server.d.ts.map +1 -0
- package/dist/server/simple-mcp-server.js +152 -0
- package/dist/server/simple-mcp-server.js.map +1 -0
- package/dist/services/async-optimizer.d.ts +136 -0
- package/dist/services/async-optimizer.d.ts.map +1 -0
- package/dist/services/async-optimizer.js +406 -0
- package/dist/services/async-optimizer.js.map +1 -0
- package/dist/services/batch-scheduler.d.ts +156 -0
- package/dist/services/batch-scheduler.d.ts.map +1 -0
- package/dist/services/batch-scheduler.js +612 -0
- package/dist/services/batch-scheduler.js.map +1 -0
- package/dist/services/cache-service.d.ts +168 -0
- package/dist/services/cache-service.d.ts.map +1 -0
- package/dist/services/cache-service.js +360 -0
- package/dist/services/cache-service.js.map +1 -0
- package/dist/services/database-optimizer.d.ts +110 -0
- package/dist/services/database-optimizer.d.ts.map +1 -0
- package/dist/services/database-optimizer.js +369 -0
- package/dist/services/database-optimizer.js.map +1 -0
- package/dist/services/embedding-provider-factory.d.ts +62 -0
- package/dist/services/embedding-provider-factory.d.ts.map +1 -0
- package/dist/services/embedding-provider-factory.js +152 -0
- package/dist/services/embedding-provider-factory.js.map +1 -0
- package/dist/services/embedding-service.d.ts +95 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +276 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/error-logging-service.d.ts +134 -0
- package/dist/services/error-logging-service.d.ts.map +1 -0
- package/dist/services/error-logging-service.js +271 -0
- package/dist/services/error-logging-service.js.map +1 -0
- package/dist/services/forgetting-policy-service.d.ts +94 -0
- package/dist/services/forgetting-policy-service.d.ts.map +1 -0
- package/dist/services/forgetting-policy-service.js +233 -0
- package/dist/services/forgetting-policy-service.js.map +1 -0
- package/dist/services/gemini-embedding-service.d.ts +82 -0
- package/dist/services/gemini-embedding-service.d.ts.map +1 -0
- package/dist/services/gemini-embedding-service.js +232 -0
- package/dist/services/gemini-embedding-service.js.map +1 -0
- package/dist/services/lightweight-embedding-service.d.ts +95 -0
- package/dist/services/lightweight-embedding-service.d.ts.map +1 -0
- package/dist/services/lightweight-embedding-service.js +263 -0
- package/dist/services/lightweight-embedding-service.js.map +1 -0
- package/dist/services/memory-embedding-service.d.ts +69 -0
- package/dist/services/memory-embedding-service.d.ts.map +1 -0
- package/dist/services/memory-embedding-service.js +223 -0
- package/dist/services/memory-embedding-service.js.map +1 -0
- package/dist/services/minilm-embedding-service.d.ts +92 -0
- package/dist/services/minilm-embedding-service.d.ts.map +1 -0
- package/dist/services/minilm-embedding-service.js +216 -0
- package/dist/services/minilm-embedding-service.js.map +1 -0
- package/dist/services/performance-alert-service.d.ts +142 -0
- package/dist/services/performance-alert-service.d.ts.map +1 -0
- package/dist/services/performance-alert-service.js +366 -0
- package/dist/services/performance-alert-service.js.map +1 -0
- package/dist/services/performance-monitor.d.ts +144 -0
- package/dist/services/performance-monitor.d.ts.map +1 -0
- package/dist/services/performance-monitor.js +416 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/performance-monitoring-integration.d.ts +77 -0
- package/dist/services/performance-monitoring-integration.d.ts.map +1 -0
- package/dist/services/performance-monitoring-integration.js +177 -0
- package/dist/services/performance-monitoring-integration.js.map +1 -0
- package/dist/services/unified-embedding-service.d.ts +75 -0
- package/dist/services/unified-embedding-service.d.ts.map +1 -0
- package/dist/services/unified-embedding-service.js +211 -0
- package/dist/services/unified-embedding-service.js.map +1 -0
- package/dist/test/debug-http-v2.d.ts +5 -0
- package/dist/test/debug-http-v2.d.ts.map +1 -0
- package/dist/test/debug-http-v2.js +28 -0
- package/dist/test/debug-http-v2.js.map +1 -0
- package/dist/test/performance-benchmark.d.ts +57 -0
- package/dist/test/performance-benchmark.d.ts.map +1 -0
- package/dist/test/performance-benchmark.js +427 -0
- package/dist/test/performance-benchmark.js.map +1 -0
- package/dist/test/test-alerts-direct.d.ts +7 -0
- package/dist/test/test-alerts-direct.d.ts.map +1 -0
- package/dist/test/test-alerts-direct.js +101 -0
- package/dist/test/test-alerts-direct.js.map +1 -0
- package/dist/test/test-batch-scheduler.d.ts +2 -0
- package/dist/test/test-batch-scheduler.d.ts.map +1 -0
- package/dist/test/test-batch-scheduler.js +156 -0
- package/dist/test/test-batch-scheduler.js.map +1 -0
- package/dist/test/test-client.d.ts +5 -0
- package/dist/test/test-client.d.ts.map +1 -0
- package/dist/test/test-client.js +86 -0
- package/dist/test/test-client.js.map +1 -0
- package/dist/test/test-embedding.d.ts +6 -0
- package/dist/test/test-embedding.d.ts.map +1 -0
- package/dist/test/test-embedding.js +142 -0
- package/dist/test/test-embedding.js.map +1 -0
- package/dist/test/test-error-logging.d.ts +7 -0
- package/dist/test/test-error-logging.d.ts.map +1 -0
- package/dist/test/test-error-logging.js +105 -0
- package/dist/test/test-error-logging.js.map +1 -0
- package/dist/test/test-forgetting.d.ts +6 -0
- package/dist/test/test-forgetting.d.ts.map +1 -0
- package/dist/test/test-forgetting.js +154 -0
- package/dist/test/test-forgetting.js.map +1 -0
- package/dist/test/test-gemini-embedding.d.ts +7 -0
- package/dist/test/test-gemini-embedding.d.ts.map +1 -0
- package/dist/test/test-gemini-embedding.js +134 -0
- package/dist/test/test-gemini-embedding.js.map +1 -0
- package/dist/test/test-http-server-v2-simple.d.ts +6 -0
- package/dist/test/test-http-server-v2-simple.d.ts.map +1 -0
- package/dist/test/test-http-server-v2-simple.js +131 -0
- package/dist/test/test-http-server-v2-simple.js.map +1 -0
- package/dist/test/test-http-server-v2.d.ts +7 -0
- package/dist/test/test-http-server-v2.d.ts.map +1 -0
- package/dist/test/test-http-server-v2.js +529 -0
- package/dist/test/test-http-server-v2.js.map +1 -0
- package/dist/test/test-lightweight-embedding.d.ts +6 -0
- package/dist/test/test-lightweight-embedding.d.ts.map +1 -0
- package/dist/test/test-lightweight-embedding.js +189 -0
- package/dist/test/test-lightweight-embedding.js.map +1 -0
- package/dist/test/test-m1-completion.d.ts +7 -0
- package/dist/test/test-m1-completion.d.ts.map +1 -0
- package/dist/test/test-m1-completion.js +124 -0
- package/dist/test/test-m1-completion.js.map +1 -0
- package/dist/test/test-memory-injection-prompt.d.ts +2 -0
- package/dist/test/test-memory-injection-prompt.d.ts.map +1 -0
- package/dist/test/test-memory-injection-prompt.js +299 -0
- package/dist/test/test-memory-injection-prompt.js.map +1 -0
- package/dist/test/test-performance-alerts.d.ts +7 -0
- package/dist/test/test-performance-alerts.d.ts.map +1 -0
- package/dist/test/test-performance-alerts.js +109 -0
- package/dist/test/test-performance-alerts.js.map +1 -0
- package/dist/test/test-performance-monitor.d.ts +2 -0
- package/dist/test/test-performance-monitor.d.ts.map +1 -0
- package/dist/test/test-performance-monitor.js +182 -0
- package/dist/test/test-performance-monitor.js.map +1 -0
- package/dist/test/test-performance-monitoring.d.ts +6 -0
- package/dist/test/test-performance-monitoring.d.ts.map +1 -0
- package/dist/test/test-performance-monitoring.js +156 -0
- package/dist/test/test-performance-monitoring.js.map +1 -0
- package/dist/test/test-search.d.ts +5 -0
- package/dist/test/test-search.d.ts.map +1 -0
- package/dist/test/test-search.js +141 -0
- package/dist/test/test-search.js.map +1 -0
- package/dist/test/test-simple-alerts.d.ts +6 -0
- package/dist/test/test-simple-alerts.d.ts.map +1 -0
- package/dist/test/test-simple-alerts.js +106 -0
- package/dist/test/test-simple-alerts.js.map +1 -0
- package/dist/test/test-vector-search-engine.d.ts +2 -0
- package/dist/test/test-vector-search-engine.d.ts.map +1 -0
- package/dist/test/test-vector-search-engine.js +225 -0
- package/dist/test/test-vector-search-engine.js.map +1 -0
- package/dist/tools/base-tool.d.ts +64 -0
- package/dist/tools/base-tool.d.ts.map +1 -0
- package/dist/tools/base-tool.js +158 -0
- package/dist/tools/base-tool.js.map +1 -0
- package/dist/tools/cleanup-memory-tool.d.ts +10 -0
- package/dist/tools/cleanup-memory-tool.d.ts.map +1 -0
- package/dist/tools/cleanup-memory-tool.js +66 -0
- package/dist/tools/cleanup-memory-tool.js.map +1 -0
- package/dist/tools/database-optimize-tool.d.ts +10 -0
- package/dist/tools/database-optimize-tool.d.ts.map +1 -0
- package/dist/tools/database-optimize-tool.js +64 -0
- package/dist/tools/database-optimize-tool.js.map +1 -0
- package/dist/tools/error-stats.d.ts +93 -0
- package/dist/tools/error-stats.d.ts.map +1 -0
- package/dist/tools/error-stats.js +115 -0
- package/dist/tools/error-stats.js.map +1 -0
- package/dist/tools/forget-tool.d.ts +63 -0
- package/dist/tools/forget-tool.d.ts.map +1 -0
- package/dist/tools/forget-tool.js +340 -0
- package/dist/tools/forget-tool.js.map +1 -0
- package/dist/tools/forgetting-stats-tool.d.ts +10 -0
- package/dist/tools/forgetting-stats-tool.d.ts.map +1 -0
- package/dist/tools/forgetting-stats-tool.js +37 -0
- package/dist/tools/forgetting-stats-tool.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +55 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-injection-prompt.d.ts +31 -0
- package/dist/tools/memory-injection-prompt.d.ts.map +1 -0
- package/dist/tools/memory-injection-prompt.js +203 -0
- package/dist/tools/memory-injection-prompt.js.map +1 -0
- package/dist/tools/performance-alerts.d.ts +127 -0
- package/dist/tools/performance-alerts.d.ts.map +1 -0
- package/dist/tools/performance-alerts.js +208 -0
- package/dist/tools/performance-alerts.js.map +1 -0
- package/dist/tools/performance-stats-tool.d.ts +10 -0
- package/dist/tools/performance-stats-tool.d.ts.map +1 -0
- package/dist/tools/performance-stats-tool.js +38 -0
- package/dist/tools/performance-stats-tool.js.map +1 -0
- package/dist/tools/pin-tool.d.ts +39 -0
- package/dist/tools/pin-tool.d.ts.map +1 -0
- package/dist/tools/pin-tool.js +211 -0
- package/dist/tools/pin-tool.js.map +1 -0
- package/dist/tools/recall-tool.d.ts +27 -0
- package/dist/tools/recall-tool.d.ts.map +1 -0
- package/dist/tools/recall-tool.js +335 -0
- package/dist/tools/recall-tool.js.map +1 -0
- package/dist/tools/remember-tool.d.ts +10 -0
- package/dist/tools/remember-tool.d.ts.map +1 -0
- package/dist/tools/remember-tool.js +101 -0
- package/dist/tools/remember-tool.js.map +1 -0
- package/dist/tools/resolve-error.d.ts +54 -0
- package/dist/tools/resolve-error.d.ts.map +1 -0
- package/dist/tools/resolve-error.js +63 -0
- package/dist/tools/resolve-error.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +134 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +337 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/types.d.ts +56 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +23 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/unpin-tool.d.ts +43 -0
- package/dist/tools/unpin-tool.d.ts.map +1 -0
- package/dist/tools/unpin-tool.js +233 -0
- package/dist/tools/unpin-tool.js.map +1 -0
- package/dist/types/embedding.types.d.ts +65 -0
- package/dist/types/embedding.types.d.ts.map +1 -0
- package/dist/types/embedding.types.js +6 -0
- package/dist/types/embedding.types.js.map +1 -0
- package/dist/types/index.d.ts +103 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/database.d.ts +62 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +399 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/stopwords.d.ts +18 -0
- package/dist/utils/stopwords.d.ts.map +1 -0
- package/dist/utils/stopwords.js +117 -0
- package/dist/utils/stopwords.js.map +1 -0
- package/docker-compose.dev.yml +50 -0
- package/docker-compose.prod.yml +77 -0
- package/docker-compose.yml +43 -0
- package/docs/en/Memento-Goals.md +217 -0
- package/docs/en/Memento-M1-DetailSpecs.md +130 -0
- package/docs/en/Memento-Milestones.md +135 -0
- package/docs/en/Search-Ranking-Memory-Decay-Formulas.md +177 -0
- package/docs/en/api-reference.md +658 -0
- package/docs/en/architecture.md +1302 -0
- package/docs/en/developer-guide.md +1005 -0
- package/docs/en/user-manual.md +595 -0
- package/docs/ko/Memento-Goals.md +217 -0
- package/docs/ko/Memento-M1-DetailSpecs.md +130 -0
- package/docs/ko/Memento-Milestones.md +134 -0
- package/docs/ko/Search-Ranking-Memory-Decay-Formulas.md +177 -0
- package/docs/ko/api-reference.md +658 -0
- package/docs/ko/architecture.md +1302 -0
- package/docs/ko/developer-guide.md +1006 -0
- package/docs/ko/embedding-api-reference.md +122 -0
- package/docs/ko/embedding-configuration.md +62 -0
- package/docs/ko/embedding-performance-benchmark.md +62 -0
- package/docs/ko/embedding-service-guide.md +314 -0
- package/docs/ko/user-manual.md +595 -0
- package/env.example +49 -0
- package/install.sh +191 -0
- package/mcp-http-client.js +218 -0
- package/mcp.json +0 -0
- package/package.json +125 -0
- package/packages/mcp-client/docs/API-REFERENCE.md +560 -0
- package/packages/mcp-client/docs/BEST-PRACTICES.md +564 -0
- package/packages/mcp-client/docs/MIGRATION-GUIDE.md +344 -0
- package/packages/mcp-client/docs/PERFORMANCE-GUIDE.md +476 -0
- package/packages/mcp-client/docs/TROUBLESHOOTING.md +564 -0
- package/packages/mcp-client/package-lock.json +907 -0
- package/packages/mcp-client/package.json +58 -0
- package/packages/mcp-client/performance-optimizer.js +428 -0
- package/packages/mcp-client/test-basic.js +65 -0
- package/packages/mcp-client/test-integration.js +366 -0
- package/scripts/auto-setup.js +234 -0
- package/scripts/backup-daily.bat +28 -0
- package/scripts/backup-embeddings.js +108 -0
- package/scripts/check-db-integrity.js +93 -0
- package/scripts/debug-embeddings.js +184 -0
- package/scripts/direct-sql-migration.sql +36 -0
- package/scripts/docker-migration.sh +105 -0
- package/scripts/fix-migration.js +93 -0
- package/scripts/fix-vector-dimensions.js +206 -0
- package/scripts/migrate-embedding-data.js +307 -0
- package/scripts/regenerate-embeddings.js +144 -0
- package/scripts/restore-legacy.ps1 +60 -0
- package/scripts/restore-legacy.sh +62 -0
- package/scripts/run-migration.js +122 -0
- package/scripts/safe-migration.js +150 -0
- package/scripts/simple-migrate.js +41 -0
- package/scripts/simple-update.js +123 -0
- package/scripts/start-container.sh +10 -0
- package/src/algorithms/forgetting-algorithm.spec.ts +538 -0
- package/src/algorithms/forgetting-algorithm.ts +243 -0
- package/src/algorithms/hybrid-search-engine.spec.ts +484 -0
- package/src/algorithms/hybrid-search-engine.ts +489 -0
- package/src/algorithms/search-engine.spec.ts +429 -0
- package/src/algorithms/search-engine.ts +392 -0
- package/src/algorithms/search-ranking.spec.ts +293 -0
- package/src/algorithms/search-ranking.ts +407 -0
- package/src/algorithms/spaced-repetition.spec.ts +510 -0
- package/src/algorithms/spaced-repetition.ts +238 -0
- package/src/algorithms/vector-search-engine.ts +505 -0
- package/src/client/index.spec.ts +427 -0
- package/src/client/index.ts +222 -0
- package/src/config/index.spec.ts +339 -0
- package/src/config/index.ts +106 -0
- package/src/database/init.spec.ts +239 -0
- package/src/database/init.ts +130 -0
- package/src/database/migrate.spec.ts +293 -0
- package/src/database/migrate.ts +94 -0
- package/src/database/migrations/001_add_embedding_metadata.sql +29 -0
- package/src/database/schema.sql +159 -0
- package/src/npm-client/context-injector.spec.ts +335 -0
- package/src/npm-client/context-injector.ts +412 -0
- package/src/npm-client/index.spec.ts +108 -0
- package/src/npm-client/index.ts +96 -0
- package/src/npm-client/memento-client.spec.ts +549 -0
- package/src/npm-client/memento-client.ts +501 -0
- package/src/npm-client/memory-manager.spec.ts +374 -0
- package/src/npm-client/memory-manager.ts +414 -0
- package/src/npm-client/types.spec.ts +427 -0
- package/src/npm-client/types.ts +296 -0
- package/src/npm-client/utils.spec.ts +355 -0
- package/src/npm-client/utils.ts +423 -0
- package/src/scripts/copy-assets.js +37 -0
- package/src/server/http-server.spec.ts +648 -0
- package/src/server/http-server.ts +1030 -0
- package/src/server/index-backup.ts +875 -0
- package/src/server/index-refactored.ts +237 -0
- package/src/server/index.spec.ts +281 -0
- package/src/server/index.ts +347 -0
- package/src/server/simple-mcp-server.spec.ts +207 -0
- package/src/server/simple-mcp-server.ts +173 -0
- package/src/services/async-optimizer.spec.ts +569 -0
- package/src/services/async-optimizer.ts +484 -0
- package/src/services/batch-scheduler.ts +759 -0
- package/src/services/cache-service.spec.ts +372 -0
- package/src/services/cache-service.ts +434 -0
- package/src/services/database-optimizer.spec.ts +344 -0
- package/src/services/database-optimizer.ts +450 -0
- package/src/services/embedding-provider-factory.ts +173 -0
- package/src/services/embedding-service.spec.ts +342 -0
- package/src/services/embedding-service.ts +333 -0
- package/src/services/error-logging-service.spec.ts +416 -0
- package/src/services/error-logging-service.ts +383 -0
- package/src/services/forgetting-policy-service.spec.ts +140 -0
- package/src/services/forgetting-policy-service.ts +334 -0
- package/src/services/gemini-embedding-service.spec.ts +463 -0
- package/src/services/gemini-embedding-service.ts +283 -0
- package/src/services/lightweight-embedding-service.spec.ts +458 -0
- package/src/services/lightweight-embedding-service.ts +324 -0
- package/src/services/memory-embedding-service.spec.ts +417 -0
- package/src/services/memory-embedding-service.ts +289 -0
- package/src/services/minilm-embedding-service.spec.ts +104 -0
- package/src/services/minilm-embedding-service.ts +262 -0
- package/src/services/performance-alert-service.spec.ts +517 -0
- package/src/services/performance-alert-service.ts +477 -0
- package/src/services/performance-monitor.spec.ts +401 -0
- package/src/services/performance-monitor.ts +532 -0
- package/src/services/performance-monitoring-integration.spec.ts +478 -0
- package/src/services/performance-monitoring-integration.ts.bak +276 -0
- package/src/services/unified-embedding-service.spec.ts +224 -0
- package/src/services/unified-embedding-service.ts +255 -0
- package/src/test/debug-http-v2.ts +30 -0
- package/src/test/embedding-integration-test.spec.ts +295 -0
- package/src/test/embedding-integration-test.ts +295 -0
- package/src/test/embedding-performance-benchmark.spec.ts +354 -0
- package/src/test/embedding-performance-benchmark.ts +312 -0
- package/src/test/performance-benchmark.ts +565 -0
- package/src/test/test-alerts-direct.ts +136 -0
- package/src/test/test-batch-scheduler-simple.spec.ts +122 -0
- package/src/test/test-batch-scheduler.spec.ts +453 -0
- package/src/test/test-batch-scheduler.ts +182 -0
- package/src/test/test-client.ts +97 -0
- package/src/test/test-embedding.ts +153 -0
- package/src/test/test-error-handling.spec.ts +575 -0
- package/src/test/test-error-logging.ts +117 -0
- package/src/test/test-forgetting.ts +162 -0
- package/src/test/test-gemini-embedding.ts +159 -0
- package/src/test/test-http-server-v2-simple.ts +147 -0
- package/src/test/test-http-server-v2.ts +586 -0
- package/src/test/test-hybrid-search-engine.spec.ts +521 -0
- package/src/test/test-integration-fixed.spec.ts +612 -0
- package/src/test/test-integration.spec.ts +463 -0
- package/src/test/test-lightweight-embedding.ts +208 -0
- package/src/test/test-m1-completion.spec.ts +614 -0
- package/src/test/test-m1-completion.ts +141 -0
- package/src/test/test-m1-integration.spec.ts +514 -0
- package/src/test/test-memory-injection-prompt.spec.ts +650 -0
- package/src/test/test-memory-injection-prompt.ts +391 -0
- package/src/test/test-performance-alerts.ts +125 -0
- package/src/test/test-performance-monitor-updates.spec.ts +490 -0
- package/src/test/test-performance-monitor.spec.ts +284 -0
- package/src/test/test-performance-monitor.ts +228 -0
- package/src/test/test-performance-monitoring.ts +171 -0
- package/src/test/test-search.ts +151 -0
- package/src/test/test-simple-alerts.ts +136 -0
- package/src/test/test-vector-search-engine.spec.ts +408 -0
- package/src/test/test-vector-search-engine.ts +303 -0
- package/src/tools/base-tool.ts +189 -0
- package/src/tools/cleanup-memory-tool.ts +77 -0
- package/src/tools/database-optimize-tool.ts +79 -0
- package/src/tools/error-stats.ts +119 -0
- package/src/tools/forget-tool.spec.ts +613 -0
- package/src/tools/forget-tool.ts +454 -0
- package/src/tools/forgetting-stats-tool.ts +47 -0
- package/src/tools/index.ts +71 -0
- package/src/tools/memory-injection-prompt.ts +257 -0
- package/src/tools/performance-alerts.ts +226 -0
- package/src/tools/performance-stats-tool.ts +48 -0
- package/src/tools/pin-tool.spec.ts +497 -0
- package/src/tools/pin-tool.ts +277 -0
- package/src/tools/recall-tool.spec.ts +475 -0
- package/src/tools/recall-tool.ts +389 -0
- package/src/tools/remember-tool.spec.ts +469 -0
- package/src/tools/remember-tool.ts +112 -0
- package/src/tools/resolve-error.ts +69 -0
- package/src/tools/tool-registry.ts +417 -0
- package/src/tools/types.ts +63 -0
- package/src/tools/unpin-tool.spec.ts +549 -0
- package/src/tools/unpin-tool.ts +306 -0
- package/src/types/embedding.types.ts +78 -0
- package/src/types/index.spec.ts +420 -0
- package/src/types/index.ts +117 -0
- package/src/utils/database.spec.ts +77 -0
- package/src/utils/database.ts +458 -0
- package/src/utils/stopwords.ts +128 -0
- package/start-docker-setup.bat +38 -0
- package/static/logo.png +0 -0
- package/static/memento_logo.svg +2 -0
- package/test-docker.js +103 -0
- package/tsconfig.json +46 -0
- package/vitest.config.ts +23 -0
|
@@ -0,0 +1,1302 @@
|
|
|
1
|
+
# Architecture Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Memento MCP Server is a system that manages AI Agent memory by mimicking human memory systems. This document provides detailed explanations of the overall system architecture, component interactions, and data flows.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [System Architecture](#system-architecture)
|
|
10
|
+
2. [Core Components](#core-components)
|
|
11
|
+
3. [Data Model](#data-model)
|
|
12
|
+
4. [Search System](#search-system)
|
|
13
|
+
5. [Forgetting System](#forgetting-system)
|
|
14
|
+
6. [Milestone-based Architecture](#milestone-based-architecture)
|
|
15
|
+
7. [Performance Considerations](#performance-considerations)
|
|
16
|
+
8. [Security Architecture](#security-architecture)
|
|
17
|
+
|
|
18
|
+
## System Architecture
|
|
19
|
+
|
|
20
|
+
### Overall Architecture Diagram
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
graph TB
|
|
24
|
+
subgraph "AI Agent Layer"
|
|
25
|
+
A[Claude Desktop] --> B[MCP Client]
|
|
26
|
+
C[ChatGPT] --> B
|
|
27
|
+
D[Cursor] --> B
|
|
28
|
+
E[Other AI Agents] --> B
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
subgraph "MCP Protocol Layer"
|
|
32
|
+
B --> F[MCP Memory Server]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
subgraph "Memory Management Layer"
|
|
36
|
+
F --> G[Memory Manager]
|
|
37
|
+
F --> H[Search Engine]
|
|
38
|
+
F --> I[Forgetting Policy]
|
|
39
|
+
F --> J[Spaced Review]
|
|
40
|
+
F --> K[Error Logging Service]
|
|
41
|
+
F --> L[Performance Alert Service]
|
|
42
|
+
F --> M[Performance Monitoring Integration]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
subgraph "Storage Layer"
|
|
46
|
+
G --> N[SQLite M1]
|
|
47
|
+
G --> O[PostgreSQL M3+]
|
|
48
|
+
H --> P[Vector Search]
|
|
49
|
+
H --> Q[Text Search]
|
|
50
|
+
I --> R[Memory Queue]
|
|
51
|
+
K --> S[Error Logs]
|
|
52
|
+
L --> T[Alert Logs]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
subgraph "Data Processing"
|
|
56
|
+
J --> U[Memory Consolidation]
|
|
57
|
+
I --> V[Memory Deletion]
|
|
58
|
+
U --> W[Memory Summary]
|
|
59
|
+
M --> X[Real-time Monitoring]
|
|
60
|
+
K --> Y[Error Analysis]
|
|
61
|
+
L --> Z[Alert Management]
|
|
62
|
+
end
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Layer Roles
|
|
66
|
+
|
|
67
|
+
#### 1. AI Agent Layer
|
|
68
|
+
- **Role**: Interact with memory system through MCP client
|
|
69
|
+
- **Components**: Claude Desktop, ChatGPT, Cursor, etc.
|
|
70
|
+
- **Features**: Various AI Agents use the same MCP protocol
|
|
71
|
+
|
|
72
|
+
#### 2. MCP Protocol Layer
|
|
73
|
+
- **Role**: Provide standardized communication protocol
|
|
74
|
+
- **Components**: MCP Memory Server
|
|
75
|
+
- **Features**: Provide functionality through Tools, Resources, Prompts
|
|
76
|
+
|
|
77
|
+
#### 3. Memory Management Layer
|
|
78
|
+
- **Role**: Memory creation, search, management, deletion, and system monitoring
|
|
79
|
+
- **Components**: Memory Manager, Search Engine, Forgetting Policy, Spaced Review, Error Logging Service, Performance Alert Service, Performance Monitoring Integration
|
|
80
|
+
- **Features**: Management mimicking human memory systems and real-time system monitoring
|
|
81
|
+
|
|
82
|
+
#### 4. Storage Layer
|
|
83
|
+
- **Role**: Permanent data storage and retrieval
|
|
84
|
+
- **Components**: SQLite/PostgreSQL, Vector Search, Text Search
|
|
85
|
+
- **Features**: Different storage systems used by milestone
|
|
86
|
+
|
|
87
|
+
## Core Components
|
|
88
|
+
|
|
89
|
+
### 1. MCP Memory Server
|
|
90
|
+
|
|
91
|
+
#### Structure
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
interface MCPServer {
|
|
95
|
+
// Tools
|
|
96
|
+
tools: {
|
|
97
|
+
remember: RememberTool;
|
|
98
|
+
recall: RecallTool;
|
|
99
|
+
pin: PinTool;
|
|
100
|
+
unpin: UnpinTool;
|
|
101
|
+
forget: ForgetTool;
|
|
102
|
+
summarize_thread: SummarizeThreadTool;
|
|
103
|
+
link: LinkTool;
|
|
104
|
+
export: ExportTool;
|
|
105
|
+
feedback: FeedbackTool;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Resources
|
|
109
|
+
resources: {
|
|
110
|
+
memory: MemoryResource;
|
|
111
|
+
search: SearchResource;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Prompts
|
|
115
|
+
prompts: {
|
|
116
|
+
memory_injection: MemoryInjectionPrompt;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### Key Features
|
|
122
|
+
|
|
123
|
+
- **Tool Processing**: Execute and respond to MCP Tools
|
|
124
|
+
- **Resource Provision**: Provide cached data
|
|
125
|
+
- **Prompt Generation**: Generate prompts for context injection
|
|
126
|
+
- **Authentication/Authorization**: User authentication and permission management (M2+)
|
|
127
|
+
|
|
128
|
+
### 2. Memory Manager
|
|
129
|
+
|
|
130
|
+
#### Structure
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
interface MemoryManager {
|
|
134
|
+
// Create memory
|
|
135
|
+
createMemory(params: CreateMemoryParams): Promise<MemoryItem>;
|
|
136
|
+
|
|
137
|
+
// Get memory
|
|
138
|
+
getMemory(id: string): Promise<MemoryItem | null>;
|
|
139
|
+
|
|
140
|
+
// Update memory
|
|
141
|
+
updateMemory(id: string, updates: Partial<MemoryItem>): Promise<MemoryItem>;
|
|
142
|
+
|
|
143
|
+
// Delete memory
|
|
144
|
+
deleteMemory(id: string, hard?: boolean): Promise<boolean>;
|
|
145
|
+
|
|
146
|
+
// Pin memory
|
|
147
|
+
pinMemory(id: string): Promise<boolean>;
|
|
148
|
+
unpinMemory(id: string): Promise<boolean>;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### Key Features
|
|
153
|
+
|
|
154
|
+
- **CRUD Operations**: Create, read, update, delete memories
|
|
155
|
+
- **Type Management**: Distinguish working, episodic, semantic, procedural memories
|
|
156
|
+
- **Metadata Management**: Manage tags, importance, source, etc.
|
|
157
|
+
- **Relationship Management**: Set and manage relationships between memories
|
|
158
|
+
|
|
159
|
+
### 3. Search Engine
|
|
160
|
+
|
|
161
|
+
#### Structure
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
interface SearchEngine {
|
|
165
|
+
// 2-stage search
|
|
166
|
+
search(query: string, filters?: SearchFilters): Promise<SearchResult>;
|
|
167
|
+
|
|
168
|
+
// Vector search
|
|
169
|
+
vectorSearch(query: string, limit: number): Promise<VectorSearchResult>;
|
|
170
|
+
|
|
171
|
+
// Keyword search
|
|
172
|
+
keywordSearch(query: string, filters?: SearchFilters): Promise<KeywordSearchResult>;
|
|
173
|
+
|
|
174
|
+
// Ranking calculation
|
|
175
|
+
calculateRanking(results: SearchResult[]): Promise<RankedResult[]>;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
#### Search Pipeline
|
|
180
|
+
|
|
181
|
+
```mermaid
|
|
182
|
+
graph LR
|
|
183
|
+
A[Search Query] --> B[Query Preprocessing]
|
|
184
|
+
B --> C[Vector Search]
|
|
185
|
+
B --> D[Keyword Search]
|
|
186
|
+
C --> E[Result Merging]
|
|
187
|
+
D --> E
|
|
188
|
+
E --> F[Ranking Calculation]
|
|
189
|
+
F --> G[MMR Diversity Control]
|
|
190
|
+
G --> H[Final Results]
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Ranking Algorithm
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
interface SearchRanking {
|
|
197
|
+
calculateFinalScore(features: SearchFeatures): number {
|
|
198
|
+
return this.ALPHA * features.relevance + // 0.50
|
|
199
|
+
this.BETA * features.recency + // 0.20
|
|
200
|
+
this.GAMMA * features.importance + // 0.20
|
|
201
|
+
this.DELTA * features.usage - // 0.10
|
|
202
|
+
this.EPSILON * features.duplication_penalty; // 0.15
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 4. Forgetting Policy
|
|
208
|
+
|
|
209
|
+
#### Structure
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
interface ForgettingPolicy {
|
|
213
|
+
// Calculate forget score
|
|
214
|
+
calculateForgetScore(memory: MemoryItem): number;
|
|
215
|
+
|
|
216
|
+
// Select deletion candidates
|
|
217
|
+
getDeletionCandidates(): Promise<MemoryItem[]>;
|
|
218
|
+
|
|
219
|
+
// Soft delete
|
|
220
|
+
softDelete(memory: MemoryItem): Promise<boolean>;
|
|
221
|
+
|
|
222
|
+
// Hard delete
|
|
223
|
+
hardDelete(memory: MemoryItem): Promise<boolean>;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
#### Forgetting Algorithm
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
interface ForgetScore {
|
|
231
|
+
calculate(memory: MemoryItem): number {
|
|
232
|
+
const age = this.calculateAge(memory.created_at);
|
|
233
|
+
const importance = memory.importance;
|
|
234
|
+
const usage = this.calculateUsage(memory);
|
|
235
|
+
|
|
236
|
+
return this.baseForgetScore *
|
|
237
|
+
Math.exp(-this.importanceWeight * importance) *
|
|
238
|
+
Math.exp(-this.usageWeight * usage) *
|
|
239
|
+
Math.exp(this.ageWeight * age);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 5. Spaced Review
|
|
245
|
+
|
|
246
|
+
#### Structure
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
interface SpacedReview {
|
|
250
|
+
// Calculate review schedule
|
|
251
|
+
calculateReviewSchedule(memory: MemoryItem): Date;
|
|
252
|
+
|
|
253
|
+
// Select review candidates
|
|
254
|
+
getReviewCandidates(): Promise<MemoryItem[]>;
|
|
255
|
+
|
|
256
|
+
// Execute review
|
|
257
|
+
executeReview(memory: MemoryItem): Promise<ReviewResult>;
|
|
258
|
+
|
|
259
|
+
// Adjust interval
|
|
260
|
+
adjustInterval(memory: MemoryItem, performance: number): void;
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### 6. Error Logging Service
|
|
265
|
+
|
|
266
|
+
#### Structure
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
interface ErrorLoggingService {
|
|
270
|
+
// Log error
|
|
271
|
+
logError(error: Error, severity: ErrorSeverity, category: ErrorCategory, context?: Record<string, any>): void;
|
|
272
|
+
|
|
273
|
+
// Get error statistics
|
|
274
|
+
getErrorStats(filters?: ErrorFilters): Promise<ErrorStats>;
|
|
275
|
+
|
|
276
|
+
// Resolve error
|
|
277
|
+
resolveError(errorId: string, resolvedBy: string, resolution?: string): Promise<boolean>;
|
|
278
|
+
|
|
279
|
+
// Search errors
|
|
280
|
+
searchErrors(filters: ErrorSearchFilters): Promise<ErrorLog[]>;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
enum ErrorSeverity {
|
|
284
|
+
LOW = 'LOW',
|
|
285
|
+
MEDIUM = 'MEDIUM',
|
|
286
|
+
HIGH = 'HIGH',
|
|
287
|
+
CRITICAL = 'CRITICAL'
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
enum ErrorCategory {
|
|
291
|
+
UNKNOWN = 'UNKNOWN',
|
|
292
|
+
DATABASE = 'DATABASE',
|
|
293
|
+
NETWORK = 'NETWORK',
|
|
294
|
+
TOOL_EXECUTION = 'TOOL_EXECUTION',
|
|
295
|
+
VALIDATION = 'VALIDATION',
|
|
296
|
+
SYSTEM = 'SYSTEM'
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### Key Features
|
|
301
|
+
|
|
302
|
+
- **Structured Error Logging**: Include severity, category, context information
|
|
303
|
+
- **Error Statistics Collection**: Error analysis by severity and category
|
|
304
|
+
- **Error Resolution Tracking**: Record error resolution status and methods
|
|
305
|
+
- **Real-time Monitoring**: Analyze error patterns and alerts
|
|
306
|
+
|
|
307
|
+
### 7. Performance Alert Service
|
|
308
|
+
|
|
309
|
+
#### Structure
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
interface PerformanceAlertService {
|
|
313
|
+
// Create alert
|
|
314
|
+
createAlert(level: AlertLevel, type: AlertType, metric: string, value: number, threshold: number, message: string, context?: Record<string, any>): PerformanceAlert;
|
|
315
|
+
|
|
316
|
+
// Resolve alert
|
|
317
|
+
resolveAlert(alertId: string, resolvedBy: string, resolution?: string): PerformanceAlert | null;
|
|
318
|
+
|
|
319
|
+
// Get active alerts
|
|
320
|
+
getActiveAlerts(): PerformanceAlert[];
|
|
321
|
+
|
|
322
|
+
// Search alerts
|
|
323
|
+
searchAlerts(filters: AlertSearchFilters): PerformanceAlert[];
|
|
324
|
+
|
|
325
|
+
// Alert statistics
|
|
326
|
+
getStats(): AlertStats;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
enum AlertLevel {
|
|
330
|
+
INFO = 'INFO',
|
|
331
|
+
WARNING = 'WARNING',
|
|
332
|
+
CRITICAL = 'CRITICAL'
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
enum AlertType {
|
|
336
|
+
RESPONSE_TIME = 'response_time',
|
|
337
|
+
MEMORY_USAGE = 'memory_usage',
|
|
338
|
+
ERROR_RATE = 'error_rate',
|
|
339
|
+
THROUGHPUT = 'throughput',
|
|
340
|
+
CUSTOM = 'custom'
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
#### Key Features
|
|
345
|
+
|
|
346
|
+
- **Threshold-based Alerts**: Automatic alerts when performance metrics exceed thresholds
|
|
347
|
+
- **Alert Management**: Alert creation, resolution, search, statistics functionality
|
|
348
|
+
- **Log File Storage**: Save alerts in JSONL format to files
|
|
349
|
+
- **Console Output**: Color-coded console alerts by severity
|
|
350
|
+
|
|
351
|
+
### 8. Performance Monitoring Integration
|
|
352
|
+
|
|
353
|
+
#### Structure
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
interface PerformanceMonitoringIntegration {
|
|
357
|
+
// Start real-time monitoring
|
|
358
|
+
startRealTimeMonitoring(): void;
|
|
359
|
+
|
|
360
|
+
// Stop real-time monitoring
|
|
361
|
+
stopRealTimeMonitoring(): void;
|
|
362
|
+
|
|
363
|
+
// Performance check
|
|
364
|
+
private checkPerformance(): Promise<void>;
|
|
365
|
+
|
|
366
|
+
// Threshold checks
|
|
367
|
+
private checkResponseTime(avgResponseTime: number): void;
|
|
368
|
+
private checkMemoryUsage(heapUsedMB: number): void;
|
|
369
|
+
private checkErrorRate(errorRate: number): void;
|
|
370
|
+
private checkThroughput(throughput: number): void;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
interface AlertThresholds {
|
|
374
|
+
responseTime: { warning: number; critical: number }; // ms
|
|
375
|
+
memoryUsage: { warning: number; critical: number }; // MB
|
|
376
|
+
errorRate: { warning: number; critical: number }; // %
|
|
377
|
+
throughput: { warning: number; critical: number }; // ops/sec
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### Key Features
|
|
382
|
+
|
|
383
|
+
- **Real-time Monitoring**: Automatic performance checks every 30 seconds
|
|
384
|
+
- **Threshold-based Alerts**: Automatic alert generation when thresholds are exceeded
|
|
385
|
+
- **Integrated Monitoring**: Integration with PerformanceMonitor and PerformanceAlertService
|
|
386
|
+
- **Automatic Recovery**: Perform automatic recovery tasks when serious issues occur
|
|
387
|
+
|
|
388
|
+
#### Spaced Repetition Algorithm
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
interface SpacedRepetition {
|
|
392
|
+
calculateNextReview(memory: MemoryItem, performance: number): Date {
|
|
393
|
+
const currentInterval = memory.review_interval || 1;
|
|
394
|
+
const newInterval = this.calculateInterval(currentInterval, performance);
|
|
395
|
+
|
|
396
|
+
return new Date(Date.now() + newInterval * 24 * 60 * 60 * 1000);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Data Model
|
|
402
|
+
|
|
403
|
+
### 1. Memory Item
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
interface MemoryItem {
|
|
407
|
+
id: string; // Unique identifier
|
|
408
|
+
content: string; // Memory content
|
|
409
|
+
type: 'working' | 'episodic' | 'semantic' | 'procedural'; // Memory type
|
|
410
|
+
importance: number; // Importance (0-1)
|
|
411
|
+
created_at: Date; // Creation time
|
|
412
|
+
last_accessed: Date; // Last access time
|
|
413
|
+
access_count: number; // Access count
|
|
414
|
+
pinned: boolean; // Pinned status
|
|
415
|
+
source?: string; // Source
|
|
416
|
+
tags: string[]; // Tags
|
|
417
|
+
privacy_scope: 'private' | 'team' | 'public'; // Privacy scope
|
|
418
|
+
project_id?: string; // Project ID (M2+)
|
|
419
|
+
user_id?: string; // User ID (M3+)
|
|
420
|
+
metadata: Record<string, any>; // Additional metadata
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### 2. Search Result
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
interface SearchResult {
|
|
428
|
+
items: MemoryItem[]; // List of found memories
|
|
429
|
+
total_count: number; // Total result count
|
|
430
|
+
query_time: number; // Search time (ms)
|
|
431
|
+
search_metadata: {
|
|
432
|
+
vector_matches: number; // Vector search match count
|
|
433
|
+
keyword_matches: number; // Keyword search match count
|
|
434
|
+
ranking_time: number; // Ranking calculation time
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### 3. Memory Relationship
|
|
440
|
+
|
|
441
|
+
```typescript
|
|
442
|
+
interface MemoryLink {
|
|
443
|
+
id: string; // Link ID
|
|
444
|
+
source_id: string; // Source memory ID
|
|
445
|
+
target_id: string; // Target memory ID
|
|
446
|
+
relation_type: 'cause_of' | 'derived_from' | 'duplicates' | 'contradicts';
|
|
447
|
+
created_at: Date; // Creation time
|
|
448
|
+
strength: number; // Relationship strength (0-1)
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### 4. Feedback
|
|
453
|
+
|
|
454
|
+
```typescript
|
|
455
|
+
interface Feedback {
|
|
456
|
+
id: string; // Feedback ID
|
|
457
|
+
memory_id: string; // Memory ID
|
|
458
|
+
helpful: boolean; // Helpfulness
|
|
459
|
+
score?: number; // Score (0-1)
|
|
460
|
+
comment?: string; // Comment
|
|
461
|
+
created_at: Date; // Creation time
|
|
462
|
+
user_id?: string; // User ID (M3+)
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
## Search System
|
|
467
|
+
|
|
468
|
+
### Hybrid Search Architecture
|
|
469
|
+
|
|
470
|
+
Memento provides a hybrid search system that combines FTS5 text search and vector search.
|
|
471
|
+
|
|
472
|
+
```mermaid
|
|
473
|
+
graph TB
|
|
474
|
+
subgraph "Hybrid Search Engine"
|
|
475
|
+
A[User Query] --> B[Hybrid Search Engine]
|
|
476
|
+
B --> C[FTS5 Text Search]
|
|
477
|
+
B --> D[Vector Search]
|
|
478
|
+
C --> E[Text Score]
|
|
479
|
+
D --> F[Vector Score]
|
|
480
|
+
E --> G[Score Normalization]
|
|
481
|
+
F --> G
|
|
482
|
+
G --> H[Weight Application]
|
|
483
|
+
H --> I[Final Hybrid Score]
|
|
484
|
+
I --> J[Result Sorting and Return]
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
subgraph "Embedding Service"
|
|
488
|
+
K[Text Input] --> L[OpenAI API]
|
|
489
|
+
L --> M[1536-dimensional Vector]
|
|
490
|
+
M --> N[Database Storage]
|
|
491
|
+
N --> O[Vector Search Index]
|
|
492
|
+
end
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Embedding Service Architecture
|
|
496
|
+
|
|
497
|
+
```mermaid
|
|
498
|
+
graph TB
|
|
499
|
+
subgraph "Embedding Service Layer"
|
|
500
|
+
A[Text Input] --> B[EmbeddingService]
|
|
501
|
+
B --> C[OpenAI API Call]
|
|
502
|
+
C --> D[text-embedding-3-small]
|
|
503
|
+
D --> E[1536-dimensional Vector]
|
|
504
|
+
E --> F[MemoryEmbeddingService]
|
|
505
|
+
F --> G[Database Storage]
|
|
506
|
+
G --> H[Vector Search Index]
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
subgraph "Error Handling and Caching"
|
|
510
|
+
I[API Retry Logic]
|
|
511
|
+
J[Embedding Result Caching]
|
|
512
|
+
K[Error Recovery Mechanism]
|
|
513
|
+
end
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### 1. 2-Stage Search Pipeline
|
|
517
|
+
|
|
518
|
+
#### Stage 1: Vector Search (ANN)
|
|
519
|
+
|
|
520
|
+
```typescript
|
|
521
|
+
interface VectorSearch {
|
|
522
|
+
// Generate embedding
|
|
523
|
+
generateEmbedding(text: string): Promise<number[]>;
|
|
524
|
+
|
|
525
|
+
// Vector search
|
|
526
|
+
search(embedding: number[], limit: number): Promise<VectorSearchResult>;
|
|
527
|
+
|
|
528
|
+
// Update index
|
|
529
|
+
updateIndex(memory: MemoryItem): Promise<void>;
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Features**:
|
|
534
|
+
- Semantic similarity search
|
|
535
|
+
- Fast search speed (O(log n))
|
|
536
|
+
- Multilingual support
|
|
537
|
+
|
|
538
|
+
#### Stage 2: Keyword Search (BM25)
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
interface KeywordSearch {
|
|
542
|
+
// Index text
|
|
543
|
+
indexText(memory: MemoryItem): Promise<void>;
|
|
544
|
+
|
|
545
|
+
// BM25 search
|
|
546
|
+
search(query: string, filters?: SearchFilters): Promise<KeywordSearchResult>;
|
|
547
|
+
|
|
548
|
+
// Optimize index
|
|
549
|
+
optimizeIndex(): Promise<void>;
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
**Features**:
|
|
554
|
+
- Accurate keyword matching
|
|
555
|
+
- Weight-based ranking
|
|
556
|
+
- Filter support
|
|
557
|
+
|
|
558
|
+
### 2. Ranking Algorithm
|
|
559
|
+
|
|
560
|
+
#### Composite Score Calculation
|
|
561
|
+
|
|
562
|
+
```typescript
|
|
563
|
+
interface SearchRanking {
|
|
564
|
+
calculateFinalScore(features: SearchFeatures): number {
|
|
565
|
+
const relevance = this.calculateRelevance(features);
|
|
566
|
+
const recency = this.calculateRecency(features);
|
|
567
|
+
const importance = this.calculateImportance(features);
|
|
568
|
+
const usage = this.calculateUsage(features);
|
|
569
|
+
const duplication = this.calculateDuplicationPenalty(features);
|
|
570
|
+
|
|
571
|
+
return this.ALPHA * relevance + // 0.50
|
|
572
|
+
this.BETA * recency + // 0.20
|
|
573
|
+
this.GAMMA * importance + // 0.20
|
|
574
|
+
this.DELTA * usage - // 0.10
|
|
575
|
+
this.EPSILON * duplication; // 0.15
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
#### Relevance Calculation
|
|
581
|
+
|
|
582
|
+
```typescript
|
|
583
|
+
interface RelevanceCalculation {
|
|
584
|
+
calculate(features: SearchFeatures): number {
|
|
585
|
+
const vectorSimilarity = features.vector_similarity;
|
|
586
|
+
const bm25Score = features.bm25_score;
|
|
587
|
+
const tagMatch = features.tag_match_score;
|
|
588
|
+
const titleHit = features.title_hit_score;
|
|
589
|
+
|
|
590
|
+
return (vectorSimilarity * 0.4) +
|
|
591
|
+
(bm25Score * 0.3) +
|
|
592
|
+
(tagMatch * 0.2) +
|
|
593
|
+
(titleHit * 0.1);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### 3. MMR Diversity Control
|
|
599
|
+
|
|
600
|
+
```typescript
|
|
601
|
+
interface MMRDiversity {
|
|
602
|
+
selectDiverseResults(results: SearchResult[], lambda: number = 0.7): SearchResult[] {
|
|
603
|
+
const selected: SearchResult[] = [];
|
|
604
|
+
const remaining = [...results];
|
|
605
|
+
|
|
606
|
+
while (remaining.length > 0 && selected.length < this.maxResults) {
|
|
607
|
+
let bestIndex = 0;
|
|
608
|
+
let bestScore = -Infinity;
|
|
609
|
+
|
|
610
|
+
for (let i = 0; i < remaining.length; i++) {
|
|
611
|
+
const relevance = remaining[i].score;
|
|
612
|
+
const diversity = this.calculateDiversity(remaining[i], selected);
|
|
613
|
+
const score = lambda * relevance + (1 - lambda) * diversity;
|
|
614
|
+
|
|
615
|
+
if (score > bestScore) {
|
|
616
|
+
bestScore = score;
|
|
617
|
+
bestIndex = i;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
selected.push(remaining[bestIndex]);
|
|
622
|
+
remaining.splice(bestIndex, 1);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
return selected;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Forgetting System
|
|
631
|
+
|
|
632
|
+
### 1. TTL-based Automatic Deletion
|
|
633
|
+
|
|
634
|
+
#### Memory Type TTL
|
|
635
|
+
|
|
636
|
+
```typescript
|
|
637
|
+
interface MemoryTTL {
|
|
638
|
+
WORKING_MEMORY: 48 * 60 * 60 * 1000; // 48 hours
|
|
639
|
+
EPISODIC_MEMORY: 90 * 24 * 60 * 60 * 1000; // 90 days
|
|
640
|
+
SEMANTIC_MEMORY: Infinity; // Indefinite
|
|
641
|
+
PROCEDURAL_MEMORY: Infinity; // Indefinite
|
|
642
|
+
}
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
#### Deletion Scheduling
|
|
646
|
+
|
|
647
|
+
```typescript
|
|
648
|
+
interface DeletionScheduler {
|
|
649
|
+
scheduleDeletion(memory: MemoryItem): void {
|
|
650
|
+
const ttl = this.getTTL(memory.type);
|
|
651
|
+
if (ttl === Infinity) return;
|
|
652
|
+
|
|
653
|
+
const deletionTime = new Date(memory.created_at.getTime() + ttl);
|
|
654
|
+
this.scheduleTask(deletionTime, () => this.deleteMemory(memory));
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### 2. Importance-based Forgetting
|
|
660
|
+
|
|
661
|
+
#### Forget Score Calculation
|
|
662
|
+
|
|
663
|
+
```typescript
|
|
664
|
+
interface ForgetScore {
|
|
665
|
+
calculate(memory: MemoryItem): number {
|
|
666
|
+
const age = this.calculateAge(memory.created_at);
|
|
667
|
+
const importance = memory.importance;
|
|
668
|
+
const usage = this.calculateUsage(memory);
|
|
669
|
+
const recency = this.calculateRecency(memory.last_accessed);
|
|
670
|
+
|
|
671
|
+
return this.baseForgetScore *
|
|
672
|
+
Math.exp(-this.importanceWeight * importance) *
|
|
673
|
+
Math.exp(-this.usageWeight * usage) *
|
|
674
|
+
Math.exp(-this.recencyWeight * recency) *
|
|
675
|
+
Math.exp(this.ageWeight * age);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
### 3. Spaced Repetition System
|
|
681
|
+
|
|
682
|
+
#### Review Schedule Calculation
|
|
683
|
+
|
|
684
|
+
```typescript
|
|
685
|
+
interface SpacedRepetition {
|
|
686
|
+
calculateNextReview(memory: MemoryItem, performance: number): Date {
|
|
687
|
+
const currentInterval = memory.review_interval || 1;
|
|
688
|
+
const newInterval = this.calculateInterval(currentInterval, performance);
|
|
689
|
+
|
|
690
|
+
return new Date(Date.now() + newInterval * 24 * 60 * 60 * 1000);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
calculateInterval(currentInterval: number, performance: number): number {
|
|
694
|
+
if (performance >= 0.8) {
|
|
695
|
+
return Math.min(currentInterval * 2.5, 365); // Increase interval on success
|
|
696
|
+
} else if (performance >= 0.6) {
|
|
697
|
+
return Math.max(currentInterval * 1.2, 1); // Slight increase on moderate
|
|
698
|
+
} else {
|
|
699
|
+
return 1; // Reset to 1 day on failure
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
## Milestone-based Architecture
|
|
706
|
+
|
|
707
|
+
### M1: Personal Use (MVP)
|
|
708
|
+
|
|
709
|
+
#### Architecture
|
|
710
|
+
|
|
711
|
+
```mermaid
|
|
712
|
+
graph TB
|
|
713
|
+
A[AI Agent] --> B[MCP Client]
|
|
714
|
+
B --> C[MCP Memory Server]
|
|
715
|
+
C --> D[SQLite Database]
|
|
716
|
+
C --> E[FTS5 Index]
|
|
717
|
+
C --> F[VEC Index]
|
|
718
|
+
C --> G[Local File System]
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
#### Features
|
|
722
|
+
|
|
723
|
+
- **Storage**: better-sqlite3 embedded
|
|
724
|
+
- **Search**: FTS5 + sqlite-vec
|
|
725
|
+
- **Authentication**: None (local only)
|
|
726
|
+
- **Deployment**: Local execution
|
|
727
|
+
- **Additional Features**: Lightweight embedding, performance monitoring, cache system
|
|
728
|
+
- **Scalability**: Single user
|
|
729
|
+
|
|
730
|
+
#### Technology Stack
|
|
731
|
+
|
|
732
|
+
- **Database**: better-sqlite3 12.4+
|
|
733
|
+
- **Vector Search**: sqlite-vec
|
|
734
|
+
- **Text Search**: FTS5
|
|
735
|
+
- **Web Server**: Express 5.1+
|
|
736
|
+
- **WebSocket**: ws 8.18+
|
|
737
|
+
- **Testing**: Vitest 1.0+
|
|
738
|
+
- **Runtime**: Node.js 20+
|
|
739
|
+
|
|
740
|
+
### M2: Team Collaboration
|
|
741
|
+
|
|
742
|
+
#### Architecture
|
|
743
|
+
|
|
744
|
+
```mermaid
|
|
745
|
+
graph TB
|
|
746
|
+
A[AI Agents] --> B[MCP Client]
|
|
747
|
+
B --> C[MCP Memory Server]
|
|
748
|
+
C --> D[SQLite Server Mode]
|
|
749
|
+
C --> E[Redis Cache]
|
|
750
|
+
C --> F[API Gateway]
|
|
751
|
+
F --> G[Authentication]
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
#### Features
|
|
755
|
+
|
|
756
|
+
- **Storage**: SQLite server mode (WAL)
|
|
757
|
+
- **Caching**: Redis
|
|
758
|
+
- **Authentication**: API Key
|
|
759
|
+
- **Deployment**: Docker
|
|
760
|
+
- **Scalability**: Team level (10-50 people)
|
|
761
|
+
|
|
762
|
+
#### Technology Stack
|
|
763
|
+
|
|
764
|
+
- **Database**: SQLite Server Mode
|
|
765
|
+
- **Cache**: Redis 7+
|
|
766
|
+
- **Container**: Docker
|
|
767
|
+
- **Authentication**: API Key
|
|
768
|
+
|
|
769
|
+
### M3: Organization Entry
|
|
770
|
+
|
|
771
|
+
#### Architecture
|
|
772
|
+
|
|
773
|
+
```mermaid
|
|
774
|
+
graph TB
|
|
775
|
+
A[AI Agents] --> B[MCP Client]
|
|
776
|
+
B --> C[Load Balancer]
|
|
777
|
+
C --> D[MCP Memory Server]
|
|
778
|
+
D --> E[PostgreSQL]
|
|
779
|
+
D --> F[Redis Cache]
|
|
780
|
+
D --> G[Authentication Service]
|
|
781
|
+
G --> H[JWT Token]
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
#### Features
|
|
785
|
+
|
|
786
|
+
- **Storage**: PostgreSQL + pgvector
|
|
787
|
+
- **Search**: pgvector + tsvector
|
|
788
|
+
- **Authentication**: JWT
|
|
789
|
+
- **Deployment**: Docker Compose
|
|
790
|
+
- **Scalability**: Organization level (100-1000 people)
|
|
791
|
+
|
|
792
|
+
#### Technology Stack
|
|
793
|
+
|
|
794
|
+
- **Database**: PostgreSQL 15+ + pgvector
|
|
795
|
+
- **Search**: pgvector, tsvector
|
|
796
|
+
- **Cache**: Redis 7+
|
|
797
|
+
- **Authentication**: JWT
|
|
798
|
+
- **Deployment**: Docker Compose
|
|
799
|
+
|
|
800
|
+
### M4: Enterprise
|
|
801
|
+
|
|
802
|
+
#### Architecture
|
|
803
|
+
|
|
804
|
+
```mermaid
|
|
805
|
+
graph TB
|
|
806
|
+
A[AI Agents] --> B[MCP Client]
|
|
807
|
+
B --> C[API Gateway]
|
|
808
|
+
C --> D[Load Balancer]
|
|
809
|
+
D --> E[MCP Memory Server Cluster]
|
|
810
|
+
E --> F[PostgreSQL HA]
|
|
811
|
+
E --> G[Redis Cluster]
|
|
812
|
+
E --> H[Authentication Service]
|
|
813
|
+
H --> I[SSO/LDAP]
|
|
814
|
+
E --> J[Monitoring]
|
|
815
|
+
J --> K[Prometheus]
|
|
816
|
+
J --> L[Grafana]
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
#### Features
|
|
820
|
+
|
|
821
|
+
- **Storage**: PostgreSQL high availability
|
|
822
|
+
- **Caching**: Redis cluster
|
|
823
|
+
- **Authentication**: JWT + RBAC + SSO/LDAP
|
|
824
|
+
- **Deployment**: Kubernetes
|
|
825
|
+
- **Scalability**: Enterprise (1000+ people)
|
|
826
|
+
|
|
827
|
+
#### Technology Stack
|
|
828
|
+
|
|
829
|
+
- **Database**: PostgreSQL HA + pgvector
|
|
830
|
+
- **Cache**: Redis Cluster
|
|
831
|
+
- **Authentication**: JWT + RBAC + SSO/LDAP
|
|
832
|
+
- **Deployment**: Kubernetes
|
|
833
|
+
- **Monitoring**: Prometheus + Grafana
|
|
834
|
+
|
|
835
|
+
## Performance Considerations
|
|
836
|
+
|
|
837
|
+
### 1. Search Performance
|
|
838
|
+
|
|
839
|
+
#### Hybrid Search Optimization
|
|
840
|
+
|
|
841
|
+
```typescript
|
|
842
|
+
interface HybridSearchOptimization {
|
|
843
|
+
// Combine FTS5 + vector search
|
|
844
|
+
optimizeHybridSearch(): void {
|
|
845
|
+
this.createFTSIndex('memory_item_fts', 'content');
|
|
846
|
+
this.createVectorIndex('memory_embedding', 'embedding', 'ivfflat');
|
|
847
|
+
this.analyzeTable('memory_item');
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// Batch processing
|
|
851
|
+
batchUpdateEmbeddings(memories: MemoryItem[]): void {
|
|
852
|
+
const batchSize = 100;
|
|
853
|
+
for (let i = 0; i < memories.length; i += batchSize) {
|
|
854
|
+
const batch = memories.slice(i, i + batchSize);
|
|
855
|
+
this.updateEmbeddingsBatch(batch);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
#### Lightweight Embedding Optimization
|
|
862
|
+
|
|
863
|
+
```typescript
|
|
864
|
+
interface LightweightEmbeddingOptimization {
|
|
865
|
+
// TF-IDF vectorization
|
|
866
|
+
optimizeTFIDF(): void {
|
|
867
|
+
this.updateVocabulary();
|
|
868
|
+
this.calculateIDF();
|
|
869
|
+
this.normalizeVectors();
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Multilingual support
|
|
873
|
+
preprocessText(text: string): string {
|
|
874
|
+
return this.removeStopWords(text)
|
|
875
|
+
.normalizeUnicode()
|
|
876
|
+
.tokenize()
|
|
877
|
+
.stem();
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
#### Caching Strategy
|
|
883
|
+
|
|
884
|
+
```typescript
|
|
885
|
+
interface CachingStrategy {
|
|
886
|
+
// LRU cache implementation
|
|
887
|
+
cacheSearchResult(query: string, result: SearchResult): void {
|
|
888
|
+
const key = `search:${this.hashQuery(query)}`;
|
|
889
|
+
this.lruCache.set(key, result, 3600); // 1 hour TTL
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
// Embedding caching
|
|
893
|
+
cacheEmbedding(text: string, embedding: number[]): void {
|
|
894
|
+
const key = `embedding:${this.hashText(text)}`;
|
|
895
|
+
this.lruCache.set(key, embedding, 86400); // 24 hour TTL
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// Popular query caching
|
|
899
|
+
cachePopularQueries(): void {
|
|
900
|
+
const popular = this.getPopularQueries(100);
|
|
901
|
+
this.lruCache.set('popular_queries', popular, 86400); // 24 hour TTL
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
```
|
|
905
|
+
|
|
906
|
+
### 2. Memory Usage
|
|
907
|
+
|
|
908
|
+
#### Performance Monitoring
|
|
909
|
+
|
|
910
|
+
```typescript
|
|
911
|
+
interface PerformanceMonitoring {
|
|
912
|
+
// Memory usage monitoring
|
|
913
|
+
monitorMemoryUsage(): void {
|
|
914
|
+
const usage = process.memoryUsage();
|
|
915
|
+
this.metrics.record('memory.heapUsed', usage.heapUsed);
|
|
916
|
+
this.metrics.record('memory.heapTotal', usage.heapTotal);
|
|
917
|
+
this.metrics.record('memory.rss', usage.rss);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// Cache performance monitoring
|
|
921
|
+
monitorCachePerformance(): void {
|
|
922
|
+
this.metrics.record('cache.hitRate', this.cache.getHitRate());
|
|
923
|
+
this.metrics.record('cache.size', this.cache.getSize());
|
|
924
|
+
this.metrics.record('cache.memoryUsage', this.cache.getMemoryUsage());
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
#### Memory Pool Management
|
|
930
|
+
|
|
931
|
+
```typescript
|
|
932
|
+
interface MemoryPool {
|
|
933
|
+
private pool: Buffer[] = [];
|
|
934
|
+
private maxSize: number = 100;
|
|
935
|
+
|
|
936
|
+
getBuffer(size: number): Buffer {
|
|
937
|
+
const buffer = this.pool.find(b => b.length >= size);
|
|
938
|
+
if (buffer) {
|
|
939
|
+
return buffer;
|
|
940
|
+
}
|
|
941
|
+
return Buffer.alloc(size);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
returnBuffer(buffer: Buffer): void {
|
|
945
|
+
if (this.pool.length < this.maxSize) {
|
|
946
|
+
this.pool.push(buffer);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
#### Garbage Collection Optimization
|
|
953
|
+
|
|
954
|
+
```typescript
|
|
955
|
+
interface GCOptimization {
|
|
956
|
+
// Memory usage monitoring
|
|
957
|
+
monitorMemoryUsage(): void {
|
|
958
|
+
const usage = process.memoryUsage();
|
|
959
|
+
if (usage.heapUsed > this.threshold) {
|
|
960
|
+
this.triggerGC();
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
// Clean up unnecessary objects
|
|
965
|
+
cleanup(): void {
|
|
966
|
+
this.clearExpiredCache();
|
|
967
|
+
this.clearUnusedConnections();
|
|
968
|
+
this.optimizeIndexes();
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
### 3. Database Performance
|
|
974
|
+
|
|
975
|
+
#### better-sqlite3 Optimization
|
|
976
|
+
|
|
977
|
+
```sql
|
|
978
|
+
-- Index optimization
|
|
979
|
+
CREATE INDEX idx_memory_type_created ON memory_item(type, created_at);
|
|
980
|
+
CREATE INDEX idx_memory_importance ON memory_item(importance DESC);
|
|
981
|
+
CREATE INDEX idx_memory_tags ON memory_item USING GIN(tags);
|
|
982
|
+
|
|
983
|
+
-- Vector search index
|
|
984
|
+
CREATE INDEX idx_memory_embedding ON memory_embedding
|
|
985
|
+
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
986
|
+
|
|
987
|
+
-- FTS index
|
|
988
|
+
CREATE VIRTUAL TABLE memory_fts USING fts5(
|
|
989
|
+
content,
|
|
990
|
+
tags,
|
|
991
|
+
source,
|
|
992
|
+
content='memory_item',
|
|
993
|
+
content_rowid='id'
|
|
994
|
+
);
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
#### Database Optimization Service
|
|
998
|
+
|
|
999
|
+
```typescript
|
|
1000
|
+
interface DatabaseOptimization {
|
|
1001
|
+
// Auto index recommendation
|
|
1002
|
+
recommendIndexes(): IndexRecommendation[] {
|
|
1003
|
+
const slowQueries = this.analyzeSlowQueries();
|
|
1004
|
+
return slowQueries.map(query => this.generateIndexRecommendation(query));
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
// Query performance analysis
|
|
1008
|
+
analyzeQueryPerformance(): QueryAnalysis {
|
|
1009
|
+
return {
|
|
1010
|
+
averageQueryTime: this.getAverageQueryTime(),
|
|
1011
|
+
slowQueries: this.getSlowQueries(),
|
|
1012
|
+
indexUsage: this.getIndexUsage(),
|
|
1013
|
+
recommendations: this.generateRecommendations()
|
|
1014
|
+
};
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
#### Connection Pool Management
|
|
1020
|
+
|
|
1021
|
+
```typescript
|
|
1022
|
+
interface ConnectionPool {
|
|
1023
|
+
private pool: DatabaseConnection[] = [];
|
|
1024
|
+
private maxConnections: number = 20;
|
|
1025
|
+
|
|
1026
|
+
async getConnection(): Promise<DatabaseConnection> {
|
|
1027
|
+
if (this.pool.length > 0) {
|
|
1028
|
+
return this.pool.pop()!;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
if (this.activeConnections < this.maxConnections) {
|
|
1032
|
+
return await this.createConnection();
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
return await this.waitForConnection();
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
releaseConnection(conn: DatabaseConnection): void {
|
|
1039
|
+
if (this.pool.length < this.maxConnections) {
|
|
1040
|
+
this.pool.push(conn);
|
|
1041
|
+
} else {
|
|
1042
|
+
conn.close();
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
## Security Architecture
|
|
1049
|
+
|
|
1050
|
+
### 1. Authentication and Authorization
|
|
1051
|
+
|
|
1052
|
+
#### JWT-based Authentication (M3+)
|
|
1053
|
+
|
|
1054
|
+
```typescript
|
|
1055
|
+
interface JWTAuthentication {
|
|
1056
|
+
generateToken(user: User): string {
|
|
1057
|
+
const payload = {
|
|
1058
|
+
sub: user.id,
|
|
1059
|
+
email: user.email,
|
|
1060
|
+
role: user.role,
|
|
1061
|
+
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24) // 24 hours
|
|
1062
|
+
};
|
|
1063
|
+
|
|
1064
|
+
return jwt.sign(payload, this.secretKey, { algorithm: 'HS256' });
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
verifyToken(token: string): UserPayload {
|
|
1068
|
+
return jwt.verify(token, this.secretKey) as UserPayload;
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
```
|
|
1072
|
+
|
|
1073
|
+
#### RBAC Permission Management (M4)
|
|
1074
|
+
|
|
1075
|
+
```typescript
|
|
1076
|
+
interface RBAC {
|
|
1077
|
+
hasPermission(user: User, resource: string, action: string): boolean {
|
|
1078
|
+
const role = this.getRole(user.role);
|
|
1079
|
+
return role.permissions.some(p =>
|
|
1080
|
+
p.resource === resource && p.actions.includes(action)
|
|
1081
|
+
);
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
checkMemoryAccess(user: User, memory: MemoryItem): boolean {
|
|
1085
|
+
if (memory.privacy_scope === 'public') return true;
|
|
1086
|
+
if (memory.privacy_scope === 'team' && user.team_id === memory.team_id) return true;
|
|
1087
|
+
if (memory.privacy_scope === 'private' && user.id === memory.user_id) return true;
|
|
1088
|
+
return false;
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
### 2. Data Encryption
|
|
1094
|
+
|
|
1095
|
+
#### Sensitive Data Encryption
|
|
1096
|
+
|
|
1097
|
+
```typescript
|
|
1098
|
+
interface DataEncryption {
|
|
1099
|
+
encryptSensitiveData(data: string): string {
|
|
1100
|
+
const cipher = crypto.createCipher('aes-256-gcm', this.encryptionKey);
|
|
1101
|
+
let encrypted = cipher.update(data, 'utf8', 'hex');
|
|
1102
|
+
encrypted += cipher.final('hex');
|
|
1103
|
+
return encrypted;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
decryptSensitiveData(encryptedData: string): string {
|
|
1107
|
+
const decipher = crypto.createDecipher('aes-256-gcm', this.encryptionKey);
|
|
1108
|
+
let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
|
|
1109
|
+
decrypted += decipher.final('utf8');
|
|
1110
|
+
return decrypted;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
```
|
|
1114
|
+
|
|
1115
|
+
#### Transport Encryption
|
|
1116
|
+
|
|
1117
|
+
```typescript
|
|
1118
|
+
interface TransportEncryption {
|
|
1119
|
+
// Enforce HTTPS
|
|
1120
|
+
enforceHTTPS(): void {
|
|
1121
|
+
this.app.use((req, res, next) => {
|
|
1122
|
+
if (!req.secure && req.get('x-forwarded-proto') !== 'https') {
|
|
1123
|
+
return res.redirect(`https://${req.get('host')}${req.url}`);
|
|
1124
|
+
}
|
|
1125
|
+
next();
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
// Set HSTS headers
|
|
1130
|
+
setHSTS(): void {
|
|
1131
|
+
this.app.use((req, res, next) => {
|
|
1132
|
+
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
|
|
1133
|
+
next();
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
```
|
|
1138
|
+
|
|
1139
|
+
### 3. Audit Logging
|
|
1140
|
+
|
|
1141
|
+
#### Security Event Logging
|
|
1142
|
+
|
|
1143
|
+
```typescript
|
|
1144
|
+
interface SecurityAudit {
|
|
1145
|
+
logSecurityEvent(event: SecurityEvent): void {
|
|
1146
|
+
const logEntry = {
|
|
1147
|
+
timestamp: new Date().toISOString(),
|
|
1148
|
+
event_type: event.type,
|
|
1149
|
+
user_id: event.user_id,
|
|
1150
|
+
ip_address: event.ip_address,
|
|
1151
|
+
user_agent: event.user_agent,
|
|
1152
|
+
details: event.details,
|
|
1153
|
+
severity: event.severity
|
|
1154
|
+
};
|
|
1155
|
+
|
|
1156
|
+
this.auditLogger.info(logEntry);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
detectAnomalies(): void {
|
|
1160
|
+
// Detect abnormal access patterns
|
|
1161
|
+
const recentEvents = this.getRecentEvents(5 * 60 * 1000); // 5 minutes
|
|
1162
|
+
const suspiciousEvents = this.analyzePatterns(recentEvents);
|
|
1163
|
+
|
|
1164
|
+
if (suspiciousEvents.length > 0) {
|
|
1165
|
+
this.alertSecurityTeam(suspiciousEvents);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
```
|
|
1170
|
+
|
|
1171
|
+
## Monitoring and Observability
|
|
1172
|
+
|
|
1173
|
+
### 1. Metrics Collection
|
|
1174
|
+
|
|
1175
|
+
#### Prometheus Metrics
|
|
1176
|
+
|
|
1177
|
+
```typescript
|
|
1178
|
+
interface Metrics {
|
|
1179
|
+
// Memory-related metrics
|
|
1180
|
+
memoryCounter: Counter<string>;
|
|
1181
|
+
memorySize: Gauge<string>;
|
|
1182
|
+
|
|
1183
|
+
// Search-related metrics
|
|
1184
|
+
searchDuration: Histogram<string>;
|
|
1185
|
+
searchResults: Counter<string>;
|
|
1186
|
+
|
|
1187
|
+
// Error-related metrics
|
|
1188
|
+
errorCounter: Counter<string>;
|
|
1189
|
+
errorRate: Gauge<string>;
|
|
1190
|
+
|
|
1191
|
+
// Performance-related metrics
|
|
1192
|
+
responseTime: Histogram<string>;
|
|
1193
|
+
throughput: Counter<string>;
|
|
1194
|
+
}
|
|
1195
|
+
```
|
|
1196
|
+
|
|
1197
|
+
### 2. Logging
|
|
1198
|
+
|
|
1199
|
+
#### Structured Logging
|
|
1200
|
+
|
|
1201
|
+
```typescript
|
|
1202
|
+
interface StructuredLogging {
|
|
1203
|
+
logMemoryOperation(operation: string, memoryId: string, userId?: string): void {
|
|
1204
|
+
this.logger.info({
|
|
1205
|
+
operation,
|
|
1206
|
+
memory_id: memoryId,
|
|
1207
|
+
user_id: userId,
|
|
1208
|
+
timestamp: new Date().toISOString(),
|
|
1209
|
+
level: 'info'
|
|
1210
|
+
});
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
logSearchQuery(query: string, resultCount: number, duration: number): void {
|
|
1214
|
+
this.logger.info({
|
|
1215
|
+
event: 'search_query',
|
|
1216
|
+
query,
|
|
1217
|
+
result_count: resultCount,
|
|
1218
|
+
duration_ms: duration,
|
|
1219
|
+
timestamp: new Date().toISOString()
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
```
|
|
1224
|
+
|
|
1225
|
+
### 3. Health Check
|
|
1226
|
+
|
|
1227
|
+
#### Service Status Monitoring
|
|
1228
|
+
|
|
1229
|
+
```typescript
|
|
1230
|
+
interface HealthCheck {
|
|
1231
|
+
async checkHealth(): Promise<HealthStatus> {
|
|
1232
|
+
const checks = await Promise.allSettled([
|
|
1233
|
+
this.checkDatabase(),
|
|
1234
|
+
this.checkRedis(),
|
|
1235
|
+
this.checkSearchIndex(),
|
|
1236
|
+
this.checkMemoryUsage()
|
|
1237
|
+
]);
|
|
1238
|
+
|
|
1239
|
+
return {
|
|
1240
|
+
status: checks.every(c => c.status === 'fulfilled') ? 'healthy' : 'unhealthy',
|
|
1241
|
+
checks: checks.map((check, index) => ({
|
|
1242
|
+
name: this.checkNames[index],
|
|
1243
|
+
status: check.status === 'fulfilled' ? 'ok' : 'error',
|
|
1244
|
+
details: check.status === 'fulfilled' ? check.value : check.reason
|
|
1245
|
+
}))
|
|
1246
|
+
};
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
```
|
|
1250
|
+
|
|
1251
|
+
## Scalability Considerations
|
|
1252
|
+
|
|
1253
|
+
### 1. Horizontal Scaling
|
|
1254
|
+
|
|
1255
|
+
#### Sharding Strategy
|
|
1256
|
+
|
|
1257
|
+
```typescript
|
|
1258
|
+
interface ShardingStrategy {
|
|
1259
|
+
getShard(memoryId: string): string {
|
|
1260
|
+
const hash = this.hash(memoryId);
|
|
1261
|
+
return `shard_${hash % this.shardCount}`;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
routeQuery(query: string): string[] {
|
|
1265
|
+
// Send query to all shards
|
|
1266
|
+
return this.shards.map(shard => `${shard}/search`);
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
```
|
|
1270
|
+
|
|
1271
|
+
### 2. Caching Strategy
|
|
1272
|
+
|
|
1273
|
+
#### Multi-level Caching
|
|
1274
|
+
|
|
1275
|
+
```typescript
|
|
1276
|
+
interface MultiLevelCache {
|
|
1277
|
+
async get(key: string): Promise<any> {
|
|
1278
|
+
// L1: Memory cache
|
|
1279
|
+
let value = this.memoryCache.get(key);
|
|
1280
|
+
if (value) return value;
|
|
1281
|
+
|
|
1282
|
+
// L2: Redis cache
|
|
1283
|
+
value = await this.redis.get(key);
|
|
1284
|
+
if (value) {
|
|
1285
|
+
this.memoryCache.set(key, value);
|
|
1286
|
+
return value;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
// L3: Database
|
|
1290
|
+
value = await this.database.get(key);
|
|
1291
|
+
if (value) {
|
|
1292
|
+
this.memoryCache.set(key, value);
|
|
1293
|
+
await this.redis.setex(key, 3600, value);
|
|
1294
|
+
return value;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
return null;
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
```
|
|
1301
|
+
|
|
1302
|
+
This architecture document explains the overall structure and design principles of Memento MCP Server. For detailed implementation of each component, refer to individual development documents.
|