universal-agent-protocol 0.5.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/LICENSE +21 -0
- package/README.md +462 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +656 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +506 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/tool-calls.d.ts +3 -0
- package/dist/bin/tool-calls.d.ts.map +1 -0
- package/dist/bin/tool-calls.js +4 -0
- package/dist/bin/tool-calls.js.map +1 -0
- package/dist/cli/agent.d.ts +20 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +434 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/analyze.d.ts +7 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +103 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/coord.d.ts +7 -0
- package/dist/cli/coord.d.ts.map +1 -0
- package/dist/cli/coord.js +138 -0
- package/dist/cli/coord.js.map +1 -0
- package/dist/cli/dashboard.d.ts +8 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +704 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/deploy.d.ts +19 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +267 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/droids.d.ts +9 -0
- package/dist/cli/droids.d.ts.map +1 -0
- package/dist/cli/droids.js +227 -0
- package/dist/cli/droids.js.map +1 -0
- package/dist/cli/generate.d.ts +17 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +432 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/hooks.d.ts +9 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +374 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +11 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +316 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-router.d.ts +16 -0
- package/dist/cli/mcp-router.d.ts.map +1 -0
- package/dist/cli/mcp-router.js +143 -0
- package/dist/cli/mcp-router.js.map +1 -0
- package/dist/cli/memory.d.ts +24 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +877 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model.d.ts +15 -0
- package/dist/cli/model.d.ts.map +1 -0
- package/dist/cli/model.js +270 -0
- package/dist/cli/model.js.map +1 -0
- package/dist/cli/patterns.d.ts +26 -0
- package/dist/cli/patterns.d.ts.map +1 -0
- package/dist/cli/patterns.js +587 -0
- package/dist/cli/patterns.js.map +1 -0
- package/dist/cli/setup-mcp-router.d.ts +8 -0
- package/dist/cli/setup-mcp-router.d.ts.map +1 -0
- package/dist/cli/setup-mcp-router.js +163 -0
- package/dist/cli/setup-mcp-router.js.map +1 -0
- package/dist/cli/setup.d.ts +13 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +146 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/sync.d.ts +7 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +26 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/task.d.ts +33 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +616 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/tool-calls.d.ts +8 -0
- package/dist/cli/tool-calls.d.ts.map +1 -0
- package/dist/cli/tool-calls.js +239 -0
- package/dist/cli/tool-calls.js.map +1 -0
- package/dist/cli/update.d.ts +10 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +300 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/visualize.d.ts +77 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +287 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/cli/worktree.d.ts +9 -0
- package/dist/cli/worktree.d.ts.map +1 -0
- package/dist/cli/worktree.js +175 -0
- package/dist/cli/worktree.js.map +1 -0
- package/dist/coordination/capability-router.d.ts +79 -0
- package/dist/coordination/capability-router.d.ts.map +1 -0
- package/dist/coordination/capability-router.js +324 -0
- package/dist/coordination/capability-router.js.map +1 -0
- package/dist/coordination/database.d.ts +13 -0
- package/dist/coordination/database.d.ts.map +1 -0
- package/dist/coordination/database.js +131 -0
- package/dist/coordination/database.js.map +1 -0
- package/dist/coordination/deploy-batcher.d.ts +101 -0
- package/dist/coordination/deploy-batcher.d.ts.map +1 -0
- package/dist/coordination/deploy-batcher.js +565 -0
- package/dist/coordination/deploy-batcher.js.map +1 -0
- package/dist/coordination/index.d.ts +5 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +5 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/service.d.ts +81 -0
- package/dist/coordination/service.d.ts.map +1 -0
- package/dist/coordination/service.js +603 -0
- package/dist/coordination/service.js.map +1 -0
- package/dist/generators/claude-md.d.ts +3 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +977 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/template-loader.d.ts +105 -0
- package/dist/generators/template-loader.d.ts.map +1 -0
- package/dist/generators/template-loader.js +291 -0
- package/dist/generators/template-loader.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-router/config/parser.d.ts +9 -0
- package/dist/mcp-router/config/parser.d.ts.map +1 -0
- package/dist/mcp-router/config/parser.js +174 -0
- package/dist/mcp-router/config/parser.js.map +1 -0
- package/dist/mcp-router/executor/client.d.ts +31 -0
- package/dist/mcp-router/executor/client.d.ts.map +1 -0
- package/dist/mcp-router/executor/client.js +187 -0
- package/dist/mcp-router/executor/client.js.map +1 -0
- package/dist/mcp-router/index.d.ts +22 -0
- package/dist/mcp-router/index.d.ts.map +1 -0
- package/dist/mcp-router/index.js +18 -0
- package/dist/mcp-router/index.js.map +1 -0
- package/dist/mcp-router/output-compressor.d.ts +26 -0
- package/dist/mcp-router/output-compressor.d.ts.map +1 -0
- package/dist/mcp-router/output-compressor.js +236 -0
- package/dist/mcp-router/output-compressor.js.map +1 -0
- package/dist/mcp-router/search/fuzzy.d.ts +26 -0
- package/dist/mcp-router/search/fuzzy.d.ts.map +1 -0
- package/dist/mcp-router/search/fuzzy.js +94 -0
- package/dist/mcp-router/search/fuzzy.js.map +1 -0
- package/dist/mcp-router/server.d.ts +50 -0
- package/dist/mcp-router/server.d.ts.map +1 -0
- package/dist/mcp-router/server.js +229 -0
- package/dist/mcp-router/server.js.map +1 -0
- package/dist/mcp-router/session-stats.d.ts +37 -0
- package/dist/mcp-router/session-stats.d.ts.map +1 -0
- package/dist/mcp-router/session-stats.js +56 -0
- package/dist/mcp-router/session-stats.js.map +1 -0
- package/dist/mcp-router/tools/discover.d.ts +37 -0
- package/dist/mcp-router/tools/discover.d.ts.map +1 -0
- package/dist/mcp-router/tools/discover.js +65 -0
- package/dist/mcp-router/tools/discover.js.map +1 -0
- package/dist/mcp-router/tools/execute.d.ts +43 -0
- package/dist/mcp-router/tools/execute.d.ts.map +1 -0
- package/dist/mcp-router/tools/execute.js +103 -0
- package/dist/mcp-router/tools/execute.js.map +1 -0
- package/dist/mcp-router/types.d.ts +62 -0
- package/dist/mcp-router/types.d.ts.map +1 -0
- package/dist/mcp-router/types.js +6 -0
- package/dist/mcp-router/types.js.map +1 -0
- package/dist/memory/adaptive-context.d.ts +146 -0
- package/dist/memory/adaptive-context.d.ts.map +1 -0
- package/dist/memory/adaptive-context.js +1022 -0
- package/dist/memory/adaptive-context.js.map +1 -0
- package/dist/memory/agent-scoped-memory.d.ts +67 -0
- package/dist/memory/agent-scoped-memory.d.ts.map +1 -0
- package/dist/memory/agent-scoped-memory.js +126 -0
- package/dist/memory/agent-scoped-memory.js.map +1 -0
- package/dist/memory/backends/base.d.ts +18 -0
- package/dist/memory/backends/base.d.ts.map +1 -0
- package/dist/memory/backends/base.js +2 -0
- package/dist/memory/backends/base.js.map +1 -0
- package/dist/memory/backends/factory.d.ts +4 -0
- package/dist/memory/backends/factory.d.ts.map +1 -0
- package/dist/memory/backends/factory.js +53 -0
- package/dist/memory/backends/factory.js.map +1 -0
- package/dist/memory/backends/github.d.ts +22 -0
- package/dist/memory/backends/github.d.ts.map +1 -0
- package/dist/memory/backends/github.js +118 -0
- package/dist/memory/backends/github.js.map +1 -0
- package/dist/memory/backends/qdrant-cloud.d.ts +32 -0
- package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -0
- package/dist/memory/backends/qdrant-cloud.js +168 -0
- package/dist/memory/backends/qdrant-cloud.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +74 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +289 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/correction-propagator.d.ts +44 -0
- package/dist/memory/correction-propagator.d.ts.map +1 -0
- package/dist/memory/correction-propagator.js +156 -0
- package/dist/memory/correction-propagator.js.map +1 -0
- package/dist/memory/daily-log.d.ts +67 -0
- package/dist/memory/daily-log.d.ts.map +1 -0
- package/dist/memory/daily-log.js +143 -0
- package/dist/memory/daily-log.js.map +1 -0
- package/dist/memory/dynamic-retrieval.d.ts +110 -0
- package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
- package/dist/memory/dynamic-retrieval.js +688 -0
- package/dist/memory/dynamic-retrieval.js.map +1 -0
- package/dist/memory/embeddings.d.ts +116 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +461 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/hierarchical-memory.d.ts +141 -0
- package/dist/memory/hierarchical-memory.d.ts.map +1 -0
- package/dist/memory/hierarchical-memory.js +477 -0
- package/dist/memory/hierarchical-memory.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +124 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +514 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-maintenance.d.ts +39 -0
- package/dist/memory/memory-maintenance.d.ts.map +1 -0
- package/dist/memory/memory-maintenance.js +305 -0
- package/dist/memory/memory-maintenance.js.map +1 -0
- package/dist/memory/model-router.d.ts +102 -0
- package/dist/memory/model-router.d.ts.map +1 -0
- package/dist/memory/model-router.js +448 -0
- package/dist/memory/model-router.js.map +1 -0
- package/dist/memory/multi-view-memory.d.ts +134 -0
- package/dist/memory/multi-view-memory.d.ts.map +1 -0
- package/dist/memory/multi-view-memory.js +420 -0
- package/dist/memory/multi-view-memory.js.map +1 -0
- package/dist/memory/prepopulate.d.ts +76 -0
- package/dist/memory/prepopulate.d.ts.map +1 -0
- package/dist/memory/prepopulate.js +815 -0
- package/dist/memory/prepopulate.js.map +1 -0
- package/dist/memory/semantic-compression.d.ts +77 -0
- package/dist/memory/semantic-compression.d.ts.map +1 -0
- package/dist/memory/semantic-compression.js +348 -0
- package/dist/memory/semantic-compression.js.map +1 -0
- package/dist/memory/serverless-qdrant.d.ts +102 -0
- package/dist/memory/serverless-qdrant.d.ts.map +1 -0
- package/dist/memory/serverless-qdrant.js +369 -0
- package/dist/memory/serverless-qdrant.js.map +1 -0
- package/dist/memory/short-term/factory.d.ts +26 -0
- package/dist/memory/short-term/factory.d.ts.map +1 -0
- package/dist/memory/short-term/factory.js +28 -0
- package/dist/memory/short-term/factory.js.map +1 -0
- package/dist/memory/short-term/indexeddb.d.ts +25 -0
- package/dist/memory/short-term/indexeddb.d.ts.map +1 -0
- package/dist/memory/short-term/indexeddb.js +64 -0
- package/dist/memory/short-term/indexeddb.js.map +1 -0
- package/dist/memory/short-term/schema.d.ts +6 -0
- package/dist/memory/short-term/schema.d.ts.map +1 -0
- package/dist/memory/short-term/schema.js +119 -0
- package/dist/memory/short-term/schema.js.map +1 -0
- package/dist/memory/short-term/sqlite.d.ts +50 -0
- package/dist/memory/short-term/sqlite.d.ts.map +1 -0
- package/dist/memory/short-term/sqlite.js +221 -0
- package/dist/memory/short-term/sqlite.js.map +1 -0
- package/dist/memory/speculative-cache.d.ts +111 -0
- package/dist/memory/speculative-cache.d.ts.map +1 -0
- package/dist/memory/speculative-cache.js +409 -0
- package/dist/memory/speculative-cache.js.map +1 -0
- package/dist/memory/task-classifier.d.ts +34 -0
- package/dist/memory/task-classifier.d.ts.map +1 -0
- package/dist/memory/task-classifier.js +300 -0
- package/dist/memory/task-classifier.js.map +1 -0
- package/dist/memory/terminal-bench-knowledge.d.ts +48 -0
- package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -0
- package/dist/memory/terminal-bench-knowledge.js +399 -0
- package/dist/memory/terminal-bench-knowledge.js.map +1 -0
- package/dist/memory/write-gate.d.ts +39 -0
- package/dist/memory/write-gate.d.ts.map +1 -0
- package/dist/memory/write-gate.js +190 -0
- package/dist/memory/write-gate.js.map +1 -0
- package/dist/models/executor.d.ts +130 -0
- package/dist/models/executor.d.ts.map +1 -0
- package/dist/models/executor.js +383 -0
- package/dist/models/executor.js.map +1 -0
- package/dist/models/index.d.ts +15 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +17 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/planner.d.ts +71 -0
- package/dist/models/planner.d.ts.map +1 -0
- package/dist/models/planner.js +344 -0
- package/dist/models/planner.js.map +1 -0
- package/dist/models/router.d.ts +75 -0
- package/dist/models/router.d.ts.map +1 -0
- package/dist/models/router.js +344 -0
- package/dist/models/router.js.map +1 -0
- package/dist/models/types.d.ts +370 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +181 -0
- package/dist/models/types.js.map +1 -0
- package/dist/tasks/coordination.d.ts +74 -0
- package/dist/tasks/coordination.d.ts.map +1 -0
- package/dist/tasks/coordination.js +237 -0
- package/dist/tasks/coordination.js.map +1 -0
- package/dist/tasks/database.d.ts +14 -0
- package/dist/tasks/database.d.ts.map +1 -0
- package/dist/tasks/database.js +128 -0
- package/dist/tasks/database.js.map +1 -0
- package/dist/tasks/index.d.ts +5 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +5 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/service.d.ts +39 -0
- package/dist/tasks/service.d.ts.map +1 -0
- package/dist/tasks/service.js +582 -0
- package/dist/tasks/service.js.map +1 -0
- package/dist/tasks/types.d.ts +224 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +64 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/types/analysis.d.ts +82 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +2 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +3023 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +292 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/coordination.d.ts +240 -0
- package/dist/types/coordination.d.ts.map +1 -0
- package/dist/types/coordination.js +43 -0
- package/dist/types/coordination.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/calculate-average.d.ts +15 -0
- package/dist/utils/calculate-average.d.ts.map +1 -0
- package/dist/utils/calculate-average.js +21 -0
- package/dist/utils/calculate-average.js.map +1 -0
- package/dist/utils/config-manager.d.ts +30 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +41 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/dijkstra.d.ts +17 -0
- package/dist/utils/dijkstra.d.ts.map +1 -0
- package/dist/utils/dijkstra.js +91 -0
- package/dist/utils/dijkstra.js.map +1 -0
- package/dist/utils/fetch-with-retry.d.ts +5 -0
- package/dist/utils/fetch-with-retry.d.ts.map +1 -0
- package/dist/utils/fetch-with-retry.js +61 -0
- package/dist/utils/fetch-with-retry.js.map +1 -0
- package/dist/utils/merge-claude-md.d.ts +28 -0
- package/dist/utils/merge-claude-md.d.ts.map +1 -0
- package/dist/utils/merge-claude-md.js +342 -0
- package/dist/utils/merge-claude-md.js.map +1 -0
- package/dist/utils/order-processor-refactored.d.ts +126 -0
- package/dist/utils/order-processor-refactored.d.ts.map +1 -0
- package/dist/utils/order-processor-refactored.js +165 -0
- package/dist/utils/order-processor-refactored.js.map +1 -0
- package/dist/utils/order-processor-strategy.d.ts +72 -0
- package/dist/utils/order-processor-strategy.d.ts.map +1 -0
- package/dist/utils/order-processor-strategy.js +158 -0
- package/dist/utils/order-processor-strategy.js.map +1 -0
- package/dist/utils/order-processor.d.ts +242 -0
- package/dist/utils/order-processor.d.ts.map +1 -0
- package/dist/utils/order-processor.js +370 -0
- package/dist/utils/order-processor.js.map +1 -0
- package/dist/utils/rate-limiter-simple.d.ts +58 -0
- package/dist/utils/rate-limiter-simple.d.ts.map +1 -0
- package/dist/utils/rate-limiter-simple.js +100 -0
- package/dist/utils/rate-limiter-simple.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +62 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +150 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +37 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +114 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/validate-json.d.ts +51 -0
- package/dist/utils/validate-json.d.ts.map +1 -0
- package/dist/utils/validate-json.js +99 -0
- package/dist/utils/validate-json.js.map +1 -0
- package/package.json +96 -0
- package/templates/CLAUDE.template.md +11 -0
- package/templates/CLAUDE_ARCHITECTURE.template.md +103 -0
- package/templates/CLAUDE_CODING.template.md +125 -0
- package/templates/CLAUDE_DROIDS.template.md +109 -0
- package/templates/CLAUDE_MEMORY.template.md +130 -0
- package/templates/CLAUDE_WORKFLOWS.template.md +136 -0
- package/templates/PROJECT.template.md +209 -0
- package/templates/SCHEMA.md +57 -0
- package/templates/archive/CLAUDE.template.root-v6.md +762 -0
- package/templates/archive/CLAUDE.template.v6.md +762 -0
- package/templates/hooks/pre-compact.sh +68 -0
- package/templates/hooks/session-start.sh +106 -0
- package/tools/agents/README.md +224 -0
- package/tools/agents/UAP/README.md +351 -0
- package/tools/agents/UAP/__init__.py +9 -0
- package/tools/agents/UAP/cli.py +675 -0
- package/tools/agents/UAP/version.py +2 -0
- package/tools/agents/benchmarks/benchmark_memory_systems.py +637 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.json +170 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.md +51 -0
- package/tools/agents/config/chat_template.jinja +172 -0
- package/tools/agents/docker-compose.qdrant.yml +24 -0
- package/tools/agents/migrations/apply.py +256 -0
- package/tools/agents/scripts/fix_qwen_chat_template.py +314 -0
- package/tools/agents/scripts/init_qdrant.py +151 -0
- package/tools/agents/scripts/memory_migration.py +518 -0
- package/tools/agents/scripts/migrate_memory_to_qdrant.py +113 -0
- package/tools/agents/scripts/query_memory.py +189 -0
- package/tools/agents/scripts/qwen_tool_call_test.py +419 -0
- package/tools/agents/scripts/qwen_tool_call_wrapper.py +517 -0
- package/tools/agents/scripts/start-services.sh +96 -0
- package/tools/agents/tests/test_uap_compliance.py +257 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Consolidation Service for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements the consolidation rules from CLAUDE.md:
|
|
5
|
+
* - Trigger: Every 10 working memory entries
|
|
6
|
+
* - Action: Summarize → session_memories, Extract lessons → semantic memory
|
|
7
|
+
* - Dedup: Skip if content_hash exists OR similarity > 0.92
|
|
8
|
+
*
|
|
9
|
+
* Enhanced with SimpleMem-style recursive consolidation:
|
|
10
|
+
* - Background async consolidation process
|
|
11
|
+
* - Hierarchical abstraction (memories → summaries → meta-summaries)
|
|
12
|
+
* - Quality scoring and automatic pruning
|
|
13
|
+
*/
|
|
14
|
+
export interface ConsolidationConfig {
|
|
15
|
+
triggerThreshold: number;
|
|
16
|
+
minImportanceForLongTerm: number;
|
|
17
|
+
similarityThreshold: number;
|
|
18
|
+
maxSummaryLength: number;
|
|
19
|
+
backgroundIntervalMs: number;
|
|
20
|
+
recursiveDepth: number;
|
|
21
|
+
qualityDecayRate: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ConsolidationResult {
|
|
24
|
+
memoriesProcessed: number;
|
|
25
|
+
summariesCreated: number;
|
|
26
|
+
lessonsExtracted: number;
|
|
27
|
+
duplicatesSkipped: number;
|
|
28
|
+
tokensReduced: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Memory Consolidation Service
|
|
32
|
+
*/
|
|
33
|
+
export declare class MemoryConsolidator {
|
|
34
|
+
private config;
|
|
35
|
+
private db;
|
|
36
|
+
private contentHashes;
|
|
37
|
+
private lastConsolidationId;
|
|
38
|
+
private backgroundInterval;
|
|
39
|
+
private isRunning;
|
|
40
|
+
private memoryQualityScores;
|
|
41
|
+
constructor(config?: Partial<ConsolidationConfig>);
|
|
42
|
+
/**
|
|
43
|
+
* Initialize with database connection
|
|
44
|
+
*/
|
|
45
|
+
initialize(dbPath: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Load existing content hashes for deduplication
|
|
48
|
+
*/
|
|
49
|
+
private loadContentHashes;
|
|
50
|
+
/**
|
|
51
|
+
* Hash content for deduplication
|
|
52
|
+
*/
|
|
53
|
+
private hashContent;
|
|
54
|
+
/**
|
|
55
|
+
* Check if consolidation should run
|
|
56
|
+
*/
|
|
57
|
+
shouldConsolidate(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Run consolidation process
|
|
60
|
+
*/
|
|
61
|
+
consolidate(): Promise<ConsolidationResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Detect if content contains a lesson/insight
|
|
64
|
+
*/
|
|
65
|
+
private detectLesson;
|
|
66
|
+
/**
|
|
67
|
+
* Check for semantic duplicates using embeddings
|
|
68
|
+
*/
|
|
69
|
+
private checkSemanticDuplicate;
|
|
70
|
+
/**
|
|
71
|
+
* Store session memory
|
|
72
|
+
*/
|
|
73
|
+
private storeSessionMemory;
|
|
74
|
+
/**
|
|
75
|
+
* Store lesson in long-term memory
|
|
76
|
+
*/
|
|
77
|
+
private storeLesson;
|
|
78
|
+
/**
|
|
79
|
+
* Run decay on old memories
|
|
80
|
+
* Formula: effective_importance = importance × (0.95 ^ days_since_access)
|
|
81
|
+
*/
|
|
82
|
+
runDecay(): Promise<number>;
|
|
83
|
+
/**
|
|
84
|
+
* Get consolidation stats
|
|
85
|
+
*/
|
|
86
|
+
getStats(): {
|
|
87
|
+
totalMemories: number;
|
|
88
|
+
totalSessionMemories: number;
|
|
89
|
+
totalLessons: number;
|
|
90
|
+
lastConsolidationId: number;
|
|
91
|
+
uniqueHashes: number;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Start background consolidation process (SimpleMem-style async)
|
|
95
|
+
*/
|
|
96
|
+
startBackgroundConsolidation(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Stop background consolidation
|
|
99
|
+
*/
|
|
100
|
+
stopBackgroundConsolidation(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Recursive consolidation - merge summaries into meta-summaries
|
|
103
|
+
* Based on SimpleMem's hierarchical abstraction
|
|
104
|
+
*/
|
|
105
|
+
recursiveConsolidate(depth?: number): Promise<number>;
|
|
106
|
+
/**
|
|
107
|
+
* Apply quality decay to unused memories (Memory-R1 style)
|
|
108
|
+
*/
|
|
109
|
+
applyQualityDecay(): Promise<number>;
|
|
110
|
+
/**
|
|
111
|
+
* Record memory access (for quality scoring)
|
|
112
|
+
*/
|
|
113
|
+
recordAccess(memoryId: string): void;
|
|
114
|
+
/**
|
|
115
|
+
* Get memory quality score
|
|
116
|
+
*/
|
|
117
|
+
getQualityScore(memoryId: string): number;
|
|
118
|
+
/**
|
|
119
|
+
* Close database connection
|
|
120
|
+
*/
|
|
121
|
+
close(): void;
|
|
122
|
+
}
|
|
123
|
+
export declare function getMemoryConsolidator(config?: Partial<ConsolidationConfig>): MemoryConsolidator;
|
|
124
|
+
//# sourceMappingURL=memory-consolidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-consolidator.d.ts","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAsF;gBAErG,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAIrD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAiB5B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAsGjD;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;YACW,sBAAsB;IAwCpC;;OAEG;YACW,kBAAkB;IAehC;;OAEG;YACW,WAAW;IAWzB;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAwCjC;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB;IAwCD;;OAEG;IACH,4BAA4B,IAAI,IAAI;IA2BpC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAQnC;;;OAGG;IACG,oBAAoB,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAyE9D;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IA8C1C;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASpC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACH,KAAK,IAAI,IAAI;CAOd;AAKD,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,kBAAkB,CAKpB"}
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Consolidation Service for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements the consolidation rules from CLAUDE.md:
|
|
5
|
+
* - Trigger: Every 10 working memory entries
|
|
6
|
+
* - Action: Summarize → session_memories, Extract lessons → semantic memory
|
|
7
|
+
* - Dedup: Skip if content_hash exists OR similarity > 0.92
|
|
8
|
+
*
|
|
9
|
+
* Enhanced with SimpleMem-style recursive consolidation:
|
|
10
|
+
* - Background async consolidation process
|
|
11
|
+
* - Hierarchical abstraction (memories → summaries → meta-summaries)
|
|
12
|
+
* - Quality scoring and automatic pruning
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from 'crypto';
|
|
15
|
+
import { existsSync } from 'fs';
|
|
16
|
+
import Database from 'better-sqlite3';
|
|
17
|
+
import { summarizeMemories, compressMemoryEntry } from './context-compressor.js';
|
|
18
|
+
import { getEmbeddingService } from './embeddings.js';
|
|
19
|
+
import { createSemanticUnit } from './semantic-compression.js';
|
|
20
|
+
const DEFAULT_CONFIG = {
|
|
21
|
+
triggerThreshold: 10,
|
|
22
|
+
minImportanceForLongTerm: 7,
|
|
23
|
+
similarityThreshold: 0.92,
|
|
24
|
+
maxSummaryLength: 500,
|
|
25
|
+
backgroundIntervalMs: 60000, // 1 minute
|
|
26
|
+
recursiveDepth: 3, // memories → summaries → meta-summaries
|
|
27
|
+
qualityDecayRate: 0.95, // 5% decay per day unused
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Memory Consolidation Service
|
|
31
|
+
*/
|
|
32
|
+
export class MemoryConsolidator {
|
|
33
|
+
config;
|
|
34
|
+
db = null;
|
|
35
|
+
contentHashes = new Set();
|
|
36
|
+
lastConsolidationId = 0;
|
|
37
|
+
backgroundInterval = null;
|
|
38
|
+
isRunning = false;
|
|
39
|
+
memoryQualityScores = new Map();
|
|
40
|
+
constructor(config = {}) {
|
|
41
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize with database connection
|
|
45
|
+
*/
|
|
46
|
+
initialize(dbPath) {
|
|
47
|
+
if (!existsSync(dbPath)) {
|
|
48
|
+
throw new Error(`Database not found: ${dbPath}`);
|
|
49
|
+
}
|
|
50
|
+
this.db = new Database(dbPath);
|
|
51
|
+
this.loadContentHashes();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Load existing content hashes for deduplication
|
|
55
|
+
*/
|
|
56
|
+
loadContentHashes() {
|
|
57
|
+
if (!this.db)
|
|
58
|
+
return;
|
|
59
|
+
try {
|
|
60
|
+
const stmt = this.db.prepare(`
|
|
61
|
+
SELECT content FROM memories
|
|
62
|
+
UNION
|
|
63
|
+
SELECT content FROM session_memories
|
|
64
|
+
`);
|
|
65
|
+
const rows = stmt.all();
|
|
66
|
+
for (const row of rows) {
|
|
67
|
+
this.contentHashes.add(this.hashContent(row.content));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Tables might not exist yet
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Hash content for deduplication
|
|
76
|
+
*/
|
|
77
|
+
hashContent(content) {
|
|
78
|
+
return createHash('md5')
|
|
79
|
+
.update(content.toLowerCase().trim())
|
|
80
|
+
.digest('hex');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if consolidation should run
|
|
84
|
+
*/
|
|
85
|
+
shouldConsolidate() {
|
|
86
|
+
if (!this.db)
|
|
87
|
+
return false;
|
|
88
|
+
try {
|
|
89
|
+
const stmt = this.db.prepare(`
|
|
90
|
+
SELECT COUNT(*) as count, MAX(id) as maxId
|
|
91
|
+
FROM memories
|
|
92
|
+
WHERE id > ?
|
|
93
|
+
`);
|
|
94
|
+
const result = stmt.get(this.lastConsolidationId);
|
|
95
|
+
return result.count >= this.config.triggerThreshold;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Run consolidation process
|
|
103
|
+
*/
|
|
104
|
+
async consolidate() {
|
|
105
|
+
if (!this.db) {
|
|
106
|
+
throw new Error('Database not initialized');
|
|
107
|
+
}
|
|
108
|
+
const result = {
|
|
109
|
+
memoriesProcessed: 0,
|
|
110
|
+
summariesCreated: 0,
|
|
111
|
+
lessonsExtracted: 0,
|
|
112
|
+
duplicatesSkipped: 0,
|
|
113
|
+
tokensReduced: 0,
|
|
114
|
+
};
|
|
115
|
+
// Get memories since last consolidation
|
|
116
|
+
const stmt = this.db.prepare(`
|
|
117
|
+
SELECT id, timestamp, type, content
|
|
118
|
+
FROM memories
|
|
119
|
+
WHERE id > ?
|
|
120
|
+
ORDER BY id ASC
|
|
121
|
+
LIMIT 100
|
|
122
|
+
`);
|
|
123
|
+
const memories = stmt.all(this.lastConsolidationId);
|
|
124
|
+
if (memories.length === 0)
|
|
125
|
+
return result;
|
|
126
|
+
result.memoriesProcessed = memories.length;
|
|
127
|
+
const originalTokens = memories.reduce((sum, m) => sum + m.content.length / 4, 0);
|
|
128
|
+
// Group by type for summarization
|
|
129
|
+
const byType = {};
|
|
130
|
+
for (const mem of memories) {
|
|
131
|
+
if (!byType[mem.type])
|
|
132
|
+
byType[mem.type] = [];
|
|
133
|
+
byType[mem.type].push(mem);
|
|
134
|
+
}
|
|
135
|
+
// Create summaries for each type
|
|
136
|
+
for (const [_type, typeMemories] of Object.entries(byType)) {
|
|
137
|
+
if (typeMemories.length >= 3) {
|
|
138
|
+
const summary = summarizeMemories(typeMemories.map(m => ({
|
|
139
|
+
content: m.content,
|
|
140
|
+
timestamp: m.timestamp,
|
|
141
|
+
type: m.type,
|
|
142
|
+
})), this.config.maxSummaryLength);
|
|
143
|
+
const summaryHash = this.hashContent(summary);
|
|
144
|
+
if (!this.contentHashes.has(summaryHash)) {
|
|
145
|
+
// Store in session_memories
|
|
146
|
+
await this.storeSessionMemory(summary, 'summary', 6);
|
|
147
|
+
this.contentHashes.add(summaryHash);
|
|
148
|
+
result.summariesCreated++;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
result.duplicatesSkipped++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Extract lessons from high-importance observations
|
|
156
|
+
const lessons = memories.filter(m => m.type === 'observation' &&
|
|
157
|
+
this.detectLesson(m.content));
|
|
158
|
+
for (const lesson of lessons) {
|
|
159
|
+
const compressed = compressMemoryEntry(lesson.content, { compressionLevel: 'medium' });
|
|
160
|
+
const hash = this.hashContent(compressed.compressed);
|
|
161
|
+
if (!this.contentHashes.has(hash)) {
|
|
162
|
+
// Check semantic similarity
|
|
163
|
+
const isDuplicate = await this.checkSemanticDuplicate(compressed.compressed);
|
|
164
|
+
if (!isDuplicate) {
|
|
165
|
+
await this.storeLesson(compressed.compressed, lesson.timestamp);
|
|
166
|
+
this.contentHashes.add(hash);
|
|
167
|
+
result.lessonsExtracted++;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
result.duplicatesSkipped++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
result.duplicatesSkipped++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Calculate token reduction
|
|
178
|
+
const summaryTokens = result.summariesCreated * (this.config.maxSummaryLength / 4);
|
|
179
|
+
const lessonTokens = result.lessonsExtracted * 100; // Approximate
|
|
180
|
+
result.tokensReduced = Math.max(0, originalTokens - summaryTokens - lessonTokens);
|
|
181
|
+
// Update last consolidation pointer
|
|
182
|
+
this.lastConsolidationId = memories[memories.length - 1].id;
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Detect if content contains a lesson/insight
|
|
187
|
+
*/
|
|
188
|
+
detectLesson(content) {
|
|
189
|
+
const lessonIndicators = [
|
|
190
|
+
/learned that/i,
|
|
191
|
+
/important to/i,
|
|
192
|
+
/mistake was/i,
|
|
193
|
+
/better to/i,
|
|
194
|
+
/should always/i,
|
|
195
|
+
/should never/i,
|
|
196
|
+
/key insight/i,
|
|
197
|
+
/gotcha/i,
|
|
198
|
+
/watch out for/i,
|
|
199
|
+
/best practice/i,
|
|
200
|
+
/pattern/i,
|
|
201
|
+
/tip:/i,
|
|
202
|
+
];
|
|
203
|
+
return lessonIndicators.some(pattern => pattern.test(content));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check for semantic duplicates using embeddings
|
|
207
|
+
*/
|
|
208
|
+
async checkSemanticDuplicate(content) {
|
|
209
|
+
if (!this.db)
|
|
210
|
+
return false;
|
|
211
|
+
try {
|
|
212
|
+
const embeddingService = getEmbeddingService();
|
|
213
|
+
const newEmbedding = await embeddingService.embed(content);
|
|
214
|
+
// Get recent session memories for comparison
|
|
215
|
+
const stmt = this.db.prepare(`
|
|
216
|
+
SELECT content FROM session_memories
|
|
217
|
+
ORDER BY id DESC
|
|
218
|
+
LIMIT 50
|
|
219
|
+
`);
|
|
220
|
+
const existing = stmt.all();
|
|
221
|
+
for (const { content: existingContent } of existing) {
|
|
222
|
+
const existingEmbedding = await embeddingService.embed(existingContent);
|
|
223
|
+
const similarity = embeddingService.cosineSimilarity(newEmbedding, existingEmbedding);
|
|
224
|
+
if (similarity > this.config.similarityThreshold) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Fall back to text comparison
|
|
232
|
+
const normalizedNew = content.toLowerCase().trim();
|
|
233
|
+
const stmt = this.db.prepare(`
|
|
234
|
+
SELECT content FROM session_memories
|
|
235
|
+
WHERE LOWER(TRIM(content)) = ?
|
|
236
|
+
LIMIT 1
|
|
237
|
+
`);
|
|
238
|
+
const match = stmt.get(normalizedNew);
|
|
239
|
+
return !!match;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Store session memory
|
|
244
|
+
*/
|
|
245
|
+
async storeSessionMemory(content, type, importance) {
|
|
246
|
+
if (!this.db)
|
|
247
|
+
return;
|
|
248
|
+
const stmt = this.db.prepare(`
|
|
249
|
+
INSERT OR IGNORE INTO session_memories (session_id, timestamp, type, content, importance)
|
|
250
|
+
VALUES ('consolidation', ?, ?, ?, ?)
|
|
251
|
+
`);
|
|
252
|
+
stmt.run(new Date().toISOString(), type, content, importance);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Store lesson in long-term memory
|
|
256
|
+
*/
|
|
257
|
+
async storeLesson(content, timestamp) {
|
|
258
|
+
if (!this.db)
|
|
259
|
+
return;
|
|
260
|
+
const stmt = this.db.prepare(`
|
|
261
|
+
INSERT OR IGNORE INTO session_memories (session_id, timestamp, type, content, importance)
|
|
262
|
+
VALUES ('lessons', ?, 'lesson', ?, ?)
|
|
263
|
+
`);
|
|
264
|
+
stmt.run(timestamp, content, this.config.minImportanceForLongTerm);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Run decay on old memories
|
|
268
|
+
* Formula: effective_importance = importance × (0.95 ^ days_since_access)
|
|
269
|
+
*/
|
|
270
|
+
async runDecay() {
|
|
271
|
+
if (!this.db)
|
|
272
|
+
return 0;
|
|
273
|
+
try {
|
|
274
|
+
// SQLite doesn't have POW, so we do this in application code
|
|
275
|
+
const stmt = this.db.prepare(`
|
|
276
|
+
SELECT id, importance, timestamp
|
|
277
|
+
FROM session_memories
|
|
278
|
+
WHERE importance > 1
|
|
279
|
+
`);
|
|
280
|
+
const rows = stmt.all();
|
|
281
|
+
let updated = 0;
|
|
282
|
+
const now = Date.now();
|
|
283
|
+
const updateStmt = this.db.prepare(`
|
|
284
|
+
UPDATE session_memories
|
|
285
|
+
SET importance = ?
|
|
286
|
+
WHERE id = ?
|
|
287
|
+
`);
|
|
288
|
+
for (const row of rows) {
|
|
289
|
+
const daysSince = (now - new Date(row.timestamp).getTime()) / (1000 * 60 * 60 * 24);
|
|
290
|
+
const decayed = Math.round(row.importance * Math.pow(0.95, daysSince));
|
|
291
|
+
if (decayed !== row.importance && decayed >= 1) {
|
|
292
|
+
updateStmt.run(decayed, row.id);
|
|
293
|
+
updated++;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return updated;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return 0;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get consolidation stats
|
|
304
|
+
*/
|
|
305
|
+
getStats() {
|
|
306
|
+
if (!this.db) {
|
|
307
|
+
return {
|
|
308
|
+
totalMemories: 0,
|
|
309
|
+
totalSessionMemories: 0,
|
|
310
|
+
totalLessons: 0,
|
|
311
|
+
lastConsolidationId: this.lastConsolidationId,
|
|
312
|
+
uniqueHashes: this.contentHashes.size,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
const memoriesStmt = this.db.prepare('SELECT COUNT(*) as count FROM memories');
|
|
317
|
+
const sessionStmt = this.db.prepare('SELECT COUNT(*) as count FROM session_memories');
|
|
318
|
+
const lessonsStmt = this.db.prepare(`
|
|
319
|
+
SELECT COUNT(*) as count FROM session_memories WHERE type = 'lesson'
|
|
320
|
+
`);
|
|
321
|
+
const memories = memoriesStmt.get().count;
|
|
322
|
+
const session = sessionStmt.get().count;
|
|
323
|
+
const lessons = lessonsStmt.get().count;
|
|
324
|
+
return {
|
|
325
|
+
totalMemories: memories,
|
|
326
|
+
totalSessionMemories: session,
|
|
327
|
+
totalLessons: lessons,
|
|
328
|
+
lastConsolidationId: this.lastConsolidationId,
|
|
329
|
+
uniqueHashes: this.contentHashes.size,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return {
|
|
334
|
+
totalMemories: 0,
|
|
335
|
+
totalSessionMemories: 0,
|
|
336
|
+
totalLessons: 0,
|
|
337
|
+
lastConsolidationId: this.lastConsolidationId,
|
|
338
|
+
uniqueHashes: this.contentHashes.size,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Start background consolidation process (SimpleMem-style async)
|
|
344
|
+
*/
|
|
345
|
+
startBackgroundConsolidation() {
|
|
346
|
+
if (this.backgroundInterval)
|
|
347
|
+
return;
|
|
348
|
+
this.isRunning = true;
|
|
349
|
+
this.backgroundInterval = setInterval(async () => {
|
|
350
|
+
if (!this.isRunning)
|
|
351
|
+
return;
|
|
352
|
+
try {
|
|
353
|
+
// Run consolidation if threshold met
|
|
354
|
+
if (this.shouldConsolidate()) {
|
|
355
|
+
await this.consolidate();
|
|
356
|
+
}
|
|
357
|
+
// Run recursive consolidation on summaries
|
|
358
|
+
await this.recursiveConsolidate();
|
|
359
|
+
// Apply quality decay
|
|
360
|
+
await this.applyQualityDecay();
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.error('[MemoryConsolidator] Background error:', error);
|
|
364
|
+
}
|
|
365
|
+
}, this.config.backgroundIntervalMs);
|
|
366
|
+
console.log(`[MemoryConsolidator] Background consolidation started (interval: ${this.config.backgroundIntervalMs}ms)`);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Stop background consolidation
|
|
370
|
+
*/
|
|
371
|
+
stopBackgroundConsolidation() {
|
|
372
|
+
this.isRunning = false;
|
|
373
|
+
if (this.backgroundInterval) {
|
|
374
|
+
clearInterval(this.backgroundInterval);
|
|
375
|
+
this.backgroundInterval = null;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Recursive consolidation - merge summaries into meta-summaries
|
|
380
|
+
* Based on SimpleMem's hierarchical abstraction
|
|
381
|
+
*/
|
|
382
|
+
async recursiveConsolidate(depth = 0) {
|
|
383
|
+
if (!this.db || depth >= this.config.recursiveDepth)
|
|
384
|
+
return 0;
|
|
385
|
+
let consolidated = 0;
|
|
386
|
+
try {
|
|
387
|
+
// Find summaries that can be merged (same type, adjacent time periods)
|
|
388
|
+
const stmt = this.db.prepare(`
|
|
389
|
+
SELECT id, timestamp, type, content, importance
|
|
390
|
+
FROM session_memories
|
|
391
|
+
WHERE type = 'summary'
|
|
392
|
+
ORDER BY timestamp ASC
|
|
393
|
+
LIMIT 20
|
|
394
|
+
`);
|
|
395
|
+
const summaries = stmt.all();
|
|
396
|
+
// Group adjacent summaries (within 24 hours)
|
|
397
|
+
const groups = [];
|
|
398
|
+
let currentGroup = [];
|
|
399
|
+
for (const summary of summaries) {
|
|
400
|
+
if (currentGroup.length === 0) {
|
|
401
|
+
currentGroup.push(summary);
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
const lastTime = new Date(currentGroup[currentGroup.length - 1].timestamp).getTime();
|
|
405
|
+
const thisTime = new Date(summary.timestamp).getTime();
|
|
406
|
+
const hoursDiff = (thisTime - lastTime) / (1000 * 60 * 60);
|
|
407
|
+
if (hoursDiff <= 24) {
|
|
408
|
+
currentGroup.push(summary);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
if (currentGroup.length >= 3)
|
|
412
|
+
groups.push(currentGroup);
|
|
413
|
+
currentGroup = [summary];
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (currentGroup.length >= 3)
|
|
418
|
+
groups.push(currentGroup);
|
|
419
|
+
// Create meta-summaries from groups
|
|
420
|
+
for (const group of groups) {
|
|
421
|
+
const unit = createSemanticUnit(group.map(s => ({ content: s.content, importance: s.importance })));
|
|
422
|
+
if (unit.compressionRatio > 1.2) {
|
|
423
|
+
const metaSummary = unit.atomicFacts.map(f => f.content).join(' ');
|
|
424
|
+
const hash = this.hashContent(metaSummary);
|
|
425
|
+
if (!this.contentHashes.has(hash)) {
|
|
426
|
+
await this.storeSessionMemory(metaSummary, 'meta-summary', 8);
|
|
427
|
+
this.contentHashes.add(hash);
|
|
428
|
+
consolidated++;
|
|
429
|
+
// Remove original summaries
|
|
430
|
+
const ids = group.map(s => s.id);
|
|
431
|
+
this.db.prepare(`DELETE FROM session_memories WHERE id IN (${ids.join(',')})`).run();
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
// Ignore errors
|
|
438
|
+
}
|
|
439
|
+
return consolidated;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Apply quality decay to unused memories (Memory-R1 style)
|
|
443
|
+
*/
|
|
444
|
+
async applyQualityDecay() {
|
|
445
|
+
if (!this.db)
|
|
446
|
+
return 0;
|
|
447
|
+
const now = Date.now();
|
|
448
|
+
let updated = 0;
|
|
449
|
+
try {
|
|
450
|
+
const stmt = this.db.prepare(`
|
|
451
|
+
SELECT id, importance, timestamp
|
|
452
|
+
FROM session_memories
|
|
453
|
+
WHERE importance > 1
|
|
454
|
+
`);
|
|
455
|
+
const rows = stmt.all();
|
|
456
|
+
const updateStmt = this.db.prepare(`
|
|
457
|
+
UPDATE session_memories SET importance = ? WHERE id = ?
|
|
458
|
+
`);
|
|
459
|
+
for (const row of rows) {
|
|
460
|
+
const memKey = `session-${row.id}`;
|
|
461
|
+
const quality = this.memoryQualityScores.get(memKey);
|
|
462
|
+
// Calculate days since last access (or creation)
|
|
463
|
+
const lastAccess = quality?.lastAccessed || new Date(row.timestamp);
|
|
464
|
+
const daysSince = (now - lastAccess.getTime()) / (1000 * 60 * 60 * 24);
|
|
465
|
+
// Apply decay: importance * (decayRate ^ days)
|
|
466
|
+
const decayed = Math.round(row.importance * Math.pow(this.config.qualityDecayRate, daysSince));
|
|
467
|
+
if (decayed !== row.importance && decayed >= 1) {
|
|
468
|
+
updateStmt.run(decayed, row.id);
|
|
469
|
+
updated++;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
// Ignore errors
|
|
475
|
+
}
|
|
476
|
+
return updated;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Record memory access (for quality scoring)
|
|
480
|
+
*/
|
|
481
|
+
recordAccess(memoryId) {
|
|
482
|
+
const existing = this.memoryQualityScores.get(memoryId);
|
|
483
|
+
this.memoryQualityScores.set(memoryId, {
|
|
484
|
+
score: (existing?.score || 5) + 0.5,
|
|
485
|
+
lastAccessed: new Date(),
|
|
486
|
+
accessCount: (existing?.accessCount || 0) + 1,
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Get memory quality score
|
|
491
|
+
*/
|
|
492
|
+
getQualityScore(memoryId) {
|
|
493
|
+
return this.memoryQualityScores.get(memoryId)?.score || 5;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Close database connection
|
|
497
|
+
*/
|
|
498
|
+
close() {
|
|
499
|
+
this.stopBackgroundConsolidation();
|
|
500
|
+
if (this.db) {
|
|
501
|
+
this.db.close();
|
|
502
|
+
this.db = null;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// Singleton instance
|
|
507
|
+
let globalConsolidator = null;
|
|
508
|
+
export function getMemoryConsolidator(config) {
|
|
509
|
+
if (!globalConsolidator) {
|
|
510
|
+
globalConsolidator = new MemoryConsolidator(config);
|
|
511
|
+
}
|
|
512
|
+
return globalConsolidator;
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=memory-consolidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-consolidator.js","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"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"}
|