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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchical Memory System for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements hot/warm/cold memory tiering with automatic promotion/demotion.
|
|
5
|
+
* Based on MemGPT and R³Mem research for efficient memory management.
|
|
6
|
+
*/
|
|
7
|
+
export interface MemoryEntry {
|
|
8
|
+
id: string;
|
|
9
|
+
content: string;
|
|
10
|
+
type: 'action' | 'observation' | 'thought' | 'goal';
|
|
11
|
+
timestamp: string;
|
|
12
|
+
importance: number;
|
|
13
|
+
accessCount: number;
|
|
14
|
+
lastAccessed: string;
|
|
15
|
+
embedding?: number[];
|
|
16
|
+
compressed?: string;
|
|
17
|
+
tier?: 'hot' | 'warm' | 'cold';
|
|
18
|
+
}
|
|
19
|
+
export interface TieredMemory {
|
|
20
|
+
hot: MemoryEntry[];
|
|
21
|
+
warm: MemoryEntry[];
|
|
22
|
+
cold: MemoryEntry[];
|
|
23
|
+
}
|
|
24
|
+
export interface HierarchicalConfig {
|
|
25
|
+
hotMaxEntries: number;
|
|
26
|
+
warmMaxEntries: number;
|
|
27
|
+
coldMaxEntries: number;
|
|
28
|
+
hotMaxTokens: number;
|
|
29
|
+
warmMaxTokens: number;
|
|
30
|
+
decayRate: number;
|
|
31
|
+
promotionThreshold: number;
|
|
32
|
+
demotionThreshold: number;
|
|
33
|
+
staleDaysThreshold: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Calculate effective importance with time decay
|
|
37
|
+
* Formula: effective_importance = importance × (decayRate ^ days_since_access)
|
|
38
|
+
*/
|
|
39
|
+
export declare function calculateEffectiveImportance(entry: MemoryEntry, decayRate?: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* Hierarchical Memory Manager
|
|
42
|
+
*/
|
|
43
|
+
export declare class HierarchicalMemoryManager {
|
|
44
|
+
private config;
|
|
45
|
+
private memory;
|
|
46
|
+
private accessLog;
|
|
47
|
+
constructor(config?: Partial<HierarchicalConfig>);
|
|
48
|
+
/**
|
|
49
|
+
* Add a new memory entry
|
|
50
|
+
*/
|
|
51
|
+
add(entry: Omit<MemoryEntry, 'accessCount' | 'lastAccessed' | 'tier'>): void;
|
|
52
|
+
/**
|
|
53
|
+
* Access a memory (promote if accessed frequently)
|
|
54
|
+
*/
|
|
55
|
+
access(id: string): MemoryEntry | null;
|
|
56
|
+
/**
|
|
57
|
+
* Query memories with automatic tier traversal
|
|
58
|
+
*/
|
|
59
|
+
query(queryText: string, limit?: number): Promise<MemoryEntry[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Get hot tier context (for inclusion in prompts)
|
|
62
|
+
*/
|
|
63
|
+
getHotContext(): {
|
|
64
|
+
entries: MemoryEntry[];
|
|
65
|
+
tokens: number;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Consolidate old memories into summaries
|
|
69
|
+
*/
|
|
70
|
+
consolidate(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Prune stale entries that haven't been accessed within staleDaysThreshold.
|
|
73
|
+
* Demotes from hot -> warm, or warm -> cold.
|
|
74
|
+
*/
|
|
75
|
+
pruneStale(): number;
|
|
76
|
+
/**
|
|
77
|
+
* Enforce token budget on hot and warm tiers.
|
|
78
|
+
* Demotes entries when token budget is exceeded.
|
|
79
|
+
*/
|
|
80
|
+
enforceTokenBudget(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Rebalance tiers based on importance and access patterns
|
|
83
|
+
*/
|
|
84
|
+
private rebalance;
|
|
85
|
+
/**
|
|
86
|
+
* Check and promote entry if accessed frequently
|
|
87
|
+
*/
|
|
88
|
+
private checkPromotion;
|
|
89
|
+
/**
|
|
90
|
+
* Find entry across all tiers
|
|
91
|
+
*/
|
|
92
|
+
private findEntry;
|
|
93
|
+
/**
|
|
94
|
+
* Simple text similarity (delegates to shared utility)
|
|
95
|
+
*/
|
|
96
|
+
private textSimilarity;
|
|
97
|
+
/**
|
|
98
|
+
* Get stats about memory usage
|
|
99
|
+
*/
|
|
100
|
+
getStats(): {
|
|
101
|
+
hot: {
|
|
102
|
+
count: number;
|
|
103
|
+
tokens: number;
|
|
104
|
+
};
|
|
105
|
+
warm: {
|
|
106
|
+
count: number;
|
|
107
|
+
tokens: number;
|
|
108
|
+
};
|
|
109
|
+
cold: {
|
|
110
|
+
count: number;
|
|
111
|
+
tokens: number;
|
|
112
|
+
};
|
|
113
|
+
total: {
|
|
114
|
+
count: number;
|
|
115
|
+
tokens: number;
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Export all memories (for persistence)
|
|
120
|
+
*/
|
|
121
|
+
export(): TieredMemory;
|
|
122
|
+
/**
|
|
123
|
+
* Import memories (for initialization)
|
|
124
|
+
*/
|
|
125
|
+
import(data: TieredMemory): void;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Persist hierarchical memory to SQLite for cross-session continuity
|
|
129
|
+
*/
|
|
130
|
+
export declare function persistToSQLite(manager: HierarchicalMemoryManager, dbPath: string): void;
|
|
131
|
+
/**
|
|
132
|
+
* Load hierarchical memory from SQLite
|
|
133
|
+
*/
|
|
134
|
+
export declare function loadFromSQLite(dbPath: string): TieredMemory | null;
|
|
135
|
+
export declare function getHierarchicalMemoryManager(config?: Partial<HierarchicalConfig>, dbPath?: string): HierarchicalMemoryManager;
|
|
136
|
+
/**
|
|
137
|
+
* Save current hierarchical memory state to disk
|
|
138
|
+
* Call periodically or on shutdown to ensure persistence
|
|
139
|
+
*/
|
|
140
|
+
export declare function saveHierarchicalMemory(dbPath?: string): void;
|
|
141
|
+
//# sourceMappingURL=hierarchical-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchical-memory.d.ts","sourceRoot":"","sources":["../../src/memory/hierarchical-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchical Memory System for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements hot/warm/cold memory tiering with automatic promotion/demotion.
|
|
5
|
+
* Based on MemGPT and R³Mem research for efficient memory management.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
9
|
+
import { dirname } from 'path';
|
|
10
|
+
import { getEmbeddingService } from './embeddings.js';
|
|
11
|
+
import { compressMemoryEntry, summarizeMemories, estimateTokens } from './context-compressor.js';
|
|
12
|
+
import { jaccardSimilarity } from '../utils/string-similarity.js';
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
hotMaxEntries: 10,
|
|
15
|
+
warmMaxEntries: 50,
|
|
16
|
+
coldMaxEntries: 500,
|
|
17
|
+
hotMaxTokens: 2000,
|
|
18
|
+
warmMaxTokens: 8000,
|
|
19
|
+
decayRate: 0.95,
|
|
20
|
+
promotionThreshold: 0.7,
|
|
21
|
+
demotionThreshold: 0.3,
|
|
22
|
+
staleDaysThreshold: 14,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Calculate effective importance with time decay
|
|
26
|
+
* Formula: effective_importance = importance × (decayRate ^ days_since_access)
|
|
27
|
+
*/
|
|
28
|
+
export function calculateEffectiveImportance(entry, decayRate = 0.95) {
|
|
29
|
+
const lastAccessed = new Date(entry.lastAccessed);
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const daysSinceAccess = (now.getTime() - lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
|
|
32
|
+
return entry.importance * Math.pow(decayRate, daysSinceAccess);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Hierarchical Memory Manager
|
|
36
|
+
*/
|
|
37
|
+
export class HierarchicalMemoryManager {
|
|
38
|
+
config;
|
|
39
|
+
memory;
|
|
40
|
+
accessLog = new Map();
|
|
41
|
+
constructor(config = {}) {
|
|
42
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
43
|
+
this.memory = { hot: [], warm: [], cold: [] };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Add a new memory entry
|
|
47
|
+
*/
|
|
48
|
+
add(entry) {
|
|
49
|
+
const now = new Date().toISOString();
|
|
50
|
+
const fullEntry = {
|
|
51
|
+
...entry,
|
|
52
|
+
accessCount: 1,
|
|
53
|
+
lastAccessed: now,
|
|
54
|
+
tier: 'hot',
|
|
55
|
+
};
|
|
56
|
+
// Add to hot tier
|
|
57
|
+
this.memory.hot.unshift(fullEntry);
|
|
58
|
+
// Trigger rebalancing
|
|
59
|
+
this.rebalance();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Access a memory (promote if accessed frequently)
|
|
63
|
+
*/
|
|
64
|
+
access(id) {
|
|
65
|
+
const entry = this.findEntry(id);
|
|
66
|
+
if (!entry)
|
|
67
|
+
return null;
|
|
68
|
+
// Update access metrics
|
|
69
|
+
entry.accessCount++;
|
|
70
|
+
entry.lastAccessed = new Date().toISOString();
|
|
71
|
+
// Log access for pattern analysis
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const accessTimes = this.accessLog.get(id) || [];
|
|
74
|
+
accessTimes.push(now);
|
|
75
|
+
this.accessLog.set(id, accessTimes.slice(-10)); // Keep last 10 access times
|
|
76
|
+
// Check for promotion
|
|
77
|
+
this.checkPromotion(entry);
|
|
78
|
+
return entry;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Query memories with automatic tier traversal
|
|
82
|
+
*/
|
|
83
|
+
async query(queryText, limit = 5) {
|
|
84
|
+
const results = [];
|
|
85
|
+
const embeddingService = getEmbeddingService();
|
|
86
|
+
// First check hot tier (always include recent)
|
|
87
|
+
for (const entry of this.memory.hot) {
|
|
88
|
+
const score = this.textSimilarity(queryText, entry.content);
|
|
89
|
+
if (score > 0.3) {
|
|
90
|
+
results.push({ entry, score: score + 0.3 }); // Bonus for hot tier
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Check warm tier
|
|
94
|
+
for (const entry of this.memory.warm) {
|
|
95
|
+
const score = this.textSimilarity(queryText, entry.content);
|
|
96
|
+
if (score > 0.4) {
|
|
97
|
+
results.push({ entry, score: score + 0.1 }); // Small bonus for warm
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Semantic search in cold tier if we need more results
|
|
101
|
+
if (results.length < limit && this.memory.cold.length > 0) {
|
|
102
|
+
try {
|
|
103
|
+
const queryEmbedding = await embeddingService.embed(queryText);
|
|
104
|
+
for (const entry of this.memory.cold) {
|
|
105
|
+
if (entry.embedding) {
|
|
106
|
+
const score = embeddingService.cosineSimilarity(queryEmbedding, entry.embedding);
|
|
107
|
+
if (score > 0.5) {
|
|
108
|
+
results.push({ entry, score });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Fall back to text similarity
|
|
115
|
+
for (const entry of this.memory.cold) {
|
|
116
|
+
const score = this.textSimilarity(queryText, entry.content);
|
|
117
|
+
if (score > 0.5) {
|
|
118
|
+
results.push({ entry, score });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Sort by score and return top entries
|
|
124
|
+
results.sort((a, b) => b.score - a.score);
|
|
125
|
+
const topEntries = results.slice(0, limit).map(r => r.entry);
|
|
126
|
+
// Mark accessed entries
|
|
127
|
+
for (const entry of topEntries) {
|
|
128
|
+
this.access(entry.id);
|
|
129
|
+
}
|
|
130
|
+
return topEntries;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get hot tier context (for inclusion in prompts)
|
|
134
|
+
*/
|
|
135
|
+
getHotContext() {
|
|
136
|
+
let totalTokens = 0;
|
|
137
|
+
const entries = [];
|
|
138
|
+
for (const entry of this.memory.hot) {
|
|
139
|
+
const tokens = estimateTokens(entry.content);
|
|
140
|
+
if (totalTokens + tokens <= this.config.hotMaxTokens) {
|
|
141
|
+
entries.push(entry);
|
|
142
|
+
totalTokens += tokens;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { entries, tokens: totalTokens };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Consolidate old memories into summaries
|
|
149
|
+
*/
|
|
150
|
+
async consolidate() {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const oneDayAgo = now - 24 * 60 * 60 * 1000;
|
|
153
|
+
// Find old warm entries to summarize
|
|
154
|
+
const oldWarm = this.memory.warm.filter(e => new Date(e.lastAccessed).getTime() < oneDayAgo);
|
|
155
|
+
if (oldWarm.length >= 10) {
|
|
156
|
+
// Create summary
|
|
157
|
+
const summary = summarizeMemories(oldWarm);
|
|
158
|
+
// Add summary as new cold entry
|
|
159
|
+
const summaryEntry = {
|
|
160
|
+
id: `summary-${Date.now()}`,
|
|
161
|
+
content: summary,
|
|
162
|
+
type: 'observation',
|
|
163
|
+
timestamp: new Date().toISOString(),
|
|
164
|
+
importance: 6,
|
|
165
|
+
accessCount: 1,
|
|
166
|
+
lastAccessed: new Date().toISOString(),
|
|
167
|
+
tier: 'cold',
|
|
168
|
+
};
|
|
169
|
+
this.memory.cold.unshift(summaryEntry);
|
|
170
|
+
// Remove summarized entries from warm
|
|
171
|
+
const oldIds = new Set(oldWarm.map(e => e.id));
|
|
172
|
+
this.memory.warm = this.memory.warm.filter(e => !oldIds.has(e.id));
|
|
173
|
+
// Limit cold tier size
|
|
174
|
+
if (this.memory.cold.length > this.config.coldMaxEntries) {
|
|
175
|
+
this.memory.cold = this.memory.cold.slice(0, this.config.coldMaxEntries);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Prune stale entries that haven't been accessed within staleDaysThreshold.
|
|
181
|
+
* Demotes from hot -> warm, or warm -> cold.
|
|
182
|
+
*/
|
|
183
|
+
pruneStale() {
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
const threshold = this.config.staleDaysThreshold * 24 * 60 * 60 * 1000;
|
|
186
|
+
let pruned = 0;
|
|
187
|
+
// Demote stale hot entries to warm
|
|
188
|
+
const staleHot = this.memory.hot.filter(e => {
|
|
189
|
+
const lastAccess = new Date(e.lastAccessed).getTime();
|
|
190
|
+
return (now - lastAccess) > threshold;
|
|
191
|
+
});
|
|
192
|
+
for (const entry of staleHot) {
|
|
193
|
+
entry.tier = 'warm';
|
|
194
|
+
this.memory.warm.unshift(entry);
|
|
195
|
+
pruned++;
|
|
196
|
+
}
|
|
197
|
+
this.memory.hot = this.memory.hot.filter(e => !staleHot.includes(e));
|
|
198
|
+
// Demote stale warm entries to cold
|
|
199
|
+
const staleWarm = this.memory.warm.filter(e => {
|
|
200
|
+
const lastAccess = new Date(e.lastAccessed).getTime();
|
|
201
|
+
return (now - lastAccess) > threshold * 2; // 2x threshold for warm
|
|
202
|
+
});
|
|
203
|
+
for (const entry of staleWarm) {
|
|
204
|
+
entry.tier = 'cold';
|
|
205
|
+
const compressed = compressMemoryEntry(entry.content, { compressionLevel: 'aggressive' });
|
|
206
|
+
entry.compressed = compressed.compressed;
|
|
207
|
+
this.memory.cold.unshift(entry);
|
|
208
|
+
pruned++;
|
|
209
|
+
}
|
|
210
|
+
this.memory.warm = this.memory.warm.filter(e => !staleWarm.includes(e));
|
|
211
|
+
return pruned;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Enforce token budget on hot and warm tiers.
|
|
215
|
+
* Demotes entries when token budget is exceeded.
|
|
216
|
+
*/
|
|
217
|
+
enforceTokenBudget() {
|
|
218
|
+
let demoted = 0;
|
|
219
|
+
// Enforce hot tier token budget
|
|
220
|
+
let hotTokens = this.memory.hot.reduce((sum, e) => sum + estimateTokens(e.content), 0);
|
|
221
|
+
while (hotTokens > this.config.hotMaxTokens && this.memory.hot.length > 1) {
|
|
222
|
+
const lowest = this.memory.hot.reduce((min, e) => calculateEffectiveImportance(e, this.config.decayRate) <
|
|
223
|
+
calculateEffectiveImportance(min, this.config.decayRate) ? e : min);
|
|
224
|
+
lowest.tier = 'warm';
|
|
225
|
+
this.memory.warm.unshift(lowest);
|
|
226
|
+
this.memory.hot = this.memory.hot.filter(e => e.id !== lowest.id);
|
|
227
|
+
hotTokens -= estimateTokens(lowest.content);
|
|
228
|
+
demoted++;
|
|
229
|
+
}
|
|
230
|
+
// Enforce warm tier token budget
|
|
231
|
+
let warmTokens = this.memory.warm.reduce((sum, e) => sum + estimateTokens(e.content), 0);
|
|
232
|
+
while (warmTokens > this.config.warmMaxTokens && this.memory.warm.length > 1) {
|
|
233
|
+
const lowest = this.memory.warm.reduce((min, e) => calculateEffectiveImportance(e, this.config.decayRate) <
|
|
234
|
+
calculateEffectiveImportance(min, this.config.decayRate) ? e : min);
|
|
235
|
+
lowest.tier = 'cold';
|
|
236
|
+
const compressed = compressMemoryEntry(lowest.content, { compressionLevel: 'aggressive' });
|
|
237
|
+
lowest.compressed = compressed.compressed;
|
|
238
|
+
this.memory.cold.unshift(lowest);
|
|
239
|
+
this.memory.warm = this.memory.warm.filter(e => e.id !== lowest.id);
|
|
240
|
+
warmTokens -= estimateTokens(lowest.content);
|
|
241
|
+
demoted++;
|
|
242
|
+
}
|
|
243
|
+
return demoted;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Rebalance tiers based on importance and access patterns
|
|
247
|
+
*/
|
|
248
|
+
rebalance() {
|
|
249
|
+
const { hotMaxEntries, warmMaxEntries, decayRate } = this.config;
|
|
250
|
+
// Calculate effective importance for all entries
|
|
251
|
+
const scoredHot = this.memory.hot.map(e => ({
|
|
252
|
+
entry: e,
|
|
253
|
+
score: calculateEffectiveImportance(e, decayRate),
|
|
254
|
+
}));
|
|
255
|
+
const scoredWarm = this.memory.warm.map(e => ({
|
|
256
|
+
entry: e,
|
|
257
|
+
score: calculateEffectiveImportance(e, decayRate),
|
|
258
|
+
}));
|
|
259
|
+
// Sort hot tier
|
|
260
|
+
scoredHot.sort((a, b) => b.score - a.score);
|
|
261
|
+
// Demote excess hot entries to warm
|
|
262
|
+
if (scoredHot.length > hotMaxEntries) {
|
|
263
|
+
const demoted = scoredHot.slice(hotMaxEntries);
|
|
264
|
+
for (const { entry } of demoted) {
|
|
265
|
+
entry.tier = 'warm';
|
|
266
|
+
this.memory.warm.unshift(entry);
|
|
267
|
+
}
|
|
268
|
+
this.memory.hot = scoredHot.slice(0, hotMaxEntries).map(s => s.entry);
|
|
269
|
+
}
|
|
270
|
+
// Sort warm tier
|
|
271
|
+
scoredWarm.sort((a, b) => b.score - a.score);
|
|
272
|
+
// Demote excess warm entries to cold
|
|
273
|
+
if (this.memory.warm.length > warmMaxEntries) {
|
|
274
|
+
const demoted = this.memory.warm.slice(warmMaxEntries);
|
|
275
|
+
for (const entry of demoted) {
|
|
276
|
+
entry.tier = 'cold';
|
|
277
|
+
// Compress content before moving to cold
|
|
278
|
+
const compressed = compressMemoryEntry(entry.content, { compressionLevel: 'aggressive' });
|
|
279
|
+
entry.compressed = compressed.compressed;
|
|
280
|
+
this.memory.cold.unshift(entry);
|
|
281
|
+
}
|
|
282
|
+
this.memory.warm = this.memory.warm.slice(0, warmMaxEntries);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Check and promote entry if accessed frequently
|
|
287
|
+
*/
|
|
288
|
+
checkPromotion(entry) {
|
|
289
|
+
if (entry.tier === 'hot')
|
|
290
|
+
return;
|
|
291
|
+
const accessTimes = this.accessLog.get(entry.id) || [];
|
|
292
|
+
// Calculate access frequency (accesses per hour)
|
|
293
|
+
if (accessTimes.length >= 3) {
|
|
294
|
+
const timeSpan = accessTimes[accessTimes.length - 1] - accessTimes[0];
|
|
295
|
+
const hoursSpan = timeSpan / (1000 * 60 * 60) || 1;
|
|
296
|
+
const frequency = accessTimes.length / hoursSpan;
|
|
297
|
+
// Promote if accessed more than once per hour
|
|
298
|
+
if (frequency > 1 && entry.tier === 'warm') {
|
|
299
|
+
entry.tier = 'hot';
|
|
300
|
+
this.memory.warm = this.memory.warm.filter(e => e.id !== entry.id);
|
|
301
|
+
this.memory.hot.unshift(entry);
|
|
302
|
+
this.rebalance();
|
|
303
|
+
}
|
|
304
|
+
else if (frequency > 0.5 && entry.tier === 'cold') {
|
|
305
|
+
entry.tier = 'warm';
|
|
306
|
+
this.memory.cold = this.memory.cold.filter(e => e.id !== entry.id);
|
|
307
|
+
this.memory.warm.unshift(entry);
|
|
308
|
+
this.rebalance();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Find entry across all tiers
|
|
314
|
+
*/
|
|
315
|
+
findEntry(id) {
|
|
316
|
+
for (const tier of ['hot', 'warm', 'cold']) {
|
|
317
|
+
const entry = this.memory[tier].find(e => e.id === id);
|
|
318
|
+
if (entry)
|
|
319
|
+
return entry;
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Simple text similarity (delegates to shared utility)
|
|
325
|
+
*/
|
|
326
|
+
textSimilarity(a, b) {
|
|
327
|
+
return jaccardSimilarity(a, b);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get stats about memory usage
|
|
331
|
+
*/
|
|
332
|
+
getStats() {
|
|
333
|
+
const hotTokens = this.memory.hot.reduce((sum, e) => sum + estimateTokens(e.content), 0);
|
|
334
|
+
const warmTokens = this.memory.warm.reduce((sum, e) => sum + estimateTokens(e.content), 0);
|
|
335
|
+
const coldTokens = this.memory.cold.reduce((sum, e) => sum + estimateTokens(e.compressed || e.content), 0);
|
|
336
|
+
return {
|
|
337
|
+
hot: { count: this.memory.hot.length, tokens: hotTokens },
|
|
338
|
+
warm: { count: this.memory.warm.length, tokens: warmTokens },
|
|
339
|
+
cold: { count: this.memory.cold.length, tokens: coldTokens },
|
|
340
|
+
total: {
|
|
341
|
+
count: this.memory.hot.length + this.memory.warm.length + this.memory.cold.length,
|
|
342
|
+
tokens: hotTokens + warmTokens + coldTokens,
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Export all memories (for persistence)
|
|
348
|
+
*/
|
|
349
|
+
export() {
|
|
350
|
+
return { ...this.memory };
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Import memories (for initialization)
|
|
354
|
+
*/
|
|
355
|
+
import(data) {
|
|
356
|
+
this.memory = { ...data };
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Persist hierarchical memory to SQLite for cross-session continuity
|
|
361
|
+
*/
|
|
362
|
+
export function persistToSQLite(manager, dbPath) {
|
|
363
|
+
const dir = dirname(dbPath);
|
|
364
|
+
if (!existsSync(dir)) {
|
|
365
|
+
mkdirSync(dir, { recursive: true });
|
|
366
|
+
}
|
|
367
|
+
const db = new Database(dbPath);
|
|
368
|
+
// Create hierarchical memory table
|
|
369
|
+
db.exec(`
|
|
370
|
+
CREATE TABLE IF NOT EXISTS hierarchical_memory (
|
|
371
|
+
id TEXT PRIMARY KEY,
|
|
372
|
+
tier TEXT NOT NULL CHECK(tier IN ('hot', 'warm', 'cold')),
|
|
373
|
+
content TEXT NOT NULL,
|
|
374
|
+
compressed TEXT,
|
|
375
|
+
type TEXT NOT NULL,
|
|
376
|
+
timestamp TEXT NOT NULL,
|
|
377
|
+
importance REAL NOT NULL,
|
|
378
|
+
access_count INTEGER NOT NULL DEFAULT 1,
|
|
379
|
+
last_accessed TEXT NOT NULL,
|
|
380
|
+
embedding BLOB
|
|
381
|
+
);
|
|
382
|
+
CREATE INDEX IF NOT EXISTS idx_hierarchical_tier ON hierarchical_memory(tier);
|
|
383
|
+
CREATE INDEX IF NOT EXISTS idx_hierarchical_importance ON hierarchical_memory(importance DESC);
|
|
384
|
+
`);
|
|
385
|
+
const memory = manager.export();
|
|
386
|
+
// Clear and reinsert (simple approach for small datasets)
|
|
387
|
+
db.exec('DELETE FROM hierarchical_memory');
|
|
388
|
+
const stmt = db.prepare(`
|
|
389
|
+
INSERT INTO hierarchical_memory
|
|
390
|
+
(id, tier, content, compressed, type, timestamp, importance, access_count, last_accessed, embedding)
|
|
391
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
392
|
+
`);
|
|
393
|
+
const insertAll = db.transaction((entries) => {
|
|
394
|
+
for (const { tier, entry } of entries) {
|
|
395
|
+
stmt.run(entry.id, tier, entry.content, entry.compressed || null, entry.type, entry.timestamp, entry.importance, entry.accessCount, entry.lastAccessed, entry.embedding ? Buffer.from(new Float32Array(entry.embedding).buffer) : null);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
const allEntries = [
|
|
399
|
+
...memory.hot.map(e => ({ tier: 'hot', entry: e })),
|
|
400
|
+
...memory.warm.map(e => ({ tier: 'warm', entry: e })),
|
|
401
|
+
...memory.cold.map(e => ({ tier: 'cold', entry: e })),
|
|
402
|
+
];
|
|
403
|
+
insertAll(allEntries);
|
|
404
|
+
db.close();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Load hierarchical memory from SQLite
|
|
408
|
+
*/
|
|
409
|
+
export function loadFromSQLite(dbPath) {
|
|
410
|
+
if (!existsSync(dbPath))
|
|
411
|
+
return null;
|
|
412
|
+
try {
|
|
413
|
+
const db = new Database(dbPath, { readonly: true });
|
|
414
|
+
// Check if table exists
|
|
415
|
+
const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='hierarchical_memory'").get();
|
|
416
|
+
if (!tableExists) {
|
|
417
|
+
db.close();
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
const rows = db.prepare(`
|
|
421
|
+
SELECT id, tier, content, compressed, type, timestamp, importance,
|
|
422
|
+
access_count as accessCount, last_accessed as lastAccessed, embedding
|
|
423
|
+
FROM hierarchical_memory
|
|
424
|
+
`).all();
|
|
425
|
+
db.close();
|
|
426
|
+
const memory = { hot: [], warm: [], cold: [] };
|
|
427
|
+
for (const row of rows) {
|
|
428
|
+
const entry = {
|
|
429
|
+
id: row.id,
|
|
430
|
+
content: row.content,
|
|
431
|
+
compressed: row.compressed || undefined,
|
|
432
|
+
type: row.type,
|
|
433
|
+
timestamp: row.timestamp,
|
|
434
|
+
importance: row.importance,
|
|
435
|
+
accessCount: row.accessCount,
|
|
436
|
+
lastAccessed: row.lastAccessed,
|
|
437
|
+
tier: row.tier,
|
|
438
|
+
embedding: row.embedding ? Array.from(new Float32Array(row.embedding.buffer)) : undefined,
|
|
439
|
+
};
|
|
440
|
+
memory[row.tier].push(entry);
|
|
441
|
+
}
|
|
442
|
+
return memory;
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Singleton instance with optional persistence path
|
|
449
|
+
let globalManager = null;
|
|
450
|
+
let globalDbPath = null;
|
|
451
|
+
export function getHierarchicalMemoryManager(config, dbPath) {
|
|
452
|
+
if (!globalManager) {
|
|
453
|
+
globalManager = new HierarchicalMemoryManager(config);
|
|
454
|
+
// Load from SQLite if path provided
|
|
455
|
+
if (dbPath) {
|
|
456
|
+
globalDbPath = dbPath;
|
|
457
|
+
const persisted = loadFromSQLite(dbPath);
|
|
458
|
+
if (persisted) {
|
|
459
|
+
globalManager.import(persisted);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return globalManager;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Save current hierarchical memory state to disk
|
|
467
|
+
* Call periodically or on shutdown to ensure persistence
|
|
468
|
+
*/
|
|
469
|
+
export function saveHierarchicalMemory(dbPath) {
|
|
470
|
+
if (!globalManager)
|
|
471
|
+
return;
|
|
472
|
+
const path = dbPath || globalDbPath;
|
|
473
|
+
if (path) {
|
|
474
|
+
persistToSQLite(globalManager, path);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=hierarchical-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchical-memory.js","sourceRoot":"","sources":["../../src/memory/hierarchical-memory.ts"],"names":[],"mappings":"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"}
|