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,156 @@
|
|
|
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
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { ensureDailyLogSchema } from './daily-log.js';
|
|
13
|
+
/**
|
|
14
|
+
* Ensure the superseded tracking table exists.
|
|
15
|
+
*/
|
|
16
|
+
export function ensureSupersededSchema(db) {
|
|
17
|
+
db.exec(`
|
|
18
|
+
CREATE TABLE IF NOT EXISTS superseded_entries (
|
|
19
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
tier TEXT NOT NULL,
|
|
21
|
+
original_entry_id INTEGER,
|
|
22
|
+
original_content TEXT NOT NULL,
|
|
23
|
+
corrected_content TEXT NOT NULL,
|
|
24
|
+
superseded_date TEXT NOT NULL,
|
|
25
|
+
reason TEXT NOT NULL DEFAULT 'correction'
|
|
26
|
+
);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_superseded_date ON superseded_entries(superseded_date);
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Propagate a correction across all memory tiers.
|
|
32
|
+
*
|
|
33
|
+
* @param dbPath Path to the SQLite database
|
|
34
|
+
* @param searchContent Content to find and correct (fuzzy match)
|
|
35
|
+
* @param correctedContent The corrected version
|
|
36
|
+
* @param reason Why the correction was made
|
|
37
|
+
*/
|
|
38
|
+
export function propagateCorrection(dbPath, searchContent, correctedContent, reason = 'user correction') {
|
|
39
|
+
if (!existsSync(dbPath)) {
|
|
40
|
+
return { originalFound: false, tiersUpdated: [], supersededCount: 0 };
|
|
41
|
+
}
|
|
42
|
+
const db = new Database(dbPath);
|
|
43
|
+
ensureSupersededSchema(db);
|
|
44
|
+
ensureDailyLogSchema(db);
|
|
45
|
+
const result = {
|
|
46
|
+
originalFound: false,
|
|
47
|
+
tiersUpdated: [],
|
|
48
|
+
supersededCount: 0,
|
|
49
|
+
};
|
|
50
|
+
const now = new Date().toISOString();
|
|
51
|
+
const today = now.split('T')[0];
|
|
52
|
+
const searchLower = searchContent.toLowerCase();
|
|
53
|
+
try {
|
|
54
|
+
// 1. Search in memories (working memory / L1)
|
|
55
|
+
const memRows = db.prepare(`
|
|
56
|
+
SELECT id, content FROM memories
|
|
57
|
+
WHERE LOWER(content) LIKE ?
|
|
58
|
+
ORDER BY id DESC
|
|
59
|
+
LIMIT 5
|
|
60
|
+
`).all(`%${searchLower}%`);
|
|
61
|
+
for (const row of memRows) {
|
|
62
|
+
result.originalFound = true;
|
|
63
|
+
result.originalId = result.originalId || row.id;
|
|
64
|
+
result.originalContent = result.originalContent || row.content;
|
|
65
|
+
// Record superseded entry
|
|
66
|
+
db.prepare(`
|
|
67
|
+
INSERT INTO superseded_entries (tier, original_entry_id, original_content, corrected_content, superseded_date, reason)
|
|
68
|
+
VALUES ('memories', ?, ?, ?, ?, ?)
|
|
69
|
+
`).run(row.id, row.content, correctedContent, now, reason);
|
|
70
|
+
// Update the memory in-place (prepend [corrected] marker)
|
|
71
|
+
db.prepare(`
|
|
72
|
+
UPDATE memories SET content = ? WHERE id = ?
|
|
73
|
+
`).run(`[corrected ${today}] ${correctedContent}`, row.id);
|
|
74
|
+
result.supersededCount++;
|
|
75
|
+
}
|
|
76
|
+
if (memRows.length > 0) {
|
|
77
|
+
result.tiersUpdated.push('memories');
|
|
78
|
+
}
|
|
79
|
+
// 2. Search in session_memories (L2)
|
|
80
|
+
const sessRows = db.prepare(`
|
|
81
|
+
SELECT id, content FROM session_memories
|
|
82
|
+
WHERE LOWER(content) LIKE ?
|
|
83
|
+
ORDER BY id DESC
|
|
84
|
+
LIMIT 5
|
|
85
|
+
`).all(`%${searchLower}%`);
|
|
86
|
+
for (const row of sessRows) {
|
|
87
|
+
result.originalFound = true;
|
|
88
|
+
db.prepare(`
|
|
89
|
+
INSERT INTO superseded_entries (tier, original_entry_id, original_content, corrected_content, superseded_date, reason)
|
|
90
|
+
VALUES ('session_memories', ?, ?, ?, ?, ?)
|
|
91
|
+
`).run(row.id, row.content, correctedContent, now, reason);
|
|
92
|
+
db.prepare(`
|
|
93
|
+
UPDATE session_memories SET content = ? WHERE id = ?
|
|
94
|
+
`).run(`[corrected ${today}] ${correctedContent}`, row.id);
|
|
95
|
+
result.supersededCount++;
|
|
96
|
+
}
|
|
97
|
+
if (sessRows.length > 0) {
|
|
98
|
+
result.tiersUpdated.push('session_memories');
|
|
99
|
+
}
|
|
100
|
+
// 3. Always write the correction to the daily log
|
|
101
|
+
db.prepare(`
|
|
102
|
+
INSERT INTO daily_log (date, timestamp, content, type, gate_score)
|
|
103
|
+
VALUES (?, ?, ?, 'correction', 1.0)
|
|
104
|
+
`).run(today, now, `[CORRECTION] ${reason}: ${correctedContent}`);
|
|
105
|
+
result.tiersUpdated.push('daily_log');
|
|
106
|
+
// 4. Write corrected version as new working memory entry
|
|
107
|
+
const insertResult = db.prepare(`
|
|
108
|
+
INSERT INTO memories (timestamp, type, content, project_id, importance)
|
|
109
|
+
VALUES (?, 'observation', ?, 'default', 8)
|
|
110
|
+
`).run(now, correctedContent);
|
|
111
|
+
result.correctedEntryId = Number(insertResult.lastInsertRowid);
|
|
112
|
+
// Update FTS if available
|
|
113
|
+
try {
|
|
114
|
+
db.prepare(`
|
|
115
|
+
INSERT INTO memories_fts(rowid, content, type)
|
|
116
|
+
VALUES (?, ?, 'observation')
|
|
117
|
+
`).run(result.correctedEntryId, correctedContent);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// FTS not available
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
db.close();
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the superseded history for audit trail.
|
|
130
|
+
*/
|
|
131
|
+
export function getSupersededHistory(dbPath, limit = 20) {
|
|
132
|
+
if (!existsSync(dbPath))
|
|
133
|
+
return [];
|
|
134
|
+
const db = new Database(dbPath);
|
|
135
|
+
ensureSupersededSchema(db);
|
|
136
|
+
try {
|
|
137
|
+
const rows = db.prepare(`
|
|
138
|
+
SELECT id, tier, original_entry_id, original_content, superseded_date, reason
|
|
139
|
+
FROM superseded_entries
|
|
140
|
+
ORDER BY id DESC
|
|
141
|
+
LIMIT ?
|
|
142
|
+
`).all(limit);
|
|
143
|
+
return rows.map(r => ({
|
|
144
|
+
id: r.id,
|
|
145
|
+
tier: r.tier,
|
|
146
|
+
originalContent: r.original_content,
|
|
147
|
+
supersededDate: r.superseded_date,
|
|
148
|
+
supersededBy: '', // Would need to join with corrected content
|
|
149
|
+
reason: r.reason,
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
db.close();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=correction-propagator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-propagator.js","sourceRoot":"","sources":["../../src/memory/correction-propagator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily Log - Staging area for memory writes.
|
|
3
|
+
*
|
|
4
|
+
* All memories land here first. Promotion to working/semantic memory
|
|
5
|
+
* is a separate step controlled by the user via `uap memory promote`.
|
|
6
|
+
* Inspired by Total Recall's "daily log first, promote later" pattern.
|
|
7
|
+
*/
|
|
8
|
+
import Database from 'better-sqlite3';
|
|
9
|
+
export interface DailyLogEntry {
|
|
10
|
+
id: number;
|
|
11
|
+
date: string;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
content: string;
|
|
14
|
+
type: string;
|
|
15
|
+
promoted: boolean;
|
|
16
|
+
promotedTo?: string;
|
|
17
|
+
gateScore: number;
|
|
18
|
+
}
|
|
19
|
+
export interface PromotionCandidate {
|
|
20
|
+
entry: DailyLogEntry;
|
|
21
|
+
suggestedTier: 'working' | 'semantic';
|
|
22
|
+
reason: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function ensureDailyLogSchema(db: Database.Database): void;
|
|
25
|
+
export declare class DailyLog {
|
|
26
|
+
private db;
|
|
27
|
+
constructor(dbPath: string);
|
|
28
|
+
/**
|
|
29
|
+
* Write an entry to today's daily log.
|
|
30
|
+
*/
|
|
31
|
+
write(content: string, type?: string, gateScore?: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* Get entries for a specific date (default: today).
|
|
34
|
+
*/
|
|
35
|
+
getByDate(date?: string): DailyLogEntry[];
|
|
36
|
+
/**
|
|
37
|
+
* Get unpromoted entries across all dates (candidates for promotion).
|
|
38
|
+
*/
|
|
39
|
+
getUnpromoted(limit?: number): DailyLogEntry[];
|
|
40
|
+
/**
|
|
41
|
+
* Get promotion candidates - entries scored high enough to promote.
|
|
42
|
+
*/
|
|
43
|
+
getPromotionCandidates(minScore?: number): PromotionCandidate[];
|
|
44
|
+
/**
|
|
45
|
+
* Mark an entry as promoted.
|
|
46
|
+
*/
|
|
47
|
+
markPromoted(id: number, tier: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Archive old entries (>30 days) by marking them.
|
|
50
|
+
*/
|
|
51
|
+
archiveOld(daysOld?: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Get log statistics.
|
|
54
|
+
*/
|
|
55
|
+
getStats(): {
|
|
56
|
+
total: number;
|
|
57
|
+
unpromoted: number;
|
|
58
|
+
promoted: number;
|
|
59
|
+
todayCount: number;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Get recent entries across dates.
|
|
63
|
+
*/
|
|
64
|
+
getRecent(limit?: number): DailyLogEntry[];
|
|
65
|
+
close(): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=daily-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-log.d.ts","sourceRoot":"","sources":["../../src/memory/daily-log.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,SAAS,GAAG,UAAU,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAehE;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAS1B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAsB,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM;IAanF;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAYzC;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAAW,GAAG,aAAa,EAAE;IAYlD;;OAEG;IACH,sBAAsB,CAAC,QAAQ,GAAE,MAAY,GAAG,kBAAkB,EAAE;IAapE;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5C;;OAEG;IACH,UAAU,CAAC,OAAO,GAAE,MAAW,GAAG,MAAM;IAYxC;;OAEG;IACH,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAQvF;;OAEG;IACH,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,aAAa,EAAE;IAW9C,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily Log - Staging area for memory writes.
|
|
3
|
+
*
|
|
4
|
+
* All memories land here first. Promotion to working/semantic memory
|
|
5
|
+
* is a separate step controlled by the user via `uap memory promote`.
|
|
6
|
+
* Inspired by Total Recall's "daily log first, promote later" pattern.
|
|
7
|
+
*/
|
|
8
|
+
import Database from 'better-sqlite3';
|
|
9
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
10
|
+
import { dirname } from 'path';
|
|
11
|
+
export function ensureDailyLogSchema(db) {
|
|
12
|
+
db.exec(`
|
|
13
|
+
CREATE TABLE IF NOT EXISTS daily_log (
|
|
14
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
15
|
+
date TEXT NOT NULL,
|
|
16
|
+
timestamp TEXT NOT NULL,
|
|
17
|
+
content TEXT NOT NULL,
|
|
18
|
+
type TEXT NOT NULL DEFAULT 'observation',
|
|
19
|
+
promoted INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
promoted_to TEXT,
|
|
21
|
+
gate_score REAL NOT NULL DEFAULT 0
|
|
22
|
+
);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_daily_log_date ON daily_log(date);
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_daily_log_promoted ON daily_log(promoted);
|
|
25
|
+
`);
|
|
26
|
+
}
|
|
27
|
+
export class DailyLog {
|
|
28
|
+
db;
|
|
29
|
+
constructor(dbPath) {
|
|
30
|
+
const dir = dirname(dbPath);
|
|
31
|
+
if (!existsSync(dir)) {
|
|
32
|
+
mkdirSync(dir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
this.db = new Database(dbPath);
|
|
35
|
+
ensureDailyLogSchema(this.db);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Write an entry to today's daily log.
|
|
39
|
+
*/
|
|
40
|
+
write(content, type = 'observation', gateScore = 0) {
|
|
41
|
+
const now = new Date();
|
|
42
|
+
const date = now.toISOString().split('T')[0];
|
|
43
|
+
const timestamp = now.toISOString();
|
|
44
|
+
const stmt = this.db.prepare(`
|
|
45
|
+
INSERT INTO daily_log (date, timestamp, content, type, gate_score)
|
|
46
|
+
VALUES (?, ?, ?, ?, ?)
|
|
47
|
+
`);
|
|
48
|
+
const result = stmt.run(date, timestamp, content, type, gateScore);
|
|
49
|
+
return Number(result.lastInsertRowid);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get entries for a specific date (default: today).
|
|
53
|
+
*/
|
|
54
|
+
getByDate(date) {
|
|
55
|
+
const d = date || new Date().toISOString().split('T')[0];
|
|
56
|
+
const stmt = this.db.prepare(`
|
|
57
|
+
SELECT id, date, timestamp, content, type,
|
|
58
|
+
promoted, promoted_to as promotedTo, gate_score as gateScore
|
|
59
|
+
FROM daily_log
|
|
60
|
+
WHERE date = ?
|
|
61
|
+
ORDER BY id DESC
|
|
62
|
+
`);
|
|
63
|
+
return stmt.all(d);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get unpromoted entries across all dates (candidates for promotion).
|
|
67
|
+
*/
|
|
68
|
+
getUnpromoted(limit = 50) {
|
|
69
|
+
const stmt = this.db.prepare(`
|
|
70
|
+
SELECT id, date, timestamp, content, type,
|
|
71
|
+
promoted, promoted_to as promotedTo, gate_score as gateScore
|
|
72
|
+
FROM daily_log
|
|
73
|
+
WHERE promoted = 0
|
|
74
|
+
ORDER BY gate_score DESC, id DESC
|
|
75
|
+
LIMIT ?
|
|
76
|
+
`);
|
|
77
|
+
return stmt.all(limit);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get promotion candidates - entries scored high enough to promote.
|
|
81
|
+
*/
|
|
82
|
+
getPromotionCandidates(minScore = 0.3) {
|
|
83
|
+
const entries = this.getUnpromoted();
|
|
84
|
+
return entries
|
|
85
|
+
.filter(e => e.gateScore >= minScore)
|
|
86
|
+
.map(e => ({
|
|
87
|
+
entry: e,
|
|
88
|
+
suggestedTier: e.gateScore >= 0.6 ? 'working' : 'semantic',
|
|
89
|
+
reason: e.gateScore >= 0.6
|
|
90
|
+
? 'High gate score - likely behavior-changing or commitment'
|
|
91
|
+
: 'Moderate gate score - durable fact or decision',
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Mark an entry as promoted.
|
|
96
|
+
*/
|
|
97
|
+
markPromoted(id, tier) {
|
|
98
|
+
const stmt = this.db.prepare(`
|
|
99
|
+
UPDATE daily_log SET promoted = 1, promoted_to = ? WHERE id = ?
|
|
100
|
+
`);
|
|
101
|
+
stmt.run(tier, id);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Archive old entries (>30 days) by marking them.
|
|
105
|
+
*/
|
|
106
|
+
archiveOld(daysOld = 30) {
|
|
107
|
+
const cutoff = new Date();
|
|
108
|
+
cutoff.setDate(cutoff.getDate() - daysOld);
|
|
109
|
+
const cutoffDate = cutoff.toISOString().split('T')[0];
|
|
110
|
+
const stmt = this.db.prepare(`
|
|
111
|
+
DELETE FROM daily_log WHERE date < ? AND promoted = 1
|
|
112
|
+
`);
|
|
113
|
+
const result = stmt.run(cutoffDate);
|
|
114
|
+
return result.changes;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get log statistics.
|
|
118
|
+
*/
|
|
119
|
+
getStats() {
|
|
120
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM daily_log').get().c;
|
|
121
|
+
const unpromoted = this.db.prepare('SELECT COUNT(*) as c FROM daily_log WHERE promoted = 0').get().c;
|
|
122
|
+
const today = new Date().toISOString().split('T')[0];
|
|
123
|
+
const todayCount = this.db.prepare('SELECT COUNT(*) as c FROM daily_log WHERE date = ?').get(today).c;
|
|
124
|
+
return { total, unpromoted, promoted: total - unpromoted, todayCount };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get recent entries across dates.
|
|
128
|
+
*/
|
|
129
|
+
getRecent(limit = 20) {
|
|
130
|
+
const stmt = this.db.prepare(`
|
|
131
|
+
SELECT id, date, timestamp, content, type,
|
|
132
|
+
promoted, promoted_to as promotedTo, gate_score as gateScore
|
|
133
|
+
FROM daily_log
|
|
134
|
+
ORDER BY id DESC
|
|
135
|
+
LIMIT ?
|
|
136
|
+
`);
|
|
137
|
+
return stmt.all(limit);
|
|
138
|
+
}
|
|
139
|
+
close() {
|
|
140
|
+
this.db.close();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=daily-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-log.js","sourceRoot":"","sources":["../../src/memory/daily-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Memory Retrieval System for UAP
|
|
3
|
+
*
|
|
4
|
+
* Retrieves relevant memories based on task content, not static context.
|
|
5
|
+
* Implements semantic search with fallback to keyword matching.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Adaptive retrieval depth based on query complexity
|
|
9
|
+
* - Context budget management to prevent overflow
|
|
10
|
+
* - Speculative prefetch for common patterns
|
|
11
|
+
*/
|
|
12
|
+
import { type TaskClassification } from './task-classifier.js';
|
|
13
|
+
import { type ContextDecision, type TaskMetadata } from './adaptive-context.js';
|
|
14
|
+
/**
|
|
15
|
+
* Query complexity levels for adaptive retrieval
|
|
16
|
+
*/
|
|
17
|
+
export type QueryComplexity = 'simple' | 'moderate' | 'complex';
|
|
18
|
+
/**
|
|
19
|
+
* Retrieval depth configuration
|
|
20
|
+
*/
|
|
21
|
+
export interface RetrievalDepthConfig {
|
|
22
|
+
simple: {
|
|
23
|
+
shortTerm: number;
|
|
24
|
+
sessionMem: number;
|
|
25
|
+
longTerm: number;
|
|
26
|
+
patterns: number;
|
|
27
|
+
};
|
|
28
|
+
moderate: {
|
|
29
|
+
shortTerm: number;
|
|
30
|
+
sessionMem: number;
|
|
31
|
+
longTerm: number;
|
|
32
|
+
patterns: number;
|
|
33
|
+
};
|
|
34
|
+
complex: {
|
|
35
|
+
shortTerm: number;
|
|
36
|
+
sessionMem: number;
|
|
37
|
+
longTerm: number;
|
|
38
|
+
patterns: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Measure query complexity to determine retrieval depth
|
|
43
|
+
* Based on SimpleMem's adaptive query-aware retrieval
|
|
44
|
+
*/
|
|
45
|
+
export declare function measureQueryComplexity(query: string): QueryComplexity;
|
|
46
|
+
/**
|
|
47
|
+
* Get retrieval limits based on query complexity
|
|
48
|
+
*/
|
|
49
|
+
export declare function getRetrievalDepth(complexity: QueryComplexity, config?: RetrievalDepthConfig): {
|
|
50
|
+
shortTerm: number;
|
|
51
|
+
sessionMem: number;
|
|
52
|
+
longTerm: number;
|
|
53
|
+
patterns: number;
|
|
54
|
+
};
|
|
55
|
+
export interface RetrievedMemory {
|
|
56
|
+
content: string;
|
|
57
|
+
type: 'lesson' | 'gotcha' | 'pattern' | 'context' | 'example';
|
|
58
|
+
relevance: number;
|
|
59
|
+
source: string;
|
|
60
|
+
}
|
|
61
|
+
export interface DynamicMemoryContext {
|
|
62
|
+
classification: TaskClassification;
|
|
63
|
+
relevantMemories: RetrievedMemory[];
|
|
64
|
+
patterns: string[];
|
|
65
|
+
gotchas: string[];
|
|
66
|
+
projectContext: string;
|
|
67
|
+
formattedContext: string;
|
|
68
|
+
queryComplexity: QueryComplexity;
|
|
69
|
+
tokenBudget: {
|
|
70
|
+
used: number;
|
|
71
|
+
remaining: number;
|
|
72
|
+
total: number;
|
|
73
|
+
};
|
|
74
|
+
compressionStats?: {
|
|
75
|
+
ratio: number;
|
|
76
|
+
sourceTokens: number;
|
|
77
|
+
compressedTokens: number;
|
|
78
|
+
};
|
|
79
|
+
contextDecision?: ContextDecision;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Main function to retrieve task-specific memory context
|
|
83
|
+
* Now with adaptive retrieval depth and context budget management
|
|
84
|
+
*/
|
|
85
|
+
export declare function retrieveDynamicMemoryContext(taskInstruction: string, projectRoot?: string, options?: {
|
|
86
|
+
maxTokens?: number;
|
|
87
|
+
useSemanticCompression?: boolean;
|
|
88
|
+
taskMetadata?: TaskMetadata;
|
|
89
|
+
}): Promise<DynamicMemoryContext>;
|
|
90
|
+
/**
|
|
91
|
+
* OPTIMIZATION 10: Automatic knowledge bootstrapping feedback loop
|
|
92
|
+
*
|
|
93
|
+
* Call this after each task completes to:
|
|
94
|
+
* 1. Update adaptive context historical data
|
|
95
|
+
* 2. Update model router fingerprints
|
|
96
|
+
* 3. Record knowledge outcomes for domain knowledge improvement
|
|
97
|
+
* 4. Extract and persist new learnings from agent output
|
|
98
|
+
*
|
|
99
|
+
* This closes the feedback loop so each benchmark run improves future accuracy.
|
|
100
|
+
*/
|
|
101
|
+
export interface TaskOutcome {
|
|
102
|
+
instruction: string;
|
|
103
|
+
success: boolean;
|
|
104
|
+
durationMs: number;
|
|
105
|
+
modelId?: string;
|
|
106
|
+
agentOutput?: string;
|
|
107
|
+
projectRoot?: string;
|
|
108
|
+
}
|
|
109
|
+
export declare function recordTaskFeedback(outcome: TaskOutcome): void;
|
|
110
|
+
//# sourceMappingURL=dynamic-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-retrieval.d.ts","sourceRoot":"","sources":["../../src/memory/dynamic-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAgE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG7H,OAAO,EAAqC,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAInH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACxF;AAQD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAiDrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,eAAe,EAC3B,MAAM,GAAE,oBAA+C,GACtD;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAE/E;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,kBAAkB,CAAC;IACnC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,EACvB,WAAW,GAAE,MAAsB,EACnC,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;CACxB,GACL,OAAO,CAAC,oBAAoB,CAAC,CAgI/B;AAqgBD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAmC7D"}
|