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,168 @@
|
|
|
1
|
+
import { QdrantClient } from '@qdrant/js-client-rest';
|
|
2
|
+
import { getEmbeddingService } from '../embeddings.js';
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Generate a safe collection name from project ID
|
|
6
|
+
* Qdrant collection names must be alphanumeric with underscores
|
|
7
|
+
*/
|
|
8
|
+
function sanitizeCollectionName(base, projectId) {
|
|
9
|
+
if (!projectId)
|
|
10
|
+
return base;
|
|
11
|
+
// Create a short hash of the project ID for uniqueness
|
|
12
|
+
const hash = createHash('sha256').update(projectId).digest('hex').slice(0, 8);
|
|
13
|
+
// Sanitize project name (take last path component, remove special chars)
|
|
14
|
+
const projectName = projectId
|
|
15
|
+
.split(/[/\\]/).pop() || projectId
|
|
16
|
+
.replace(/[^a-zA-Z0-9_-]/g, '_')
|
|
17
|
+
.slice(0, 32);
|
|
18
|
+
return `${base}_${projectName}_${hash}`;
|
|
19
|
+
}
|
|
20
|
+
export class QdrantCloudBackend {
|
|
21
|
+
client;
|
|
22
|
+
collection;
|
|
23
|
+
projectId;
|
|
24
|
+
vectorSize;
|
|
25
|
+
collectionVerified = false;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
const apiKey = config.apiKey || process.env.QDRANT_API_KEY;
|
|
28
|
+
const url = config.url || process.env.QDRANT_URL;
|
|
29
|
+
if (!url) {
|
|
30
|
+
throw new Error('Qdrant URL required (QDRANT_URL env var or config)');
|
|
31
|
+
}
|
|
32
|
+
this.client = new QdrantClient({ url, apiKey });
|
|
33
|
+
this.projectId = config.projectId || process.cwd();
|
|
34
|
+
this.collection = sanitizeCollectionName(config.collection, this.projectId);
|
|
35
|
+
this.vectorSize = config.vectorSize || 768; // Default to Ollama's nomic-embed-text size
|
|
36
|
+
}
|
|
37
|
+
async isConfigured() {
|
|
38
|
+
try {
|
|
39
|
+
await this.client.getCollections();
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async store(entry) {
|
|
47
|
+
if (!entry.embedding) {
|
|
48
|
+
throw new Error('Embedding required for Qdrant storage');
|
|
49
|
+
}
|
|
50
|
+
await this.ensureCollection();
|
|
51
|
+
await this.client.upsert(this.collection, {
|
|
52
|
+
points: [
|
|
53
|
+
{
|
|
54
|
+
id: entry.id,
|
|
55
|
+
vector: entry.embedding,
|
|
56
|
+
payload: {
|
|
57
|
+
timestamp: entry.timestamp,
|
|
58
|
+
type: entry.type,
|
|
59
|
+
content: entry.content,
|
|
60
|
+
tags: entry.tags,
|
|
61
|
+
importance: entry.importance,
|
|
62
|
+
...entry.metadata,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async query(queryText, limit = 10) {
|
|
69
|
+
// Generate real embedding for semantic search
|
|
70
|
+
const embeddingService = getEmbeddingService();
|
|
71
|
+
const queryEmbedding = await embeddingService.embed(queryText);
|
|
72
|
+
const results = await this.client.search(this.collection, {
|
|
73
|
+
vector: queryEmbedding,
|
|
74
|
+
limit,
|
|
75
|
+
score_threshold: 0.5, // Only return relevant results
|
|
76
|
+
});
|
|
77
|
+
return results.map((r) => ({
|
|
78
|
+
id: String(r.id),
|
|
79
|
+
timestamp: r.payload?.timestamp,
|
|
80
|
+
type: r.payload?.type,
|
|
81
|
+
content: r.payload?.content,
|
|
82
|
+
embedding: r.vector,
|
|
83
|
+
tags: r.payload?.tags,
|
|
84
|
+
importance: r.payload?.importance,
|
|
85
|
+
metadata: r.payload,
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
async getRecent(limit = 50) {
|
|
89
|
+
const results = await this.client.scroll(this.collection, {
|
|
90
|
+
limit,
|
|
91
|
+
with_payload: true,
|
|
92
|
+
with_vector: false,
|
|
93
|
+
});
|
|
94
|
+
return results.points.map((r) => ({
|
|
95
|
+
id: String(r.id),
|
|
96
|
+
timestamp: r.payload?.timestamp,
|
|
97
|
+
type: r.payload?.type,
|
|
98
|
+
content: r.payload?.content,
|
|
99
|
+
tags: r.payload?.tags,
|
|
100
|
+
importance: r.payload?.importance,
|
|
101
|
+
metadata: r.payload,
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
async prune(olderThan) {
|
|
105
|
+
const results = await this.client.scroll(this.collection, {
|
|
106
|
+
filter: {
|
|
107
|
+
must: [
|
|
108
|
+
{
|
|
109
|
+
key: 'timestamp',
|
|
110
|
+
range: {
|
|
111
|
+
lt: olderThan.toISOString(),
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
limit: 1000,
|
|
117
|
+
with_payload: false,
|
|
118
|
+
});
|
|
119
|
+
const ids = results.points.map((p) => p.id);
|
|
120
|
+
if (ids.length > 0) {
|
|
121
|
+
await this.client.delete(this.collection, { points: ids });
|
|
122
|
+
}
|
|
123
|
+
return ids.length;
|
|
124
|
+
}
|
|
125
|
+
async ensureCollection() {
|
|
126
|
+
if (this.collectionVerified)
|
|
127
|
+
return;
|
|
128
|
+
const collections = await this.client.getCollections();
|
|
129
|
+
const exists = collections.collections.some((c) => c.name === this.collection);
|
|
130
|
+
if (!exists) {
|
|
131
|
+
// Create collection with correct vector size
|
|
132
|
+
await this.client.createCollection(this.collection, {
|
|
133
|
+
vectors: { size: this.vectorSize, distance: 'Cosine' },
|
|
134
|
+
});
|
|
135
|
+
this.collectionVerified = true;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Check if existing collection has correct dimensions
|
|
139
|
+
const collectionInfo = await this.client.getCollection(this.collection);
|
|
140
|
+
const currentSize = collectionInfo.config?.params?.vectors?.size;
|
|
141
|
+
if (currentSize && currentSize !== this.vectorSize) {
|
|
142
|
+
// Create new collection with correct dimensions (append suffix)
|
|
143
|
+
const newCollectionName = `${this.collection}_v${this.vectorSize}`;
|
|
144
|
+
const newExists = collections.collections.some((c) => c.name === newCollectionName);
|
|
145
|
+
if (!newExists) {
|
|
146
|
+
await this.client.createCollection(newCollectionName, {
|
|
147
|
+
vectors: { size: this.vectorSize, distance: 'Cosine' },
|
|
148
|
+
});
|
|
149
|
+
console.log(`[Qdrant] Created new collection ${newCollectionName} with ${this.vectorSize} dimensions`);
|
|
150
|
+
}
|
|
151
|
+
this.collection = newCollectionName;
|
|
152
|
+
}
|
|
153
|
+
this.collectionVerified = true;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the actual collection name being used (may differ from config if dimension mismatch)
|
|
157
|
+
*/
|
|
158
|
+
getCollectionName() {
|
|
159
|
+
return this.collection;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get vector dimensions
|
|
163
|
+
*/
|
|
164
|
+
getVectorSize() {
|
|
165
|
+
return this.vectorSize;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=qdrant-cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-cloud.js","sourceRoot":"","sources":["../../../src/memory/backends/qdrant-cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compression Module for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements semantic compression to reduce token usage while preserving meaning.
|
|
5
|
+
* Based on Acon (Agent Context Optimization) and AgentCompress research.
|
|
6
|
+
*/
|
|
7
|
+
export interface CompressionResult {
|
|
8
|
+
original: string;
|
|
9
|
+
compressed: string;
|
|
10
|
+
originalTokens: number;
|
|
11
|
+
compressedTokens: number;
|
|
12
|
+
tokenReduction: number;
|
|
13
|
+
preservedSemantics: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CompressorConfig {
|
|
16
|
+
maxTokens: number;
|
|
17
|
+
minSemanticPreservation: number;
|
|
18
|
+
compressionLevel: 'light' | 'medium' | 'aggressive';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Estimate token count using improved heuristics for mixed code/prose
|
|
22
|
+
* More accurate than simple length/4: accounts for whitespace splits,
|
|
23
|
+
* special characters, camelCase, and numeric tokens.
|
|
24
|
+
*/
|
|
25
|
+
export declare function estimateTokens(text: string): number;
|
|
26
|
+
/**
|
|
27
|
+
* Compress a single memory entry
|
|
28
|
+
*/
|
|
29
|
+
export declare function compressMemoryEntry(content: string, config?: Partial<CompressorConfig>): CompressionResult;
|
|
30
|
+
/**
|
|
31
|
+
* Compress multiple memories into a consolidated context
|
|
32
|
+
*/
|
|
33
|
+
export declare function compressMemoryBatch(memories: Array<{
|
|
34
|
+
content: string;
|
|
35
|
+
type: string;
|
|
36
|
+
importance?: number;
|
|
37
|
+
}>, config?: Partial<CompressorConfig>): CompressionResult;
|
|
38
|
+
/**
|
|
39
|
+
* Summarize old memories into a single compressed entry
|
|
40
|
+
*/
|
|
41
|
+
export declare function summarizeMemories(memories: Array<{
|
|
42
|
+
content: string;
|
|
43
|
+
timestamp: string;
|
|
44
|
+
type: string;
|
|
45
|
+
}>, maxOutputTokens?: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* Smart truncation using head+tail split.
|
|
48
|
+
* Preserves both initial context (setup, config) and final output (errors, results).
|
|
49
|
+
* Head gets 60%, tail gets 40% of the allowed line budget.
|
|
50
|
+
*/
|
|
51
|
+
export declare function smartTruncate(content: string, maxChars: number): string;
|
|
52
|
+
/**
|
|
53
|
+
* Context budget manager
|
|
54
|
+
*/
|
|
55
|
+
export declare class ContextBudget {
|
|
56
|
+
private maxTokens;
|
|
57
|
+
private usedTokens;
|
|
58
|
+
private sections;
|
|
59
|
+
constructor(maxTokens?: number);
|
|
60
|
+
allocate(section: string, content: string): {
|
|
61
|
+
content: string;
|
|
62
|
+
tokens: number;
|
|
63
|
+
truncated: boolean;
|
|
64
|
+
};
|
|
65
|
+
remaining(): number;
|
|
66
|
+
usage(): {
|
|
67
|
+
total: number;
|
|
68
|
+
used: number;
|
|
69
|
+
remaining: number;
|
|
70
|
+
sections: Record<string, number>;
|
|
71
|
+
};
|
|
72
|
+
reset(): void;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=context-compressor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-compressor.d.ts","sourceRoot":"","sources":["../../src/memory/context-compressor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;CACrD;AAQD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,iBAAiB,CAqE9G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACvE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,iBAAiB,CA+CnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACrE,eAAe,GAAE,MAAY,GAC5B,MAAM,CAoCR;AAqDD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA4BvE;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,SAAS,GAAE,MAAc;IAIrC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;IAsBnG,SAAS,IAAI,MAAM;IAInB,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAS7F,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compression Module for UAP
|
|
3
|
+
*
|
|
4
|
+
* Implements semantic compression to reduce token usage while preserving meaning.
|
|
5
|
+
* Based on Acon (Agent Context Optimization) and AgentCompress research.
|
|
6
|
+
*/
|
|
7
|
+
import { jaccardSimilarity } from '../utils/string-similarity.js';
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
maxTokens: 800,
|
|
10
|
+
minSemanticPreservation: 0.85,
|
|
11
|
+
compressionLevel: 'medium',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Estimate token count using improved heuristics for mixed code/prose
|
|
15
|
+
* More accurate than simple length/4: accounts for whitespace splits,
|
|
16
|
+
* special characters, camelCase, and numeric tokens.
|
|
17
|
+
*/
|
|
18
|
+
export function estimateTokens(text) {
|
|
19
|
+
if (!text || text.length === 0)
|
|
20
|
+
return 0;
|
|
21
|
+
// Split by whitespace for base word count
|
|
22
|
+
const words = text.split(/\s+/).filter(w => w.length > 0);
|
|
23
|
+
// Special characters that typically become separate tokens
|
|
24
|
+
const specialChars = (text.match(/[{}()\[\]<>:;,."'`@#$%^&*+=|\\/?!~-]/g) || []).length;
|
|
25
|
+
// Code tokens: camelCase/snake_case boundaries add sub-word tokens
|
|
26
|
+
const codeTokens = (text.match(/[a-z][A-Z]|_[a-z]/g) || []).length;
|
|
27
|
+
// Numeric sequences often tokenize separately
|
|
28
|
+
const numbers = (text.match(/\d+/g) || []).length;
|
|
29
|
+
// Average English word is ~1.3 tokens, code identifiers ~1.5
|
|
30
|
+
const baseTokens = words.length * 1.3;
|
|
31
|
+
const specialTokens = specialChars * 0.5;
|
|
32
|
+
const extraCodeTokens = codeTokens * 0.3;
|
|
33
|
+
const numberTokens = numbers * 0.5;
|
|
34
|
+
return Math.ceil(baseTokens + specialTokens + extraCodeTokens + numberTokens);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compress a single memory entry
|
|
38
|
+
*/
|
|
39
|
+
export function compressMemoryEntry(content, config = {}) {
|
|
40
|
+
const cfg = { ...DEFAULT_CONFIG, ...config };
|
|
41
|
+
const originalTokens = estimateTokens(content);
|
|
42
|
+
if (originalTokens <= cfg.maxTokens / 4) {
|
|
43
|
+
return {
|
|
44
|
+
original: content,
|
|
45
|
+
compressed: content,
|
|
46
|
+
originalTokens,
|
|
47
|
+
compressedTokens: originalTokens,
|
|
48
|
+
tokenReduction: 0,
|
|
49
|
+
preservedSemantics: 1.0,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
let compressed = content;
|
|
53
|
+
// Level 1: Remove redundant whitespace and formatting
|
|
54
|
+
compressed = compressed.replace(/\s+/g, ' ').trim();
|
|
55
|
+
compressed = compressed.replace(/\n{3,}/g, '\n\n');
|
|
56
|
+
// Level 2: Remove common filler phrases
|
|
57
|
+
if (cfg.compressionLevel !== 'light') {
|
|
58
|
+
const fillerPatterns = [
|
|
59
|
+
/\b(basically|essentially|actually|really|very|quite|somewhat|rather)\b/gi,
|
|
60
|
+
/\b(in order to)\b/gi,
|
|
61
|
+
/\b(it is worth noting that|it should be noted that)\b/gi,
|
|
62
|
+
/\b(as a matter of fact|in fact)\b/gi,
|
|
63
|
+
/\b(at the end of the day)\b/gi,
|
|
64
|
+
/\b(the fact that)\b/gi,
|
|
65
|
+
/\b(in this case|in that case)\b/gi,
|
|
66
|
+
];
|
|
67
|
+
for (const pattern of fillerPatterns) {
|
|
68
|
+
compressed = compressed.replace(pattern, '');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Level 3: Aggressive - truncate to key sentences
|
|
72
|
+
if (cfg.compressionLevel === 'aggressive') {
|
|
73
|
+
const sentences = compressed.split(/(?<=[.!?])\s+/);
|
|
74
|
+
const maxSentences = Math.max(3, Math.ceil(sentences.length * 0.4));
|
|
75
|
+
// Keep first sentence (context), middle sentences (key info), last sentence (conclusion)
|
|
76
|
+
if (sentences.length > maxSentences) {
|
|
77
|
+
const first = sentences.slice(0, 1);
|
|
78
|
+
const middle = sentences.slice(1, -1).slice(0, maxSentences - 2);
|
|
79
|
+
const last = sentences.slice(-1);
|
|
80
|
+
compressed = [...first, ...middle, ...last].join(' ');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Clean up artifacts
|
|
84
|
+
compressed = compressed.replace(/\s{2,}/g, ' ').trim();
|
|
85
|
+
const compressedTokens = estimateTokens(compressed);
|
|
86
|
+
const tokenReduction = 1 - (compressedTokens / originalTokens);
|
|
87
|
+
// Estimate semantic preservation (based on compression ratio - rough heuristic)
|
|
88
|
+
const preservedSemantics = Math.max(0.7, 1 - (tokenReduction * 0.3));
|
|
89
|
+
return {
|
|
90
|
+
original: content,
|
|
91
|
+
compressed,
|
|
92
|
+
originalTokens,
|
|
93
|
+
compressedTokens,
|
|
94
|
+
tokenReduction,
|
|
95
|
+
preservedSemantics,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Compress multiple memories into a consolidated context
|
|
100
|
+
*/
|
|
101
|
+
export function compressMemoryBatch(memories, config = {}) {
|
|
102
|
+
const cfg = { ...DEFAULT_CONFIG, ...config };
|
|
103
|
+
// Sort by importance (descending)
|
|
104
|
+
const sorted = [...memories].sort((a, b) => (b.importance || 5) - (a.importance || 5));
|
|
105
|
+
// Group by type for structured output
|
|
106
|
+
const grouped = {};
|
|
107
|
+
for (const mem of sorted) {
|
|
108
|
+
const type = mem.type || 'general';
|
|
109
|
+
if (!grouped[type])
|
|
110
|
+
grouped[type] = [];
|
|
111
|
+
grouped[type].push(mem.content);
|
|
112
|
+
}
|
|
113
|
+
// Build consolidated context
|
|
114
|
+
const sections = [];
|
|
115
|
+
const typeOrder = ['goal', 'action', 'observation', 'thought'];
|
|
116
|
+
for (const type of typeOrder) {
|
|
117
|
+
if (grouped[type] && grouped[type].length > 0) {
|
|
118
|
+
const compressed = grouped[type].map(c => compressMemoryEntry(c, cfg).compressed);
|
|
119
|
+
sections.push(`[${type.toUpperCase()}]\n${compressed.join('\n')}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Add remaining types
|
|
123
|
+
for (const type of Object.keys(grouped)) {
|
|
124
|
+
if (!typeOrder.includes(type)) {
|
|
125
|
+
const compressed = grouped[type].map(c => compressMemoryEntry(c, cfg).compressed);
|
|
126
|
+
sections.push(`[${type.toUpperCase()}]\n${compressed.join('\n')}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const original = memories.map(m => m.content).join('\n');
|
|
130
|
+
const compressed = sections.join('\n\n');
|
|
131
|
+
const originalTokens = estimateTokens(original);
|
|
132
|
+
const compressedTokens = estimateTokens(compressed);
|
|
133
|
+
return {
|
|
134
|
+
original,
|
|
135
|
+
compressed,
|
|
136
|
+
originalTokens,
|
|
137
|
+
compressedTokens,
|
|
138
|
+
tokenReduction: 1 - (compressedTokens / originalTokens),
|
|
139
|
+
preservedSemantics: 0.9, // Batch compression preserves structure
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Summarize old memories into a single compressed entry
|
|
144
|
+
*/
|
|
145
|
+
export function summarizeMemories(memories, maxOutputTokens = 500) {
|
|
146
|
+
if (memories.length === 0)
|
|
147
|
+
return '';
|
|
148
|
+
// Group by type
|
|
149
|
+
const byType = {};
|
|
150
|
+
for (const mem of memories) {
|
|
151
|
+
if (!byType[mem.type])
|
|
152
|
+
byType[mem.type] = [];
|
|
153
|
+
byType[mem.type].push(mem.content);
|
|
154
|
+
}
|
|
155
|
+
// Create summary sections
|
|
156
|
+
const summaryParts = [];
|
|
157
|
+
for (const [type, contents] of Object.entries(byType)) {
|
|
158
|
+
// Deduplicate similar content
|
|
159
|
+
const unique = deduplicateContent(contents);
|
|
160
|
+
// Compress each unique entry
|
|
161
|
+
const compressed = unique.map(c => {
|
|
162
|
+
const result = compressMemoryEntry(c, { compressionLevel: 'aggressive' });
|
|
163
|
+
return result.compressed;
|
|
164
|
+
});
|
|
165
|
+
// Limit to most important entries
|
|
166
|
+
const maxPerType = Math.max(2, Math.floor(maxOutputTokens / (Object.keys(byType).length * 50)));
|
|
167
|
+
const limited = compressed.slice(0, maxPerType);
|
|
168
|
+
if (limited.length > 0) {
|
|
169
|
+
summaryParts.push(`${type}: ${limited.join('; ')}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const dateRange = getDateRange(memories.map(m => m.timestamp));
|
|
173
|
+
const header = `[Summary ${dateRange}]`;
|
|
174
|
+
return `${header}\n${summaryParts.join('\n')}`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Deduplicate content using simple similarity check
|
|
178
|
+
*/
|
|
179
|
+
function deduplicateContent(contents, threshold = 0.8) {
|
|
180
|
+
const unique = [];
|
|
181
|
+
for (const content of contents) {
|
|
182
|
+
const normalizedNew = content.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
183
|
+
let isDuplicate = false;
|
|
184
|
+
for (const existing of unique) {
|
|
185
|
+
const normalizedExisting = existing.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
186
|
+
const similarity = jaccardSimilarity(normalizedNew, normalizedExisting);
|
|
187
|
+
if (similarity > threshold) {
|
|
188
|
+
isDuplicate = true;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!isDuplicate) {
|
|
193
|
+
unique.push(content);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return unique;
|
|
197
|
+
}
|
|
198
|
+
// jaccardSimilarity imported from ../utils/string-similarity.js
|
|
199
|
+
/**
|
|
200
|
+
* Get date range string
|
|
201
|
+
*/
|
|
202
|
+
function getDateRange(timestamps) {
|
|
203
|
+
if (timestamps.length === 0)
|
|
204
|
+
return 'unknown';
|
|
205
|
+
const dates = timestamps.map(t => new Date(t)).filter(d => !isNaN(d.getTime()));
|
|
206
|
+
if (dates.length === 0)
|
|
207
|
+
return 'unknown';
|
|
208
|
+
const min = new Date(Math.min(...dates.map(d => d.getTime())));
|
|
209
|
+
const max = new Date(Math.max(...dates.map(d => d.getTime())));
|
|
210
|
+
const formatDate = (d) => d.toISOString().split('T')[0];
|
|
211
|
+
if (formatDate(min) === formatDate(max)) {
|
|
212
|
+
return formatDate(min);
|
|
213
|
+
}
|
|
214
|
+
return `${formatDate(min)} to ${formatDate(max)}`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Smart truncation using head+tail split.
|
|
218
|
+
* Preserves both initial context (setup, config) and final output (errors, results).
|
|
219
|
+
* Head gets 60%, tail gets 40% of the allowed line budget.
|
|
220
|
+
*/
|
|
221
|
+
export function smartTruncate(content, maxChars) {
|
|
222
|
+
if (content.length <= maxChars)
|
|
223
|
+
return content;
|
|
224
|
+
const lines = content.split('\n');
|
|
225
|
+
if (lines.length <= 4) {
|
|
226
|
+
// Too few lines for head+tail split, just char-truncate
|
|
227
|
+
return content.slice(0, maxChars) + '\n... [truncated]';
|
|
228
|
+
}
|
|
229
|
+
const ratio = Math.min(1, maxChars / content.length);
|
|
230
|
+
const totalLines = Math.max(2, Math.floor(lines.length * ratio));
|
|
231
|
+
const headLines = Math.max(1, Math.ceil(totalLines * 0.6));
|
|
232
|
+
const tailLines = Math.max(1, totalLines - headLines);
|
|
233
|
+
// Avoid overlap when head + tail >= total lines
|
|
234
|
+
if (headLines + tailLines >= lines.length) {
|
|
235
|
+
return content.slice(0, maxChars) + '\n... [truncated]';
|
|
236
|
+
}
|
|
237
|
+
const headPart = lines.slice(0, headLines);
|
|
238
|
+
const tailPart = lines.slice(-tailLines);
|
|
239
|
+
const omitted = lines.length - headLines - tailLines;
|
|
240
|
+
return [
|
|
241
|
+
...headPart,
|
|
242
|
+
`\n... [${omitted} lines truncated — showing first ${headLines} + last ${tailLines} lines] ...\n`,
|
|
243
|
+
...tailPart,
|
|
244
|
+
].join('\n');
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Context budget manager
|
|
248
|
+
*/
|
|
249
|
+
export class ContextBudget {
|
|
250
|
+
maxTokens;
|
|
251
|
+
usedTokens = 0;
|
|
252
|
+
sections = new Map();
|
|
253
|
+
constructor(maxTokens = 12000) {
|
|
254
|
+
this.maxTokens = maxTokens;
|
|
255
|
+
}
|
|
256
|
+
allocate(section, content) {
|
|
257
|
+
const tokens = estimateTokens(content);
|
|
258
|
+
const available = this.maxTokens - this.usedTokens;
|
|
259
|
+
if (tokens <= available) {
|
|
260
|
+
this.usedTokens += tokens;
|
|
261
|
+
this.sections.set(section, tokens);
|
|
262
|
+
return { content, tokens, truncated: false };
|
|
263
|
+
}
|
|
264
|
+
// Need to truncate - use head+tail split to preserve error context
|
|
265
|
+
const targetTokens = Math.floor(available * 0.9);
|
|
266
|
+
const targetChars = targetTokens * 4;
|
|
267
|
+
const truncated = smartTruncate(content, targetChars);
|
|
268
|
+
const actualTokens = estimateTokens(truncated);
|
|
269
|
+
this.usedTokens += actualTokens;
|
|
270
|
+
this.sections.set(section, actualTokens);
|
|
271
|
+
return { content: truncated, tokens: actualTokens, truncated: true };
|
|
272
|
+
}
|
|
273
|
+
remaining() {
|
|
274
|
+
return this.maxTokens - this.usedTokens;
|
|
275
|
+
}
|
|
276
|
+
usage() {
|
|
277
|
+
return {
|
|
278
|
+
total: this.maxTokens,
|
|
279
|
+
used: this.usedTokens,
|
|
280
|
+
remaining: this.remaining(),
|
|
281
|
+
sections: Object.fromEntries(this.sections),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
reset() {
|
|
285
|
+
this.usedTokens = 0;
|
|
286
|
+
this.sections.clear();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=context-compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-compressor.js","sourceRoot":"","sources":["../../src/memory/context-compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction Propagation Protocol
|
|
3
|
+
*
|
|
4
|
+
* When a memory is corrected, updates propagate across all tiers:
|
|
5
|
+
* daily log, working memory, and session memory. Old claims are marked
|
|
6
|
+
* [superseded] with date and reason, preserving the audit trail.
|
|
7
|
+
*
|
|
8
|
+
* Inspired by Total Recall's correction gate.
|
|
9
|
+
*/
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
export interface CorrectionResult {
|
|
12
|
+
originalFound: boolean;
|
|
13
|
+
originalId?: number;
|
|
14
|
+
originalContent?: string;
|
|
15
|
+
tiersUpdated: string[];
|
|
16
|
+
supersededCount: number;
|
|
17
|
+
correctedEntryId?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface SupersededEntry {
|
|
20
|
+
id: number;
|
|
21
|
+
tier: string;
|
|
22
|
+
originalContent: string;
|
|
23
|
+
supersededDate: string;
|
|
24
|
+
supersededBy: string;
|
|
25
|
+
reason: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Ensure the superseded tracking table exists.
|
|
29
|
+
*/
|
|
30
|
+
export declare function ensureSupersededSchema(db: Database.Database): void;
|
|
31
|
+
/**
|
|
32
|
+
* Propagate a correction across all memory tiers.
|
|
33
|
+
*
|
|
34
|
+
* @param dbPath Path to the SQLite database
|
|
35
|
+
* @param searchContent Content to find and correct (fuzzy match)
|
|
36
|
+
* @param correctedContent The corrected version
|
|
37
|
+
* @param reason Why the correction was made
|
|
38
|
+
*/
|
|
39
|
+
export declare function propagateCorrection(dbPath: string, searchContent: string, correctedContent: string, reason?: string): CorrectionResult;
|
|
40
|
+
/**
|
|
41
|
+
* Get the superseded history for audit trail.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSupersededHistory(dbPath: string, limit?: number): SupersededEntry[];
|
|
44
|
+
//# sourceMappingURL=correction-propagator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-propagator.d.ts","sourceRoot":"","sources":["../../src/memory/correction-propagator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAalE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,MAAM,GAAE,MAA0B,GACjC,gBAAgB,CAwGlB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,eAAe,EAAE,CAgCnB"}
|