mcp-adr-analysis-server 2.1.9 → 2.1.19
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/README.md +55 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +78 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1793 -577
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/index.d.ts.map +1 -1
- package/dist/src/prompts/index.js +23 -6
- package/dist/src/prompts/index.js.map +1 -1
- package/dist/src/prompts/validated-pattern-prompts.d.ts +33 -0
- package/dist/src/prompts/validated-pattern-prompts.d.ts.map +1 -0
- package/dist/src/prompts/validated-pattern-prompts.js +337 -0
- package/dist/src/prompts/validated-pattern-prompts.js.map +1 -0
- package/dist/src/resources/adr-by-id-resource.d.ts +116 -0
- package/dist/src/resources/adr-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/adr-by-id-resource.js +213 -0
- package/dist/src/resources/adr-by-id-resource.js.map +1 -0
- package/dist/src/resources/code-quality-resource.d.ts +105 -0
- package/dist/src/resources/code-quality-resource.d.ts.map +1 -0
- package/dist/src/resources/code-quality-resource.js +282 -0
- package/dist/src/resources/code-quality-resource.js.map +1 -0
- package/dist/src/resources/deployment-history-resource.d.ts +214 -0
- package/dist/src/resources/deployment-history-resource.d.ts.map +1 -0
- package/dist/src/resources/deployment-history-resource.js +308 -0
- package/dist/src/resources/deployment-history-resource.js.map +1 -0
- package/dist/src/resources/deployment-status-resource.d.ts +256 -0
- package/dist/src/resources/deployment-status-resource.d.ts.map +1 -0
- package/dist/src/resources/deployment-status-resource.js +665 -0
- package/dist/src/resources/deployment-status-resource.js.map +1 -0
- package/dist/src/resources/environment-analysis-resource.d.ts +237 -0
- package/dist/src/resources/environment-analysis-resource.d.ts.map +1 -0
- package/dist/src/resources/environment-analysis-resource.js +646 -0
- package/dist/src/resources/environment-analysis-resource.js.map +1 -0
- package/dist/src/resources/index.d.ts +6 -2
- package/dist/src/resources/index.d.ts.map +1 -1
- package/dist/src/resources/index.js +247 -492
- package/dist/src/resources/index.js.map +1 -1
- package/dist/src/resources/memory-snapshots-resource.d.ts +180 -0
- package/dist/src/resources/memory-snapshots-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-snapshots-resource.js +847 -0
- package/dist/src/resources/memory-snapshots-resource.js.map +1 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.d.ts +35 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.js +72 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.js.map +1 -0
- package/dist/src/resources/pattern-by-name-resource.d.ts +53 -0
- package/dist/src/resources/pattern-by-name-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-by-name-resource.js +200 -0
- package/dist/src/resources/pattern-by-name-resource.js.map +1 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.d.ts +26 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.js +59 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.js.map +1 -0
- package/dist/src/resources/project-metrics-resource.d.ts +180 -0
- package/dist/src/resources/project-metrics-resource.d.ts.map +1 -0
- package/dist/src/resources/project-metrics-resource.js +487 -0
- package/dist/src/resources/project-metrics-resource.js.map +1 -0
- package/dist/src/resources/project-status-resource.d.ts +75 -0
- package/dist/src/resources/project-status-resource.d.ts.map +1 -0
- package/dist/src/resources/project-status-resource.js +189 -0
- package/dist/src/resources/project-status-resource.js.map +1 -0
- package/dist/src/resources/research-by-topic-resource.d.ts +21 -0
- package/dist/src/resources/research-by-topic-resource.d.ts.map +1 -0
- package/dist/src/resources/research-by-topic-resource.js +125 -0
- package/dist/src/resources/research-by-topic-resource.js.map +1 -0
- package/dist/src/resources/research-index-resource.d.ts +100 -0
- package/dist/src/resources/research-index-resource.d.ts.map +1 -0
- package/dist/src/resources/research-index-resource.js +200 -0
- package/dist/src/resources/research-index-resource.js.map +1 -0
- package/dist/src/resources/resource-cache.d.ts +144 -0
- package/dist/src/resources/resource-cache.d.ts.map +1 -0
- package/dist/src/resources/resource-cache.js +316 -0
- package/dist/src/resources/resource-cache.js.map +1 -0
- package/dist/src/resources/resource-router.d.ts +45 -0
- package/dist/src/resources/resource-router.d.ts.map +1 -0
- package/dist/src/resources/resource-router.js +96 -0
- package/dist/src/resources/resource-router.js.map +1 -0
- package/dist/src/resources/rule-by-id-resource.d.ts +38 -0
- package/dist/src/resources/rule-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-by-id-resource.js +104 -0
- package/dist/src/resources/rule-by-id-resource.js.map +1 -0
- package/dist/src/resources/rule-catalog-resource.d.ts +126 -0
- package/dist/src/resources/rule-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-catalog-resource.js +224 -0
- package/dist/src/resources/rule-catalog-resource.js.map +1 -0
- package/dist/src/resources/rule-generation-resource.d.ts +80 -0
- package/dist/src/resources/rule-generation-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-generation-resource.js +282 -0
- package/dist/src/resources/rule-generation-resource.js.map +1 -0
- package/dist/src/resources/technology-by-name-resource.d.ts +43 -0
- package/dist/src/resources/technology-by-name-resource.d.ts.map +1 -0
- package/dist/src/resources/technology-by-name-resource.js +176 -0
- package/dist/src/resources/technology-by-name-resource.js.map +1 -0
- package/dist/src/resources/todo-by-id-resource.d.ts +46 -0
- package/dist/src/resources/todo-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/todo-by-id-resource.js +192 -0
- package/dist/src/resources/todo-by-id-resource.js.map +1 -0
- package/dist/src/resources/todo-list-resource.d.ts +96 -0
- package/dist/src/resources/todo-list-resource.d.ts.map +1 -0
- package/dist/src/resources/todo-list-resource.js +209 -0
- package/dist/src/resources/todo-list-resource.js.map +1 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.d.ts +14 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.js +45 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.js.map +1 -0
- package/dist/src/resources/validated-patterns-catalog-resource.d.ts +36 -0
- package/dist/src/resources/validated-patterns-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/validated-patterns-catalog-resource.js +57 -0
- package/dist/src/resources/validated-patterns-catalog-resource.js.map +1 -0
- package/dist/src/templates/domain-knowledge-templates.d.ts.map +1 -1
- package/dist/src/templates/domain-knowledge-templates.js +49 -49
- package/dist/src/templates/domain-knowledge-templates.js.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.js +214 -4
- package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +2 -2
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +129 -12
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/adr-validation-tool.d.ts +98 -0
- package/dist/src/tools/adr-validation-tool.d.ts.map +1 -0
- package/dist/src/tools/adr-validation-tool.js +372 -0
- package/dist/src/tools/adr-validation-tool.js.map +1 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +262 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.js +1934 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -0
- package/dist/src/tools/conversation-memory-tool.d.ts +48 -0
- package/dist/src/tools/conversation-memory-tool.d.ts.map +1 -0
- package/dist/src/tools/conversation-memory-tool.js +254 -0
- package/dist/src/tools/conversation-memory-tool.js.map +1 -0
- package/dist/src/tools/deployment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-analysis-tool.js +82 -6
- package/dist/src/tools/deployment-analysis-tool.js.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.js +126 -25
- package/dist/src/tools/deployment-guidance-tool.js.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.js +166 -5
- package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
- package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/environment-analysis-tool.js +36 -1
- package/dist/src/tools/environment-analysis-tool.js.map +1 -1
- package/dist/src/tools/expand-analysis-tool.d.ts +23 -0
- package/dist/src/tools/expand-analysis-tool.d.ts.map +1 -0
- package/dist/src/tools/expand-analysis-tool.js +107 -0
- package/dist/src/tools/expand-analysis-tool.js.map +1 -0
- package/dist/src/tools/get-server-context-tool.d.ts +67 -0
- package/dist/src/tools/get-server-context-tool.d.ts.map +1 -0
- package/dist/src/tools/get-server-context-tool.js +75 -0
- package/dist/src/tools/get-server-context-tool.js.map +1 -0
- package/dist/src/tools/interactive-adr-planning-tool.d.ts.map +1 -1
- package/dist/src/tools/interactive-adr-planning-tool.js +82 -9
- package/dist/src/tools/interactive-adr-planning-tool.js.map +1 -1
- package/dist/src/tools/llm-cloud-management-tool.d.ts +62 -0
- package/dist/src/tools/llm-cloud-management-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-cloud-management-tool.js +202 -0
- package/dist/src/tools/llm-cloud-management-tool.js.map +1 -0
- package/dist/src/tools/llm-database-management-tool.d.ts +62 -0
- package/dist/src/tools/llm-database-management-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-database-management-tool.js +203 -0
- package/dist/src/tools/llm-database-management-tool.js.map +1 -0
- package/dist/src/tools/llm-web-search-tool.d.ts +59 -0
- package/dist/src/tools/llm-web-search-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-web-search-tool.js +165 -0
- package/dist/src/tools/llm-web-search-tool.js.map +1 -0
- package/dist/src/tools/mcp-planning-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-planning-tool.js +10 -3
- package/dist/src/tools/mcp-planning-tool.js.map +1 -1
- package/dist/src/tools/memory-loading-tool.d.ts.map +1 -1
- package/dist/src/tools/memory-loading-tool.js +4 -2
- package/dist/src/tools/memory-loading-tool.js.map +1 -1
- package/dist/src/tools/perform-research-tool.d.ts +61 -0
- package/dist/src/tools/perform-research-tool.d.ts.map +1 -0
- package/dist/src/tools/perform-research-tool.js +324 -0
- package/dist/src/tools/perform-research-tool.js.map +1 -0
- package/dist/src/tools/research-question-tool.d.ts.map +1 -1
- package/dist/src/tools/research-question-tool.js +11 -9
- package/dist/src/tools/research-question-tool.js.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.js +42 -3
- package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.d.ts +15 -94
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.js +2 -2
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +25 -120
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +91 -2
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
- package/dist/src/types/ape-framework.d.ts +50 -283
- package/dist/src/types/ape-framework.d.ts.map +1 -1
- package/dist/src/types/conversation-context.d.ts.map +1 -1
- package/dist/src/types/conversation-context.js +12 -12
- package/dist/src/types/conversation-context.js.map +1 -1
- package/dist/src/types/conversation-memory.d.ts +184 -0
- package/dist/src/types/conversation-memory.d.ts.map +1 -0
- package/dist/src/types/conversation-memory.js +8 -0
- package/dist/src/types/conversation-memory.js.map +1 -0
- package/dist/src/types/index.d.ts +112 -339
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/knowledge-generation.d.ts +96 -401
- package/dist/src/types/knowledge-generation.d.ts.map +1 -1
- package/dist/src/types/knowledge-graph-schemas.d.ts +77 -715
- package/dist/src/types/knowledge-graph-schemas.d.ts.map +1 -1
- package/dist/src/types/knowledge-graph-schemas.js +8 -8
- package/dist/src/types/knowledge-graph-schemas.js.map +1 -1
- package/dist/src/types/memory-entities.d.ts +1230 -6164
- package/dist/src/types/memory-entities.d.ts.map +1 -1
- package/dist/src/types/memory-entities.js +8 -8
- package/dist/src/types/memory-entities.js.map +1 -1
- package/dist/src/types/reflexion-framework.d.ts +35 -264
- package/dist/src/types/reflexion-framework.d.ts.map +1 -1
- package/dist/src/types/reflexion-framework.js +1 -1
- package/dist/src/types/reflexion-framework.js.map +1 -1
- package/dist/src/types/state-reinforcement.d.ts +87 -0
- package/dist/src/types/state-reinforcement.d.ts.map +1 -0
- package/dist/src/types/state-reinforcement.js +5 -0
- package/dist/src/types/state-reinforcement.js.map +1 -0
- package/dist/src/types/tiered-response.d.ts +61 -0
- package/dist/src/types/tiered-response.d.ts.map +1 -0
- package/dist/src/types/tiered-response.js +8 -0
- package/dist/src/types/tiered-response.js.map +1 -0
- package/dist/src/types/tool-context.d.ts +50 -0
- package/dist/src/types/tool-context.d.ts.map +1 -0
- package/dist/src/types/tool-context.js +20 -0
- package/dist/src/types/tool-context.js.map +1 -0
- package/dist/src/utils/adr-action-analyzer.d.ts +23 -0
- package/dist/src/utils/adr-action-analyzer.d.ts.map +1 -0
- package/dist/src/utils/adr-action-analyzer.js +323 -0
- package/dist/src/utils/adr-action-analyzer.js.map +1 -0
- package/dist/src/utils/adr-context-detector.d.ts +33 -0
- package/dist/src/utils/adr-context-detector.d.ts.map +1 -0
- package/dist/src/utils/adr-context-detector.js +279 -0
- package/dist/src/utils/adr-context-detector.js.map +1 -0
- package/dist/src/utils/adr-discovery.d.ts +28 -2
- package/dist/src/utils/adr-discovery.d.ts.map +1 -1
- package/dist/src/utils/adr-discovery.js +91 -7
- package/dist/src/utils/adr-discovery.js.map +1 -1
- package/dist/src/utils/adr-knowledge-initializer.d.ts +54 -0
- package/dist/src/utils/adr-knowledge-initializer.d.ts.map +1 -0
- package/dist/src/utils/adr-knowledge-initializer.js +240 -0
- package/dist/src/utils/adr-knowledge-initializer.js.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts +21 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.js +294 -0
- package/dist/src/utils/adr-timeline-extractor.js.map +1 -0
- package/dist/src/utils/adr-timeline-types.d.ts +234 -0
- package/dist/src/utils/adr-timeline-types.d.ts.map +1 -0
- package/dist/src/utils/adr-timeline-types.js +7 -0
- package/dist/src/utils/adr-timeline-types.js.map +1 -0
- package/dist/src/utils/ai-executor.d.ts +36 -0
- package/dist/src/utils/ai-executor.d.ts.map +1 -1
- package/dist/src/utils/ai-executor.js +39 -3
- package/dist/src/utils/ai-executor.js.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.d.ts.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.js +15 -15
- package/dist/src/utils/apply-cot-enhancement.js.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.js +68 -58
- package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
- package/dist/src/utils/conditional-request.d.ts +105 -0
- package/dist/src/utils/conditional-request.d.ts.map +1 -0
- package/dist/src/utils/conditional-request.js +186 -0
- package/dist/src/utils/conditional-request.js.map +1 -0
- package/dist/src/utils/config.d.ts +72 -18
- package/dist/src/utils/config.d.ts.map +1 -1
- package/dist/src/utils/config.js +75 -0
- package/dist/src/utils/config.js.map +1 -1
- package/dist/src/utils/context-document-manager.d.ts +112 -0
- package/dist/src/utils/context-document-manager.d.ts.map +1 -0
- package/dist/src/utils/context-document-manager.js +351 -0
- package/dist/src/utils/context-document-manager.js.map +1 -0
- package/dist/src/utils/conversation-memory-manager.d.ts +86 -0
- package/dist/src/utils/conversation-memory-manager.d.ts.map +1 -0
- package/dist/src/utils/conversation-memory-manager.js +443 -0
- package/dist/src/utils/conversation-memory-manager.js.map +1 -0
- package/dist/src/utils/dag-executor.d.ts +106 -0
- package/dist/src/utils/dag-executor.d.ts.map +1 -0
- package/dist/src/utils/dag-executor.js +420 -0
- package/dist/src/utils/dag-executor.js.map +1 -0
- package/dist/src/utils/deployment-analysis.d.ts.map +1 -1
- package/dist/src/utils/deployment-analysis.js +17 -9
- package/dist/src/utils/deployment-analysis.js.map +1 -1
- package/dist/src/utils/deployment-type-registry.d.ts +52 -0
- package/dist/src/utils/deployment-type-registry.d.ts.map +1 -0
- package/dist/src/utils/deployment-type-registry.js +543 -0
- package/dist/src/utils/deployment-type-registry.js.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts +117 -0
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js +445 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -0
- package/dist/src/utils/environment-analysis.d.ts.map +1 -1
- package/dist/src/utils/environment-analysis.js +63 -44
- package/dist/src/utils/environment-analysis.js.map +1 -1
- package/dist/src/utils/environment-capability-registry.d.ts +101 -0
- package/dist/src/utils/environment-capability-registry.d.ts.map +1 -0
- package/dist/src/utils/environment-capability-registry.js +489 -0
- package/dist/src/utils/environment-capability-registry.js.map +1 -0
- package/dist/src/utils/index.d.ts +3 -3
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +3 -3
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/knowledge-generation.d.ts.map +1 -1
- package/dist/src/utils/knowledge-generation.js +61 -35
- package/dist/src/utils/knowledge-generation.js.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.d.ts +19 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.js +165 -1
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
- package/dist/src/utils/llm-artifact-detector.d.ts.map +1 -1
- package/dist/src/utils/llm-artifact-detector.js +28 -24
- package/dist/src/utils/llm-artifact-detector.js.map +1 -1
- package/dist/src/utils/mermaid-diagrams.d.ts +101 -0
- package/dist/src/utils/mermaid-diagrams.d.ts.map +1 -0
- package/dist/src/utils/mermaid-diagrams.js +445 -0
- package/dist/src/utils/mermaid-diagrams.js.map +1 -0
- package/dist/src/utils/monitoring.d.ts +249 -0
- package/dist/src/utils/monitoring.d.ts.map +1 -0
- package/dist/src/utils/monitoring.js +513 -0
- package/dist/src/utils/monitoring.js.map +1 -0
- package/dist/src/utils/pattern-contribution-helper.d.ts +60 -0
- package/dist/src/utils/pattern-contribution-helper.d.ts.map +1 -0
- package/dist/src/utils/pattern-contribution-helper.js +308 -0
- package/dist/src/utils/pattern-contribution-helper.js.map +1 -0
- package/dist/src/utils/pattern-loader.d.ts +183 -0
- package/dist/src/utils/pattern-loader.d.ts.map +1 -0
- package/dist/src/utils/pattern-loader.js +200 -0
- package/dist/src/utils/pattern-loader.js.map +1 -0
- package/dist/src/utils/pattern-research-utility.d.ts +107 -0
- package/dist/src/utils/pattern-research-utility.d.ts.map +1 -0
- package/dist/src/utils/pattern-research-utility.js +360 -0
- package/dist/src/utils/pattern-research-utility.js.map +1 -0
- package/dist/src/utils/pattern-to-dag-converter.d.ts +62 -0
- package/dist/src/utils/pattern-to-dag-converter.d.ts.map +1 -0
- package/dist/src/utils/pattern-to-dag-converter.js +265 -0
- package/dist/src/utils/pattern-to-dag-converter.js.map +1 -0
- package/dist/src/utils/platform-detector.d.ts +86 -0
- package/dist/src/utils/platform-detector.d.ts.map +1 -0
- package/dist/src/utils/platform-detector.js +509 -0
- package/dist/src/utils/platform-detector.js.map +1 -0
- package/dist/src/utils/prompt-composition.d.ts.map +1 -1
- package/dist/src/utils/prompt-composition.js +1 -4
- package/dist/src/utils/prompt-composition.js.map +1 -1
- package/dist/src/utils/reflexion.d.ts.map +1 -1
- package/dist/src/utils/reflexion.js +51 -42
- package/dist/src/utils/reflexion.js.map +1 -1
- package/dist/src/utils/research-integration.d.ts.map +1 -1
- package/dist/src/utils/research-integration.js +8 -2
- package/dist/src/utils/research-integration.js.map +1 -1
- package/dist/src/utils/research-orchestrator.d.ts +209 -0
- package/dist/src/utils/research-orchestrator.d.ts.map +1 -0
- package/dist/src/utils/research-orchestrator.js +863 -0
- package/dist/src/utils/research-orchestrator.js.map +1 -0
- package/dist/src/utils/research-questions.d.ts.map +1 -1
- package/dist/src/utils/research-questions.js +4 -1
- package/dist/src/utils/research-questions.js.map +1 -1
- package/dist/src/utils/resource-extractor.d.ts +57 -0
- package/dist/src/utils/resource-extractor.d.ts.map +1 -0
- package/dist/src/utils/resource-extractor.js +323 -0
- package/dist/src/utils/resource-extractor.js.map +1 -0
- package/dist/src/utils/resource-versioning.d.ts +124 -0
- package/dist/src/utils/resource-versioning.d.ts.map +1 -0
- package/dist/src/utils/resource-versioning.js +272 -0
- package/dist/src/utils/resource-versioning.js.map +1 -0
- package/dist/src/utils/root-manager.d.ts +118 -0
- package/dist/src/utils/root-manager.d.ts.map +1 -0
- package/dist/src/utils/root-manager.js +154 -0
- package/dist/src/utils/root-manager.js.map +1 -0
- package/dist/src/utils/rule-generation.d.ts.map +1 -1
- package/dist/src/utils/rule-generation.js +4 -1
- package/dist/src/utils/rule-generation.js.map +1 -1
- package/dist/src/utils/server-context-generator.d.ts +47 -0
- package/dist/src/utils/server-context-generator.d.ts.map +1 -0
- package/dist/src/utils/server-context-generator.js +666 -0
- package/dist/src/utils/server-context-generator.js.map +1 -0
- package/dist/src/utils/state-reinforcement-manager.d.ts +60 -0
- package/dist/src/utils/state-reinforcement-manager.d.ts.map +1 -0
- package/dist/src/utils/state-reinforcement-manager.js +200 -0
- package/dist/src/utils/state-reinforcement-manager.js.map +1 -0
- package/dist/src/utils/system-card-manager.d.ts +194 -0
- package/dist/src/utils/system-card-manager.d.ts.map +1 -0
- package/dist/src/utils/system-card-manager.js +336 -0
- package/dist/src/utils/system-card-manager.js.map +1 -0
- package/dist/src/utils/tiered-response-manager.d.ts +40 -0
- package/dist/src/utils/tiered-response-manager.d.ts.map +1 -0
- package/dist/src/utils/tiered-response-manager.js +243 -0
- package/dist/src/utils/tiered-response-manager.js.map +1 -0
- package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/src/utils/tree-sitter-analyzer.js +83 -11
- package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
- package/dist/src/utils/validated-pattern-definitions.d.ts +219 -0
- package/dist/src/utils/validated-pattern-definitions.d.ts.map +1 -0
- package/dist/src/utils/validated-pattern-definitions.js +1511 -0
- package/dist/src/utils/validated-pattern-definitions.js.map +1 -0
- package/package.json +21 -12
- package/dist/src/prompts/todo-prompts.d.ts +0 -49
- package/dist/src/prompts/todo-prompts.d.ts.map +0 -1
- package/dist/src/prompts/todo-prompts.js +0 -824
- package/dist/src/prompts/todo-prompts.js.map +0 -1
- package/dist/src/types/todo-json-schemas.d.ts +0 -17
- package/dist/src/types/todo-json-schemas.d.ts.map +0 -1
- package/dist/src/types/todo-json-schemas.js +0 -9
- package/dist/src/types/todo-json-schemas.js.map +0 -1
- package/dist/src/utils/todo-file-watcher.d.ts +0 -14
- package/dist/src/utils/todo-file-watcher.d.ts.map +0 -1
- package/dist/src/utils/todo-file-watcher.js +0 -25
- package/dist/src/utils/todo-file-watcher.js.map +0 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research Index Resource
|
|
3
|
+
* Provides access to research documents and findings
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { McpAdrError } from '../types/index.js';
|
|
8
|
+
import { resourceCache, generateETag } from './resource-cache.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extract title from markdown content
|
|
11
|
+
*/
|
|
12
|
+
function extractTitle(content) {
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
for (const line of lines) {
|
|
15
|
+
const trimmed = line.trim();
|
|
16
|
+
if (trimmed.startsWith('# ')) {
|
|
17
|
+
return trimmed.substring(2).trim();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return 'Untitled';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract topic from filename
|
|
24
|
+
*/
|
|
25
|
+
function extractTopic(filename) {
|
|
26
|
+
// Remove extension and parse filename
|
|
27
|
+
// Example: perform_research_test_research_001.md -> research
|
|
28
|
+
const baseName = filename.replace(/\.md$/, '');
|
|
29
|
+
const parts = baseName.split('_');
|
|
30
|
+
// Try to find meaningful topic
|
|
31
|
+
if (parts.includes('research')) {
|
|
32
|
+
const researchIndex = parts.indexOf('research');
|
|
33
|
+
if (researchIndex > 0) {
|
|
34
|
+
return parts.slice(0, researchIndex + 1).join('_');
|
|
35
|
+
}
|
|
36
|
+
return 'research';
|
|
37
|
+
}
|
|
38
|
+
return parts[0] || 'general';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Group documents by topic
|
|
42
|
+
*/
|
|
43
|
+
function groupByTopic(docs) {
|
|
44
|
+
const grouped = {};
|
|
45
|
+
for (const doc of docs) {
|
|
46
|
+
grouped[doc.topic] = (grouped[doc.topic] || 0) + 1;
|
|
47
|
+
}
|
|
48
|
+
return grouped;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate comprehensive research document index resource with metadata and categorization.
|
|
52
|
+
*
|
|
53
|
+
* Scans project research directories and builds an index of all research documents with
|
|
54
|
+
* metadata including titles, topics, word counts, file sizes, and last modified dates.
|
|
55
|
+
* Supports multiple research directories for organizational flexibility.
|
|
56
|
+
*
|
|
57
|
+
* **Scanned Directories:**
|
|
58
|
+
* - `docs/research/` - Primary research documentation
|
|
59
|
+
* - `custom/research/` - Custom user research notes
|
|
60
|
+
*
|
|
61
|
+
* **Document Extraction:**
|
|
62
|
+
* - Title: Extracted from first H1 heading or filename
|
|
63
|
+
* - Topic: Derived from filename prefix or directory structure
|
|
64
|
+
* - Metadata: Word count, file size, last modified timestamp
|
|
65
|
+
*
|
|
66
|
+
* @returns Promise resolving to resource generation result containing:
|
|
67
|
+
* - data: Complete research index with documents array and summary statistics
|
|
68
|
+
* - contentType: "application/json"
|
|
69
|
+
* - lastModified: ISO timestamp of generation
|
|
70
|
+
* - cacheKey: "research-index:current"
|
|
71
|
+
* - ttl: Cache duration (300 seconds / 5 minutes)
|
|
72
|
+
* - etag: Entity tag for cache validation
|
|
73
|
+
*
|
|
74
|
+
* @throws {McpAdrError} When research index generation fails due to:
|
|
75
|
+
* - RESOURCE_GENERATION_ERROR: File system access errors or markdown parsing failures
|
|
76
|
+
* - Cache operation failures
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const researchIndex = await generateResearchIndexResource();
|
|
81
|
+
*
|
|
82
|
+
* console.log(`Total research documents: ${researchIndex.data.summary.total}`);
|
|
83
|
+
* console.log(`Topics covered: ${researchIndex.data.summary.byTopic.length}`);
|
|
84
|
+
* console.log(`Total words: ${researchIndex.data.summary.totalWords}`);
|
|
85
|
+
*
|
|
86
|
+
* // Find research by topic
|
|
87
|
+
* const architectureDocs = researchIndex.data.documents.filter(
|
|
88
|
+
* doc => doc.topic === 'architecture'
|
|
89
|
+
* );
|
|
90
|
+
* console.log(`Architecture research docs: ${architectureDocs.length}`);
|
|
91
|
+
*
|
|
92
|
+
* // Sort by recency
|
|
93
|
+
* const recentDocs = researchIndex.data.documents
|
|
94
|
+
* .sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime())
|
|
95
|
+
* .slice(0, 5);
|
|
96
|
+
*
|
|
97
|
+
* // Expected output structure:
|
|
98
|
+
* {
|
|
99
|
+
* data: {
|
|
100
|
+
* version: "1.0.0",
|
|
101
|
+
* timestamp: "2025-10-12T17:00:00.000Z",
|
|
102
|
+
* summary: {
|
|
103
|
+
* total: 55,
|
|
104
|
+
* byTopic: {
|
|
105
|
+
* "performance": 12,
|
|
106
|
+
* "security": 8,
|
|
107
|
+
* "architecture": 15
|
|
108
|
+
* },
|
|
109
|
+
* totalWords: 45000,
|
|
110
|
+
* averageWordCount: 818
|
|
111
|
+
* },
|
|
112
|
+
* documents: [
|
|
113
|
+
* {
|
|
114
|
+
* id: "perform_research_research_001",
|
|
115
|
+
* title: "TypeScript Performance Optimization",
|
|
116
|
+
* topic: "performance",
|
|
117
|
+
* path: "docs/research/perform_research_research_001.md",
|
|
118
|
+
* lastModified: "2025-10-10T12:00:00.000Z",
|
|
119
|
+
* wordCount: 1250,
|
|
120
|
+
* size: 8192
|
|
121
|
+
* }
|
|
122
|
+
* ]
|
|
123
|
+
* },
|
|
124
|
+
* contentType: "application/json",
|
|
125
|
+
* cacheKey: "research-index:current",
|
|
126
|
+
* ttl: 300
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @since v2.0.0
|
|
131
|
+
* @see {@link extractTitle} for title extraction logic
|
|
132
|
+
* @see {@link extractTopic} for topic categorization
|
|
133
|
+
*/
|
|
134
|
+
export async function generateResearchIndexResource() {
|
|
135
|
+
try {
|
|
136
|
+
const cacheKey = 'research-index:current';
|
|
137
|
+
// Check cache
|
|
138
|
+
const cached = await resourceCache.get(cacheKey);
|
|
139
|
+
if (cached) {
|
|
140
|
+
return cached;
|
|
141
|
+
}
|
|
142
|
+
const researchDirs = ['docs/research', 'custom/research'];
|
|
143
|
+
const researchDocs = [];
|
|
144
|
+
for (const dir of researchDirs) {
|
|
145
|
+
const fullPath = path.resolve(process.cwd(), dir);
|
|
146
|
+
try {
|
|
147
|
+
await fs.access(fullPath);
|
|
148
|
+
const files = await fs.readdir(fullPath);
|
|
149
|
+
for (const file of files) {
|
|
150
|
+
if (file.endsWith('.md')) {
|
|
151
|
+
const filePath = path.join(fullPath, file);
|
|
152
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
153
|
+
const stats = await fs.stat(filePath);
|
|
154
|
+
researchDocs.push({
|
|
155
|
+
id: file.replace(/\.md$/, ''),
|
|
156
|
+
title: extractTitle(content),
|
|
157
|
+
topic: extractTopic(file),
|
|
158
|
+
path: path.join(dir, file),
|
|
159
|
+
lastModified: stats.mtime.toISOString(),
|
|
160
|
+
wordCount: content.split(/\s+/).filter(w => w.length > 0).length,
|
|
161
|
+
size: stats.size,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Directory doesn't exist or can't be accessed, skip
|
|
168
|
+
console.warn(`[ResearchIndexResource] Cannot access directory: ${fullPath}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Sort by last modified (newest first)
|
|
172
|
+
researchDocs.sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime());
|
|
173
|
+
const researchIndexData = {
|
|
174
|
+
version: '1.0.0',
|
|
175
|
+
timestamp: new Date().toISOString(),
|
|
176
|
+
summary: {
|
|
177
|
+
total: researchDocs.length,
|
|
178
|
+
byTopic: groupByTopic(researchDocs),
|
|
179
|
+
totalWordCount: researchDocs.reduce((sum, doc) => sum + doc.wordCount, 0),
|
|
180
|
+
totalSize: researchDocs.reduce((sum, doc) => sum + doc.size, 0),
|
|
181
|
+
},
|
|
182
|
+
documents: researchDocs,
|
|
183
|
+
};
|
|
184
|
+
const result = {
|
|
185
|
+
data: researchIndexData,
|
|
186
|
+
contentType: 'application/json',
|
|
187
|
+
lastModified: new Date().toISOString(),
|
|
188
|
+
cacheKey,
|
|
189
|
+
ttl: 300, // 5 minutes cache
|
|
190
|
+
etag: generateETag(researchIndexData),
|
|
191
|
+
};
|
|
192
|
+
// Cache result
|
|
193
|
+
resourceCache.set(cacheKey, result, result.ttl);
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
throw new McpAdrError(`Failed to generate research index resource: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_GENERATION_ERROR');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=research-index-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-index-resource.js","sourceRoot":"","sources":["../../../src/resources/research-index-resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource-level caching infrastructure for MCP resources
|
|
3
|
+
* Provides efficient caching with TTL support, cache management,
|
|
4
|
+
* and conditional request support (ETags, Last-Modified)
|
|
5
|
+
*/
|
|
6
|
+
import type { ResourceMetadata } from '../utils/resource-versioning.js';
|
|
7
|
+
export interface CacheEntry {
|
|
8
|
+
data: any;
|
|
9
|
+
expiry: number;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
accessCount: number;
|
|
12
|
+
lastAccessed: number;
|
|
13
|
+
etag?: string;
|
|
14
|
+
lastModified?: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
metadata?: ResourceMetadata;
|
|
17
|
+
}
|
|
18
|
+
export interface CacheStats {
|
|
19
|
+
totalEntries: number;
|
|
20
|
+
validEntries: number;
|
|
21
|
+
expiredEntries: number;
|
|
22
|
+
cacheSize: number;
|
|
23
|
+
hitRate: number;
|
|
24
|
+
totalHits: number;
|
|
25
|
+
totalMisses: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resource cache with TTL support and statistics tracking
|
|
29
|
+
*/
|
|
30
|
+
export declare class ResourceCache {
|
|
31
|
+
private cache;
|
|
32
|
+
private hits;
|
|
33
|
+
private misses;
|
|
34
|
+
/**
|
|
35
|
+
* Get cached resource by key
|
|
36
|
+
* @param key Cache key
|
|
37
|
+
* @returns Cached data or null if not found/expired
|
|
38
|
+
*/
|
|
39
|
+
get<T>(key: string): Promise<T | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Get cached resource with conditional request support
|
|
42
|
+
* @param key Cache key
|
|
43
|
+
* @param conditionalHeaders Optional conditional headers
|
|
44
|
+
* @returns Result with data, metadata, and notModified flag
|
|
45
|
+
*/
|
|
46
|
+
getWithConditional<T>(key: string, conditionalHeaders?: {
|
|
47
|
+
ifNoneMatch?: string;
|
|
48
|
+
ifModifiedSince?: string;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
data: T | null;
|
|
51
|
+
notModified: boolean;
|
|
52
|
+
etag?: string;
|
|
53
|
+
lastModified?: string;
|
|
54
|
+
version?: string;
|
|
55
|
+
metadata?: ResourceMetadata;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Set cached resource with TTL
|
|
59
|
+
* @param key Cache key
|
|
60
|
+
* @param data Data to cache
|
|
61
|
+
* @param ttl Time to live in seconds
|
|
62
|
+
* @param metadata Optional metadata (etag, lastModified, version, resourceMetadata)
|
|
63
|
+
*/
|
|
64
|
+
set(key: string, data: any, ttl: number, metadata?: {
|
|
65
|
+
etag?: string;
|
|
66
|
+
lastModified?: string;
|
|
67
|
+
version?: string;
|
|
68
|
+
resourceMetadata?: ResourceMetadata;
|
|
69
|
+
}): void;
|
|
70
|
+
/**
|
|
71
|
+
* Check if key exists and is valid
|
|
72
|
+
* @param key Cache key
|
|
73
|
+
* @returns True if key exists and is not expired
|
|
74
|
+
*/
|
|
75
|
+
has(key: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Delete cached resource
|
|
78
|
+
* @param key Cache key
|
|
79
|
+
* @returns True if key was deleted
|
|
80
|
+
*/
|
|
81
|
+
delete(key: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Clear cache entries matching pattern
|
|
84
|
+
* @param pattern Optional pattern to match keys (substring match)
|
|
85
|
+
*/
|
|
86
|
+
clear(pattern?: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Clean up expired entries
|
|
89
|
+
* @returns Number of entries removed
|
|
90
|
+
*/
|
|
91
|
+
cleanup(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Get cache statistics
|
|
94
|
+
* @returns Cache statistics object
|
|
95
|
+
*/
|
|
96
|
+
getStats(): CacheStats;
|
|
97
|
+
/**
|
|
98
|
+
* Get all cache keys
|
|
99
|
+
* @returns Array of all cache keys
|
|
100
|
+
*/
|
|
101
|
+
keys(): string[];
|
|
102
|
+
/**
|
|
103
|
+
* Get cache entries sorted by access count
|
|
104
|
+
* @param limit Maximum number of entries to return
|
|
105
|
+
* @returns Top entries by access count
|
|
106
|
+
*/
|
|
107
|
+
getTopEntries(limit?: number): Array<{
|
|
108
|
+
key: string;
|
|
109
|
+
accessCount: number;
|
|
110
|
+
}>;
|
|
111
|
+
/**
|
|
112
|
+
* Get least recently used entries
|
|
113
|
+
* @param limit Maximum number of entries to return
|
|
114
|
+
* @returns Least recently used entries
|
|
115
|
+
*/
|
|
116
|
+
getLRUEntries(limit?: number): Array<{
|
|
117
|
+
key: string;
|
|
118
|
+
lastAccessed: number;
|
|
119
|
+
}>;
|
|
120
|
+
/**
|
|
121
|
+
* Evict least recently used entries to reduce cache size
|
|
122
|
+
* @param targetSize Target number of entries
|
|
123
|
+
* @returns Number of entries evicted
|
|
124
|
+
*/
|
|
125
|
+
evictLRU(targetSize: number): number;
|
|
126
|
+
/**
|
|
127
|
+
* Reset cache statistics
|
|
128
|
+
*/
|
|
129
|
+
resetStats(): void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Singleton resource cache instance
|
|
133
|
+
*/
|
|
134
|
+
export declare const resourceCache: ResourceCache;
|
|
135
|
+
export declare function startAutomaticCleanup(intervalMs?: number): void;
|
|
136
|
+
export declare function stopAutomaticCleanup(): void;
|
|
137
|
+
/**
|
|
138
|
+
* Generate ETag for resource data
|
|
139
|
+
* @deprecated Use generateStrongETag from conditional-request.ts instead
|
|
140
|
+
* @param data Resource data
|
|
141
|
+
* @returns ETag string
|
|
142
|
+
*/
|
|
143
|
+
export declare function generateETag(data: any): string;
|
|
144
|
+
//# sourceMappingURL=resource-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-cache.d.ts","sourceRoot":"","sources":["../../../src/resources/resource-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource-level caching infrastructure for MCP resources
|
|
3
|
+
* Provides efficient caching with TTL support, cache management,
|
|
4
|
+
* and conditional request support (ETags, Last-Modified)
|
|
5
|
+
*/
|
|
6
|
+
import { generateStrongETag } from '../utils/conditional-request.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resource cache with TTL support and statistics tracking
|
|
9
|
+
*/
|
|
10
|
+
export class ResourceCache {
|
|
11
|
+
cache = new Map();
|
|
12
|
+
hits = 0;
|
|
13
|
+
misses = 0;
|
|
14
|
+
/**
|
|
15
|
+
* Get cached resource by key
|
|
16
|
+
* @param key Cache key
|
|
17
|
+
* @returns Cached data or null if not found/expired
|
|
18
|
+
*/
|
|
19
|
+
async get(key) {
|
|
20
|
+
const entry = this.cache.get(key);
|
|
21
|
+
if (!entry) {
|
|
22
|
+
this.misses++;
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
// Check if expired
|
|
26
|
+
if (entry.expiry <= Date.now()) {
|
|
27
|
+
this.cache.delete(key);
|
|
28
|
+
this.misses++;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Update access stats
|
|
32
|
+
entry.accessCount++;
|
|
33
|
+
entry.lastAccessed = Date.now();
|
|
34
|
+
this.hits++;
|
|
35
|
+
return entry.data;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get cached resource with conditional request support
|
|
39
|
+
* @param key Cache key
|
|
40
|
+
* @param conditionalHeaders Optional conditional headers
|
|
41
|
+
* @returns Result with data, metadata, and notModified flag
|
|
42
|
+
*/
|
|
43
|
+
async getWithConditional(key, conditionalHeaders) {
|
|
44
|
+
const entry = this.cache.get(key);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
this.misses++;
|
|
47
|
+
return { data: null, notModified: false };
|
|
48
|
+
}
|
|
49
|
+
// Check if expired
|
|
50
|
+
if (entry.expiry <= Date.now()) {
|
|
51
|
+
this.cache.delete(key);
|
|
52
|
+
this.misses++;
|
|
53
|
+
return { data: null, notModified: false };
|
|
54
|
+
}
|
|
55
|
+
// Check conditional request headers
|
|
56
|
+
if (conditionalHeaders && entry.etag && entry.lastModified) {
|
|
57
|
+
const { ifNoneMatch, ifModifiedSince } = conditionalHeaders;
|
|
58
|
+
// Import conditional request utilities
|
|
59
|
+
const { evaluateConditionalRequest } = await import('../utils/conditional-request.js');
|
|
60
|
+
// Build params object without undefined values
|
|
61
|
+
const params = {
|
|
62
|
+
currentETag: entry.etag,
|
|
63
|
+
lastModified: entry.lastModified,
|
|
64
|
+
};
|
|
65
|
+
if (ifNoneMatch) {
|
|
66
|
+
params.ifNoneMatch = ifNoneMatch;
|
|
67
|
+
}
|
|
68
|
+
if (ifModifiedSince) {
|
|
69
|
+
params.ifModifiedSince = ifModifiedSince;
|
|
70
|
+
}
|
|
71
|
+
const result = evaluateConditionalRequest(params);
|
|
72
|
+
if (result.notModified) {
|
|
73
|
+
// Resource not modified, don't return data
|
|
74
|
+
entry.accessCount++;
|
|
75
|
+
entry.lastAccessed = Date.now();
|
|
76
|
+
this.hits++;
|
|
77
|
+
const response = {
|
|
78
|
+
data: null,
|
|
79
|
+
notModified: true,
|
|
80
|
+
etag: entry.etag,
|
|
81
|
+
lastModified: entry.lastModified,
|
|
82
|
+
};
|
|
83
|
+
if (entry.version) {
|
|
84
|
+
response.version = entry.version;
|
|
85
|
+
}
|
|
86
|
+
if (entry.metadata) {
|
|
87
|
+
response.metadata = entry.metadata;
|
|
88
|
+
}
|
|
89
|
+
return response;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Update access stats
|
|
93
|
+
entry.accessCount++;
|
|
94
|
+
entry.lastAccessed = Date.now();
|
|
95
|
+
this.hits++;
|
|
96
|
+
// Build return object without undefined values
|
|
97
|
+
const result = {
|
|
98
|
+
data: entry.data,
|
|
99
|
+
notModified: false,
|
|
100
|
+
};
|
|
101
|
+
if (entry.etag) {
|
|
102
|
+
result.etag = entry.etag;
|
|
103
|
+
}
|
|
104
|
+
if (entry.lastModified) {
|
|
105
|
+
result.lastModified = entry.lastModified;
|
|
106
|
+
}
|
|
107
|
+
if (entry.version) {
|
|
108
|
+
result.version = entry.version;
|
|
109
|
+
}
|
|
110
|
+
if (entry.metadata) {
|
|
111
|
+
result.metadata = entry.metadata;
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Set cached resource with TTL
|
|
117
|
+
* @param key Cache key
|
|
118
|
+
* @param data Data to cache
|
|
119
|
+
* @param ttl Time to live in seconds
|
|
120
|
+
* @param metadata Optional metadata (etag, lastModified, version, resourceMetadata)
|
|
121
|
+
*/
|
|
122
|
+
set(key, data, ttl, metadata) {
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
const lastModified = metadata?.lastModified || new Date(now).toISOString();
|
|
125
|
+
const etag = metadata?.etag || generateStrongETag(data);
|
|
126
|
+
const version = metadata?.version;
|
|
127
|
+
const resourceMetadata = metadata?.resourceMetadata;
|
|
128
|
+
const entry = {
|
|
129
|
+
data,
|
|
130
|
+
expiry: now + ttl * 1000,
|
|
131
|
+
createdAt: now,
|
|
132
|
+
accessCount: 0,
|
|
133
|
+
lastAccessed: now,
|
|
134
|
+
etag,
|
|
135
|
+
lastModified,
|
|
136
|
+
};
|
|
137
|
+
if (version) {
|
|
138
|
+
entry.version = version;
|
|
139
|
+
}
|
|
140
|
+
if (resourceMetadata) {
|
|
141
|
+
entry.metadata = resourceMetadata;
|
|
142
|
+
}
|
|
143
|
+
this.cache.set(key, entry);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if key exists and is valid
|
|
147
|
+
* @param key Cache key
|
|
148
|
+
* @returns True if key exists and is not expired
|
|
149
|
+
*/
|
|
150
|
+
has(key) {
|
|
151
|
+
const entry = this.cache.get(key);
|
|
152
|
+
if (!entry)
|
|
153
|
+
return false;
|
|
154
|
+
if (entry.expiry <= Date.now()) {
|
|
155
|
+
this.cache.delete(key);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Delete cached resource
|
|
162
|
+
* @param key Cache key
|
|
163
|
+
* @returns True if key was deleted
|
|
164
|
+
*/
|
|
165
|
+
delete(key) {
|
|
166
|
+
return this.cache.delete(key);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear cache entries matching pattern
|
|
170
|
+
* @param pattern Optional pattern to match keys (substring match)
|
|
171
|
+
*/
|
|
172
|
+
clear(pattern) {
|
|
173
|
+
if (!pattern) {
|
|
174
|
+
this.cache.clear();
|
|
175
|
+
this.hits = 0;
|
|
176
|
+
this.misses = 0;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const keysToDelete = [];
|
|
180
|
+
for (const key of this.cache.keys()) {
|
|
181
|
+
if (key.includes(pattern)) {
|
|
182
|
+
keysToDelete.push(key);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
keysToDelete.forEach(key => this.cache.delete(key));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Clean up expired entries
|
|
189
|
+
* @returns Number of entries removed
|
|
190
|
+
*/
|
|
191
|
+
cleanup() {
|
|
192
|
+
const now = Date.now();
|
|
193
|
+
let removed = 0;
|
|
194
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
195
|
+
if (entry.expiry <= now) {
|
|
196
|
+
this.cache.delete(key);
|
|
197
|
+
removed++;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return removed;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get cache statistics
|
|
204
|
+
* @returns Cache statistics object
|
|
205
|
+
*/
|
|
206
|
+
getStats() {
|
|
207
|
+
const entries = Array.from(this.cache.values());
|
|
208
|
+
const now = Date.now();
|
|
209
|
+
const validEntries = entries.filter(e => e.expiry > now);
|
|
210
|
+
const expiredEntries = entries.filter(e => e.expiry <= now);
|
|
211
|
+
const totalRequests = this.hits + this.misses;
|
|
212
|
+
const hitRate = totalRequests > 0 ? this.hits / totalRequests : 0;
|
|
213
|
+
return {
|
|
214
|
+
totalEntries: this.cache.size,
|
|
215
|
+
validEntries: validEntries.length,
|
|
216
|
+
expiredEntries: expiredEntries.length,
|
|
217
|
+
cacheSize: JSON.stringify(entries).length,
|
|
218
|
+
hitRate,
|
|
219
|
+
totalHits: this.hits,
|
|
220
|
+
totalMisses: this.misses,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get all cache keys
|
|
225
|
+
* @returns Array of all cache keys
|
|
226
|
+
*/
|
|
227
|
+
keys() {
|
|
228
|
+
return Array.from(this.cache.keys());
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get cache entries sorted by access count
|
|
232
|
+
* @param limit Maximum number of entries to return
|
|
233
|
+
* @returns Top entries by access count
|
|
234
|
+
*/
|
|
235
|
+
getTopEntries(limit = 10) {
|
|
236
|
+
const entries = Array.from(this.cache.entries())
|
|
237
|
+
.map(([key, entry]) => ({
|
|
238
|
+
key,
|
|
239
|
+
accessCount: entry.accessCount,
|
|
240
|
+
}))
|
|
241
|
+
.sort((a, b) => b.accessCount - a.accessCount)
|
|
242
|
+
.slice(0, limit);
|
|
243
|
+
return entries;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get least recently used entries
|
|
247
|
+
* @param limit Maximum number of entries to return
|
|
248
|
+
* @returns Least recently used entries
|
|
249
|
+
*/
|
|
250
|
+
getLRUEntries(limit = 10) {
|
|
251
|
+
const entries = Array.from(this.cache.entries())
|
|
252
|
+
.map(([key, entry]) => ({
|
|
253
|
+
key,
|
|
254
|
+
lastAccessed: entry.lastAccessed,
|
|
255
|
+
}))
|
|
256
|
+
.sort((a, b) => a.lastAccessed - b.lastAccessed)
|
|
257
|
+
.slice(0, limit);
|
|
258
|
+
return entries;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Evict least recently used entries to reduce cache size
|
|
262
|
+
* @param targetSize Target number of entries
|
|
263
|
+
* @returns Number of entries evicted
|
|
264
|
+
*/
|
|
265
|
+
evictLRU(targetSize) {
|
|
266
|
+
if (this.cache.size <= targetSize)
|
|
267
|
+
return 0;
|
|
268
|
+
const entriesToEvict = this.cache.size - targetSize;
|
|
269
|
+
const lruEntries = this.getLRUEntries(entriesToEvict);
|
|
270
|
+
lruEntries.forEach(({ key }) => this.cache.delete(key));
|
|
271
|
+
return entriesToEvict;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Reset cache statistics
|
|
275
|
+
*/
|
|
276
|
+
resetStats() {
|
|
277
|
+
this.hits = 0;
|
|
278
|
+
this.misses = 0;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Singleton resource cache instance
|
|
283
|
+
*/
|
|
284
|
+
export const resourceCache = new ResourceCache();
|
|
285
|
+
/**
|
|
286
|
+
* Start automatic cleanup interval
|
|
287
|
+
* Cleans up expired entries every 5 minutes
|
|
288
|
+
*/
|
|
289
|
+
let cleanupInterval = null;
|
|
290
|
+
export function startAutomaticCleanup(intervalMs = 5 * 60 * 1000) {
|
|
291
|
+
if (cleanupInterval) {
|
|
292
|
+
clearInterval(cleanupInterval);
|
|
293
|
+
}
|
|
294
|
+
cleanupInterval = setInterval(() => {
|
|
295
|
+
const removed = resourceCache.cleanup();
|
|
296
|
+
if (removed > 0) {
|
|
297
|
+
console.log(`[ResourceCache] Cleaned up ${removed} expired entries`);
|
|
298
|
+
}
|
|
299
|
+
}, intervalMs);
|
|
300
|
+
}
|
|
301
|
+
export function stopAutomaticCleanup() {
|
|
302
|
+
if (cleanupInterval) {
|
|
303
|
+
clearInterval(cleanupInterval);
|
|
304
|
+
cleanupInterval = null;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Generate ETag for resource data
|
|
309
|
+
* @deprecated Use generateStrongETag from conditional-request.ts instead
|
|
310
|
+
* @param data Resource data
|
|
311
|
+
* @returns ETag string
|
|
312
|
+
*/
|
|
313
|
+
export function generateETag(data) {
|
|
314
|
+
return generateStrongETag(data);
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=resource-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-cache.js","sourceRoot":"","sources":["../../../src/resources/resource-cache.ts"],"names":[],"mappings":"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"}
|