mcp-adr-analysis-server 2.1.19 → 2.1.22
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 +1 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/config/ai-config.d.ts +54 -6
- package/dist/src/config/ai-config.d.ts.map +1 -1
- package/dist/src/config/ai-config.js +69 -6
- package/dist/src/config/ai-config.js.map +1 -1
- package/dist/src/config/ape-descriptions.d.ts +77 -0
- package/dist/src/config/ape-descriptions.d.ts.map +1 -0
- package/dist/src/config/ape-descriptions.js +177 -0
- package/dist/src/config/ape-descriptions.js.map +1 -0
- package/dist/src/index.d.ts +40 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +564 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.d.ts +5 -0
- package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.js +22 -1
- package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
- package/dist/src/prompts/prompt-catalog.d.ts +95 -0
- package/dist/src/prompts/prompt-catalog.d.ts.map +1 -0
- package/dist/src/prompts/prompt-catalog.js +300 -0
- package/dist/src/prompts/prompt-catalog.js.map +1 -0
- package/dist/src/resources/adrs-discovered-resource.d.ts +124 -0
- package/dist/src/resources/adrs-discovered-resource.d.ts.map +1 -0
- package/dist/src/resources/adrs-discovered-resource.js +174 -0
- package/dist/src/resources/adrs-discovered-resource.js.map +1 -0
- package/dist/src/resources/adrs-review-resource.d.ts +82 -0
- package/dist/src/resources/adrs-review-resource.d.ts.map +1 -0
- package/dist/src/resources/adrs-review-resource.js +160 -0
- package/dist/src/resources/adrs-review-resource.js.map +1 -0
- package/dist/src/resources/architectural-context-resource.d.ts +95 -0
- package/dist/src/resources/architectural-context-resource.d.ts.map +1 -0
- package/dist/src/resources/architectural-context-resource.js +428 -0
- package/dist/src/resources/architectural-context-resource.js.map +1 -0
- package/dist/src/resources/conversation-snapshot-resource.d.ts +92 -0
- package/dist/src/resources/conversation-snapshot-resource.d.ts.map +1 -0
- package/dist/src/resources/conversation-snapshot-resource.js +122 -0
- package/dist/src/resources/conversation-snapshot-resource.js.map +1 -0
- package/dist/src/resources/deployment-status-resource.js +1 -1
- package/dist/src/resources/deployment-status-resource.js.map +1 -1
- package/dist/src/resources/environment-analysis-resource.js +1 -1
- package/dist/src/resources/environment-analysis-resource.js.map +1 -1
- package/dist/src/resources/knowledge-graph-resource.d.ts +129 -0
- package/dist/src/resources/knowledge-graph-resource.d.ts.map +1 -0
- package/dist/src/resources/knowledge-graph-resource.js +217 -0
- package/dist/src/resources/knowledge-graph-resource.js.map +1 -0
- package/dist/src/resources/memory-expand-resource.d.ts +90 -0
- package/dist/src/resources/memory-expand-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-expand-resource.js +176 -0
- package/dist/src/resources/memory-expand-resource.js.map +1 -0
- package/dist/src/resources/memory-stats-resource.d.ts +77 -0
- package/dist/src/resources/memory-stats-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-stats-resource.js +108 -0
- package/dist/src/resources/memory-stats-resource.js.map +1 -0
- package/dist/src/resources/project-metrics-resource.js +1 -1
- package/dist/src/resources/project-metrics-resource.js.map +1 -1
- package/dist/src/resources/resource-cache.d.ts.map +1 -1
- package/dist/src/resources/resource-cache.js +2 -1
- package/dist/src/resources/resource-cache.js.map +1 -1
- package/dist/src/resources/server-context-resource.d.ts +69 -0
- package/dist/src/resources/server-context-resource.d.ts.map +1 -0
- package/dist/src/resources/server-context-resource.js +104 -0
- package/dist/src/resources/server-context-resource.js.map +1 -0
- package/dist/src/resources/tool-catalog-resource.d.ts +122 -0
- package/dist/src/resources/tool-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/tool-catalog-resource.js +167 -0
- package/dist/src/resources/tool-catalog-resource.js.map +1 -0
- package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.js +7 -6
- package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +5 -0
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +40 -71
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +23 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.js +15 -5
- package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
- package/dist/src/tools/ce-mcp-tools.d.ts +291 -0
- package/dist/src/tools/ce-mcp-tools.d.ts.map +1 -0
- package/dist/src/tools/ce-mcp-tools.js +1188 -0
- package/dist/src/tools/ce-mcp-tools.js.map +1 -0
- package/dist/src/tools/content-masking-tool.d.ts +11 -0
- package/dist/src/tools/content-masking-tool.d.ts.map +1 -1
- package/dist/src/tools/content-masking-tool.js +13 -6
- package/dist/src/tools/content-masking-tool.js.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.d.ts +11 -0
- package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.js +10 -4
- package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
- package/dist/src/tools/environment-analysis-tool.d.ts +96 -1
- package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/environment-analysis-tool.js +38 -46
- package/dist/src/tools/environment-analysis-tool.js.map +1 -1
- package/dist/src/tools/research-question-tool.d.ts.map +1 -1
- package/dist/src/tools/research-question-tool.js +3 -2
- package/dist/src/tools/research-question-tool.js.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.d.ts +5 -0
- package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.js +123 -42
- package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
- package/dist/src/tools/rule-generation-tool.d.ts.map +1 -1
- package/dist/src/tools/rule-generation-tool.js +3 -5
- package/dist/src/tools/rule-generation-tool.js.map +1 -1
- package/dist/src/tools/search-codebase-tool.d.ts +148 -0
- package/dist/src/tools/search-codebase-tool.d.ts.map +1 -0
- package/dist/src/tools/search-codebase-tool.js +406 -0
- package/dist/src/tools/search-codebase-tool.js.map +1 -0
- package/dist/src/tools/smart-git-push-tool-v2.js +1 -1
- package/dist/src/tools/smart-git-push-tool-v2.js.map +1 -1
- package/dist/src/tools/tool-catalog.d.ts +134 -0
- package/dist/src/tools/tool-catalog.d.ts.map +1 -0
- package/dist/src/tools/tool-catalog.js +1431 -0
- package/dist/src/tools/tool-catalog.js.map +1 -0
- package/dist/src/tools/tool-chain-orchestrator.d.ts +11 -2
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.js +11 -2
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
- package/dist/src/tools/tool-dispatcher.d.ts +98 -0
- package/dist/src/tools/tool-dispatcher.d.ts.map +1 -0
- package/dist/src/tools/tool-dispatcher.js +225 -0
- package/dist/src/tools/tool-dispatcher.js.map +1 -0
- package/dist/src/tools/tree-sitter-code-tools.d.ts +184 -0
- package/dist/src/tools/tree-sitter-code-tools.d.ts.map +1 -0
- package/dist/src/tools/tree-sitter-code-tools.js +642 -0
- package/dist/src/tools/tree-sitter-code-tools.js.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +22 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +20 -3
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
- package/dist/src/tools/update-knowledge-tool.d.ts +89 -0
- package/dist/src/tools/update-knowledge-tool.d.ts.map +1 -0
- package/dist/src/tools/update-knowledge-tool.js +222 -0
- package/dist/src/tools/update-knowledge-tool.js.map +1 -0
- package/dist/src/types/ce-mcp.d.ts +248 -0
- package/dist/src/types/ce-mcp.d.ts.map +1 -0
- package/dist/src/types/ce-mcp.js +27 -0
- package/dist/src/types/ce-mcp.js.map +1 -0
- package/dist/src/utils/adr-context-detector.js +1 -1
- package/dist/src/utils/adr-context-detector.js.map +1 -1
- package/dist/src/utils/adr-planning-task-integration.d.ts +260 -0
- package/dist/src/utils/adr-planning-task-integration.d.ts.map +1 -0
- package/dist/src/utils/adr-planning-task-integration.js +466 -0
- package/dist/src/utils/adr-planning-task-integration.js.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -1
- package/dist/src/utils/adr-timeline-extractor.js +3 -2
- package/dist/src/utils/adr-timeline-extractor.js.map +1 -1
- package/dist/src/utils/ai-executor.d.ts +10 -0
- package/dist/src/utils/ai-executor.d.ts.map +1 -1
- package/dist/src/utils/ai-executor.js +14 -3
- package/dist/src/utils/ai-executor.js.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.d.ts +5 -0
- package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.js +10 -90
- package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
- package/dist/src/utils/bootstrap-task-integration.d.ts +214 -0
- package/dist/src/utils/bootstrap-task-integration.d.ts.map +1 -0
- package/dist/src/utils/bootstrap-task-integration.js +365 -0
- package/dist/src/utils/bootstrap-task-integration.js.map +1 -0
- package/dist/src/utils/dag-executor.d.ts.map +1 -1
- package/dist/src/utils/dag-executor.js +48 -15
- package/dist/src/utils/dag-executor.js.map +1 -1
- package/dist/src/utils/deployment-task-integration.d.ts +260 -0
- package/dist/src/utils/deployment-task-integration.d.ts.map +1 -0
- package/dist/src/utils/deployment-task-integration.js +393 -0
- package/dist/src/utils/deployment-task-integration.js.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js +1 -1
- package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -1
- package/dist/src/utils/enhanced-logging.d.ts +3 -0
- package/dist/src/utils/enhanced-logging.d.ts.map +1 -1
- package/dist/src/utils/enhanced-logging.js +9 -30
- package/dist/src/utils/enhanced-logging.js.map +1 -1
- package/dist/src/utils/environment-capability-registry.js +1 -1
- package/dist/src/utils/environment-capability-registry.js.map +1 -1
- package/dist/src/utils/file-system.d.ts.map +1 -1
- package/dist/src/utils/file-system.js +33 -3
- package/dist/src/utils/file-system.js.map +1 -1
- package/dist/src/utils/gitleaks-detector.js +1 -1
- package/dist/src/utils/gitleaks-detector.js.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.d.ts +13 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.js +13 -0
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
- package/dist/src/utils/prompt-execution.d.ts +29 -1
- package/dist/src/utils/prompt-execution.d.ts.map +1 -1
- package/dist/src/utils/prompt-execution.js +29 -1
- package/dist/src/utils/prompt-execution.js.map +1 -1
- package/dist/src/utils/research-orchestrator.d.ts +87 -1
- package/dist/src/utils/research-orchestrator.d.ts.map +1 -1
- package/dist/src/utils/research-orchestrator.js +121 -17
- package/dist/src/utils/research-orchestrator.js.map +1 -1
- package/dist/src/utils/research-task-integration.d.ts +297 -0
- package/dist/src/utils/research-task-integration.d.ts.map +1 -0
- package/dist/src/utils/research-task-integration.js +449 -0
- package/dist/src/utils/research-task-integration.js.map +1 -0
- package/dist/src/utils/ripgrep-wrapper.d.ts.map +1 -1
- package/dist/src/utils/ripgrep-wrapper.js +17 -3
- package/dist/src/utils/ripgrep-wrapper.js.map +1 -1
- package/dist/src/utils/sandbox-executor.d.ts +145 -0
- package/dist/src/utils/sandbox-executor.d.ts.map +1 -0
- package/dist/src/utils/sandbox-executor.js +642 -0
- package/dist/src/utils/sandbox-executor.js.map +1 -0
- package/dist/src/utils/server-context-generator.d.ts +5 -0
- package/dist/src/utils/server-context-generator.d.ts.map +1 -1
- package/dist/src/utils/server-context-generator.js +38 -0
- package/dist/src/utils/server-context-generator.js.map +1 -1
- package/dist/src/utils/task-manager.d.ts +239 -0
- package/dist/src/utils/task-manager.d.ts.map +1 -0
- package/dist/src/utils/task-manager.js +528 -0
- package/dist/src/utils/task-manager.js.map +1 -0
- package/dist/src/utils/task-persistence.d.ts +82 -0
- package/dist/src/utils/task-persistence.d.ts.map +1 -0
- package/dist/src/utils/task-persistence.js +248 -0
- package/dist/src/utils/task-persistence.js.map +1 -0
- package/dist/src/utils/test-aware-defaults.d.ts +57 -0
- package/dist/src/utils/test-aware-defaults.d.ts.map +1 -0
- package/dist/src/utils/test-aware-defaults.js +71 -0
- package/dist/src/utils/test-aware-defaults.js.map +1 -0
- package/dist/src/utils/tree-sitter-analyzer.d.ts +42 -5
- package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/src/utils/tree-sitter-analyzer.js +499 -17
- package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
- package/package.json +25 -20
- package/dist/src/tools/smart-git-push-tool.d.ts +0 -55
- package/dist/src/tools/smart-git-push-tool.d.ts.map +0 -1
- package/dist/src/tools/smart-git-push-tool.js +0 -1011
- package/dist/src/tools/smart-git-push-tool.js.map +0 -1
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architectural Context Resource - Current architectural state and decisions
|
|
3
|
+
* URI Pattern: adr://architecture/context
|
|
4
|
+
*/
|
|
5
|
+
import { McpAdrError } from '../types/index.js';
|
|
6
|
+
import { resourceCache, generateETag } from './resource-cache.js';
|
|
7
|
+
import { resourceRouter } from './resource-router.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate architectural context resource showing current state and decisions.
|
|
10
|
+
*
|
|
11
|
+
* Returns a comprehensive view of the project's architectural state:
|
|
12
|
+
* - Summary of all ADRs by status
|
|
13
|
+
* - Technology stack analysis
|
|
14
|
+
* - Architectural patterns in use
|
|
15
|
+
* - Recommendations for improvements
|
|
16
|
+
*
|
|
17
|
+
* **URI Pattern:** `adr://architecture/context`
|
|
18
|
+
*
|
|
19
|
+
* **Query Parameters:**
|
|
20
|
+
* - `projectPath`: Override project root path (default: process.cwd())
|
|
21
|
+
* - `includeDeprecated`: Include deprecated decisions (default: true)
|
|
22
|
+
* - `includeProposed`: Include proposed decisions (default: true)
|
|
23
|
+
* - `maxDecisions`: Maximum decisions to return (default: 50)
|
|
24
|
+
*
|
|
25
|
+
* @param params - URL path parameters (none for this resource)
|
|
26
|
+
* @param searchParams - URL query parameters for customization
|
|
27
|
+
* @param kgManager - Optional knowledge graph manager instance
|
|
28
|
+
*
|
|
29
|
+
* @returns Promise resolving to resource generation result containing:
|
|
30
|
+
* - data: Complete architectural context data
|
|
31
|
+
* - contentType: "application/json"
|
|
32
|
+
* - lastModified: ISO timestamp of generation
|
|
33
|
+
* - cacheKey: Unique identifier "architectural-context"
|
|
34
|
+
* - ttl: Cache duration (300 seconds / 5 minutes)
|
|
35
|
+
* - etag: Entity tag for cache validation
|
|
36
|
+
*
|
|
37
|
+
* @throws {McpAdrError} When context generation fails
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Get full architectural context
|
|
42
|
+
* const context = await generateArchitecturalContextResource(
|
|
43
|
+
* {},
|
|
44
|
+
* new URLSearchParams()
|
|
45
|
+
* );
|
|
46
|
+
*
|
|
47
|
+
* console.log(`Total ADRs: ${context.data.summary.totalAdrs}`);
|
|
48
|
+
* console.log(`Technologies: ${context.data.summary.technologiesUsed.join(', ')}`);
|
|
49
|
+
*
|
|
50
|
+
* // Exclude deprecated decisions
|
|
51
|
+
* const active = await generateArchitecturalContextResource(
|
|
52
|
+
* {},
|
|
53
|
+
* new URLSearchParams('includeDeprecated=false')
|
|
54
|
+
* );
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @since v2.2.0
|
|
58
|
+
* @see {@link KnowledgeGraphManager} for knowledge graph queries
|
|
59
|
+
*/
|
|
60
|
+
export async function generateArchitecturalContextResource(_params, searchParams, kgManager) {
|
|
61
|
+
const projectPath = searchParams.get('projectPath') || process.cwd();
|
|
62
|
+
const includeDeprecated = searchParams.get('includeDeprecated') !== 'false';
|
|
63
|
+
const includeProposed = searchParams.get('includeProposed') !== 'false';
|
|
64
|
+
const maxDecisions = parseInt(searchParams.get('maxDecisions') || '50', 10);
|
|
65
|
+
const cacheKey = 'architectural-context';
|
|
66
|
+
// Check cache
|
|
67
|
+
const cached = await resourceCache.get(cacheKey);
|
|
68
|
+
if (cached) {
|
|
69
|
+
return cached;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
// Discover ADRs to build context
|
|
73
|
+
const { discoverAdrsInDirectory } = await import('../utils/adr-discovery.js');
|
|
74
|
+
const pathModule = await import('path');
|
|
75
|
+
const adrDirectory = pathModule.resolve(projectPath, process.env['ADR_DIRECTORY'] || 'docs/adrs');
|
|
76
|
+
const discoveryResult = await discoverAdrsInDirectory(adrDirectory, projectPath, {
|
|
77
|
+
includeContent: true,
|
|
78
|
+
includeTimeline: false,
|
|
79
|
+
});
|
|
80
|
+
// Categorize ADRs by status
|
|
81
|
+
const statusCounts = {
|
|
82
|
+
accepted: 0,
|
|
83
|
+
deprecated: 0,
|
|
84
|
+
proposed: 0,
|
|
85
|
+
superseded: 0,
|
|
86
|
+
unknown: 0,
|
|
87
|
+
};
|
|
88
|
+
const technologies = new Set();
|
|
89
|
+
const patterns = new Set();
|
|
90
|
+
const decisions = [];
|
|
91
|
+
for (const adr of discoveryResult.adrs) {
|
|
92
|
+
const status = (adr.status || 'unknown').toLowerCase();
|
|
93
|
+
if (status in statusCounts) {
|
|
94
|
+
statusCounts[status]++;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
statusCounts.unknown++;
|
|
98
|
+
}
|
|
99
|
+
// Skip deprecated if not requested
|
|
100
|
+
if (!includeDeprecated && status === 'deprecated')
|
|
101
|
+
continue;
|
|
102
|
+
if (!includeProposed && status === 'proposed')
|
|
103
|
+
continue;
|
|
104
|
+
// Extract technologies from content
|
|
105
|
+
const content = `${adr.context || ''} ${adr.decision || ''} ${adr.consequences || ''}`;
|
|
106
|
+
extractTechnologies(content, technologies);
|
|
107
|
+
extractPatterns(content, patterns);
|
|
108
|
+
// Add to decisions list
|
|
109
|
+
if (decisions.length < maxDecisions) {
|
|
110
|
+
decisions.push({
|
|
111
|
+
id: adr.filename.replace(/\.md$/, ''),
|
|
112
|
+
title: adr.title || 'Untitled',
|
|
113
|
+
status: adr.status || 'unknown',
|
|
114
|
+
category: categorizeAdr(adr.title || '', content),
|
|
115
|
+
impact: determineImpact(content),
|
|
116
|
+
dependencies: extractDependencies(content),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Build technology stack
|
|
121
|
+
const technologyStack = categorizeTechnologies([...technologies]);
|
|
122
|
+
// Build patterns list
|
|
123
|
+
const patternsList = [...patterns].map(pattern => ({
|
|
124
|
+
name: pattern,
|
|
125
|
+
description: getPatternDescription(pattern),
|
|
126
|
+
usedIn: findPatternUsage(pattern, discoveryResult.adrs),
|
|
127
|
+
relatedAdrs: findRelatedAdrs(pattern, discoveryResult.adrs),
|
|
128
|
+
}));
|
|
129
|
+
// Generate recommendations
|
|
130
|
+
const recommendations = generateRecommendations(discoveryResult.adrs, statusCounts, [
|
|
131
|
+
...technologies,
|
|
132
|
+
]);
|
|
133
|
+
// Get additional context from knowledge graph if available
|
|
134
|
+
if (kgManager) {
|
|
135
|
+
try {
|
|
136
|
+
const kg = await kgManager.loadKnowledgeGraph();
|
|
137
|
+
if (kg && kg.intents) {
|
|
138
|
+
// Extract technologies and patterns from intent goals
|
|
139
|
+
kg.intents.forEach((intent) => {
|
|
140
|
+
if (intent.parsedGoals) {
|
|
141
|
+
intent.parsedGoals.forEach((goal) => {
|
|
142
|
+
// Simple heuristic to extract tech/pattern mentions
|
|
143
|
+
const lowerGoal = goal.toLowerCase();
|
|
144
|
+
if (lowerGoal.includes('technology') || lowerGoal.includes('framework')) {
|
|
145
|
+
// Could extract specific technologies here
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Knowledge graph not available
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const contextData = {
|
|
157
|
+
summary: {
|
|
158
|
+
totalAdrs: discoveryResult.totalAdrs,
|
|
159
|
+
activeDecisions: statusCounts.accepted,
|
|
160
|
+
deprecatedDecisions: statusCounts.deprecated,
|
|
161
|
+
proposedDecisions: statusCounts.proposed,
|
|
162
|
+
technologiesUsed: [...technologies].sort(),
|
|
163
|
+
architecturalPatterns: [...patterns].sort(),
|
|
164
|
+
},
|
|
165
|
+
decisions,
|
|
166
|
+
technologyStack,
|
|
167
|
+
patterns: patternsList,
|
|
168
|
+
recommendations,
|
|
169
|
+
timestamp: new Date().toISOString(),
|
|
170
|
+
projectPath,
|
|
171
|
+
};
|
|
172
|
+
const result = {
|
|
173
|
+
data: contextData,
|
|
174
|
+
contentType: 'application/json',
|
|
175
|
+
lastModified: new Date().toISOString(),
|
|
176
|
+
cacheKey,
|
|
177
|
+
ttl: 300, // 5 minutes cache
|
|
178
|
+
etag: generateETag(contextData),
|
|
179
|
+
};
|
|
180
|
+
// Cache result
|
|
181
|
+
resourceCache.set(cacheKey, result, result.ttl);
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
throw new McpAdrError(`Failed to generate architectural context: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_GENERATION_ERROR');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Extract technologies from content
|
|
190
|
+
*/
|
|
191
|
+
function extractTechnologies(content, technologies) {
|
|
192
|
+
const techPatterns = [
|
|
193
|
+
/\b(React|Vue|Angular|Svelte|Next\.js|Nuxt|Gatsby)\b/gi,
|
|
194
|
+
/\b(Node\.js|Express|Fastify|NestJS|Koa)\b/gi,
|
|
195
|
+
/\b(Python|Django|Flask|FastAPI)\b/gi,
|
|
196
|
+
/\b(PostgreSQL|MySQL|MongoDB|Redis|Elasticsearch)\b/gi,
|
|
197
|
+
/\b(Docker|Kubernetes|AWS|Azure|GCP)\b/gi,
|
|
198
|
+
/\b(Terraform|Ansible|Jenkins|GitHub Actions)\b/gi,
|
|
199
|
+
/\b(GraphQL|REST|gRPC|WebSocket)\b/gi,
|
|
200
|
+
/\b(TypeScript|JavaScript|Java|Go|Rust)\b/gi,
|
|
201
|
+
];
|
|
202
|
+
techPatterns.forEach(pattern => {
|
|
203
|
+
const matches = content.match(pattern);
|
|
204
|
+
if (matches) {
|
|
205
|
+
matches.forEach(match => technologies.add(match));
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Extract architectural patterns from content
|
|
211
|
+
*/
|
|
212
|
+
function extractPatterns(content, patterns) {
|
|
213
|
+
const patternKeywords = [
|
|
214
|
+
'microservices',
|
|
215
|
+
'monolith',
|
|
216
|
+
'event-driven',
|
|
217
|
+
'cqrs',
|
|
218
|
+
'event sourcing',
|
|
219
|
+
'hexagonal',
|
|
220
|
+
'clean architecture',
|
|
221
|
+
'mvc',
|
|
222
|
+
'mvvm',
|
|
223
|
+
'repository pattern',
|
|
224
|
+
'service layer',
|
|
225
|
+
'domain-driven',
|
|
226
|
+
'api gateway',
|
|
227
|
+
'saga pattern',
|
|
228
|
+
'circuit breaker',
|
|
229
|
+
];
|
|
230
|
+
const lowerContent = content.toLowerCase();
|
|
231
|
+
patternKeywords.forEach(pattern => {
|
|
232
|
+
if (lowerContent.includes(pattern)) {
|
|
233
|
+
patterns.add(pattern
|
|
234
|
+
.split(' ')
|
|
235
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
236
|
+
.join(' '));
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Categorize an ADR based on its title and content
|
|
242
|
+
*/
|
|
243
|
+
function categorizeAdr(title, content) {
|
|
244
|
+
const lowerTitle = title.toLowerCase();
|
|
245
|
+
const lowerContent = content.toLowerCase();
|
|
246
|
+
if (lowerTitle.includes('database') || lowerContent.includes('database'))
|
|
247
|
+
return 'data';
|
|
248
|
+
if (lowerTitle.includes('api') || lowerContent.includes('api endpoint'))
|
|
249
|
+
return 'api';
|
|
250
|
+
if (lowerTitle.includes('auth') || lowerContent.includes('authentication'))
|
|
251
|
+
return 'security';
|
|
252
|
+
if (lowerTitle.includes('deploy') || lowerContent.includes('deployment'))
|
|
253
|
+
return 'infrastructure';
|
|
254
|
+
if (lowerTitle.includes('test') || lowerContent.includes('testing'))
|
|
255
|
+
return 'testing';
|
|
256
|
+
if (lowerTitle.includes('ui') || lowerTitle.includes('frontend'))
|
|
257
|
+
return 'frontend';
|
|
258
|
+
if (lowerTitle.includes('backend') || lowerTitle.includes('service'))
|
|
259
|
+
return 'backend';
|
|
260
|
+
return 'general';
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Determine impact level of an ADR
|
|
264
|
+
*/
|
|
265
|
+
function determineImpact(content) {
|
|
266
|
+
const lowerContent = content.toLowerCase();
|
|
267
|
+
// High impact indicators
|
|
268
|
+
if (lowerContent.includes('critical') ||
|
|
269
|
+
lowerContent.includes('breaking change') ||
|
|
270
|
+
lowerContent.includes('major refactor') ||
|
|
271
|
+
lowerContent.includes('security vulnerability')) {
|
|
272
|
+
return 'high';
|
|
273
|
+
}
|
|
274
|
+
// Low impact indicators
|
|
275
|
+
if (lowerContent.includes('minor') ||
|
|
276
|
+
lowerContent.includes('small change') ||
|
|
277
|
+
lowerContent.includes('optimization')) {
|
|
278
|
+
return 'low';
|
|
279
|
+
}
|
|
280
|
+
return 'medium';
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Extract dependencies from content
|
|
284
|
+
*/
|
|
285
|
+
function extractDependencies(content) {
|
|
286
|
+
const deps = [];
|
|
287
|
+
const depMatch = content.match(/ADR[-\s]?(\d+)/gi);
|
|
288
|
+
if (depMatch) {
|
|
289
|
+
depMatch.forEach(match => {
|
|
290
|
+
const id = match.replace(/ADR[-\s]?/i, '');
|
|
291
|
+
deps.push(`adr-${id.padStart(3, '0')}`);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
return [...new Set(deps)];
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Categorize technologies into stack layers
|
|
298
|
+
*/
|
|
299
|
+
function categorizeTechnologies(techs) {
|
|
300
|
+
const stack = {
|
|
301
|
+
frontend: [],
|
|
302
|
+
backend: [],
|
|
303
|
+
database: [],
|
|
304
|
+
infrastructure: [],
|
|
305
|
+
devops: [],
|
|
306
|
+
};
|
|
307
|
+
const categories = {
|
|
308
|
+
React: 'frontend',
|
|
309
|
+
Vue: 'frontend',
|
|
310
|
+
Angular: 'frontend',
|
|
311
|
+
Svelte: 'frontend',
|
|
312
|
+
'Next.js': 'frontend',
|
|
313
|
+
Nuxt: 'frontend',
|
|
314
|
+
TypeScript: 'frontend',
|
|
315
|
+
JavaScript: 'frontend',
|
|
316
|
+
'Node.js': 'backend',
|
|
317
|
+
Express: 'backend',
|
|
318
|
+
Fastify: 'backend',
|
|
319
|
+
NestJS: 'backend',
|
|
320
|
+
Python: 'backend',
|
|
321
|
+
Django: 'backend',
|
|
322
|
+
Flask: 'backend',
|
|
323
|
+
FastAPI: 'backend',
|
|
324
|
+
Java: 'backend',
|
|
325
|
+
Go: 'backend',
|
|
326
|
+
Rust: 'backend',
|
|
327
|
+
PostgreSQL: 'database',
|
|
328
|
+
MySQL: 'database',
|
|
329
|
+
MongoDB: 'database',
|
|
330
|
+
Redis: 'database',
|
|
331
|
+
Elasticsearch: 'database',
|
|
332
|
+
Docker: 'infrastructure',
|
|
333
|
+
Kubernetes: 'infrastructure',
|
|
334
|
+
AWS: 'infrastructure',
|
|
335
|
+
Azure: 'infrastructure',
|
|
336
|
+
GCP: 'infrastructure',
|
|
337
|
+
Terraform: 'devops',
|
|
338
|
+
Ansible: 'devops',
|
|
339
|
+
Jenkins: 'devops',
|
|
340
|
+
'GitHub Actions': 'devops',
|
|
341
|
+
};
|
|
342
|
+
techs.forEach(tech => {
|
|
343
|
+
const category = categories[tech];
|
|
344
|
+
if (category && !stack[category].includes(tech)) {
|
|
345
|
+
stack[category].push(tech);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
return stack;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get description for a pattern
|
|
352
|
+
*/
|
|
353
|
+
function getPatternDescription(pattern) {
|
|
354
|
+
const descriptions = {
|
|
355
|
+
Microservices: 'Distributed architecture with independently deployable services',
|
|
356
|
+
Monolith: 'Single deployable unit containing all functionality',
|
|
357
|
+
'Event-driven': 'Asynchronous communication through events',
|
|
358
|
+
CQRS: 'Command Query Responsibility Segregation',
|
|
359
|
+
'Event Sourcing': 'Storing state as sequence of events',
|
|
360
|
+
Hexagonal: 'Ports and adapters architecture',
|
|
361
|
+
'Clean Architecture': 'Dependency rule with concentric layers',
|
|
362
|
+
MVC: 'Model-View-Controller pattern',
|
|
363
|
+
MVVM: 'Model-View-ViewModel pattern',
|
|
364
|
+
'Repository Pattern': 'Abstraction layer for data access',
|
|
365
|
+
'Service Layer': 'Business logic encapsulation',
|
|
366
|
+
'Domain-driven': 'Design based on domain model',
|
|
367
|
+
'Api Gateway': 'Single entry point for microservices',
|
|
368
|
+
'Saga Pattern': 'Distributed transaction management',
|
|
369
|
+
'Circuit Breaker': 'Fault tolerance pattern',
|
|
370
|
+
};
|
|
371
|
+
return descriptions[pattern] || 'Architectural pattern';
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Find ADRs that use a pattern
|
|
375
|
+
*/
|
|
376
|
+
function findPatternUsage(pattern, adrs) {
|
|
377
|
+
const lowerPattern = pattern.toLowerCase();
|
|
378
|
+
return adrs
|
|
379
|
+
.filter(adr => {
|
|
380
|
+
const content = `${adr.title || ''} ${adr.context || ''} ${adr.decision || ''}`.toLowerCase();
|
|
381
|
+
return content.includes(lowerPattern);
|
|
382
|
+
})
|
|
383
|
+
.map(adr => adr.filename.replace(/\.md$/, ''))
|
|
384
|
+
.slice(0, 5);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Find ADRs related to a pattern
|
|
388
|
+
*/
|
|
389
|
+
function findRelatedAdrs(pattern, adrs) {
|
|
390
|
+
return findPatternUsage(pattern, adrs);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Generate recommendations based on analysis
|
|
394
|
+
*/
|
|
395
|
+
function generateRecommendations(adrs, statusCounts, technologies) {
|
|
396
|
+
const recommendations = [];
|
|
397
|
+
// Check for proposed ADRs that need review
|
|
398
|
+
const proposedCount = statusCounts['proposed'] || 0;
|
|
399
|
+
if (proposedCount > 3) {
|
|
400
|
+
recommendations.push(`Review ${proposedCount} proposed ADRs for acceptance`);
|
|
401
|
+
}
|
|
402
|
+
// Check for missing documentation areas
|
|
403
|
+
const hasSecurityAdr = adrs.some(adr => (adr.title || '').toLowerCase().includes('security') ||
|
|
404
|
+
(adr.title || '').toLowerCase().includes('auth'));
|
|
405
|
+
if (!hasSecurityAdr) {
|
|
406
|
+
recommendations.push('Consider documenting security decisions in an ADR');
|
|
407
|
+
}
|
|
408
|
+
// Check for deprecated decisions
|
|
409
|
+
const deprecatedCount = statusCounts['deprecated'] || 0;
|
|
410
|
+
if (deprecatedCount > 0) {
|
|
411
|
+
recommendations.push(`Review ${deprecatedCount} deprecated ADRs for removal or updates`);
|
|
412
|
+
}
|
|
413
|
+
// Technology recommendations
|
|
414
|
+
if (technologies.length < 5) {
|
|
415
|
+
recommendations.push('Consider documenting technology choices in ADRs');
|
|
416
|
+
}
|
|
417
|
+
// General recommendation
|
|
418
|
+
if (adrs.length < 3) {
|
|
419
|
+
recommendations.push('Consider creating ADRs for key architectural decisions');
|
|
420
|
+
}
|
|
421
|
+
if (recommendations.length === 0) {
|
|
422
|
+
recommendations.push('Architectural documentation appears up-to-date');
|
|
423
|
+
}
|
|
424
|
+
return recommendations;
|
|
425
|
+
}
|
|
426
|
+
// Register route
|
|
427
|
+
resourceRouter.register('/architecture/context', generateArchitecturalContextResource, 'Current architectural state and decisions');
|
|
428
|
+
//# sourceMappingURL=architectural-context-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architectural-context-resource.js","sourceRoot":"","sources":["../../../src/resources/architectural-context-resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Snapshot Resource - Current conversation context
|
|
3
|
+
* URI Pattern: adr://conversation/snapshot
|
|
4
|
+
*/
|
|
5
|
+
import { URLSearchParams } from 'url';
|
|
6
|
+
import { ResourceGenerationResult } from './index.js';
|
|
7
|
+
import type { ConversationMemoryManager } from '../utils/conversation-memory-manager.js';
|
|
8
|
+
import type { ConversationContextSnapshot } from '../types/conversation-memory.js';
|
|
9
|
+
export interface ConversationSnapshotData {
|
|
10
|
+
snapshot: ConversationContextSnapshot | null;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
recentTurnCount: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate conversation snapshot resource showing current session context.
|
|
16
|
+
*
|
|
17
|
+
* Returns a snapshot of the active conversation session including:
|
|
18
|
+
* - Recent conversation turns
|
|
19
|
+
* - Active knowledge graph intents
|
|
20
|
+
* - Recorded architectural decisions
|
|
21
|
+
* - Current conversation focus and next steps
|
|
22
|
+
*
|
|
23
|
+
* **URI Pattern:** `adr://conversation/snapshot`
|
|
24
|
+
*
|
|
25
|
+
* **Query Parameters:**
|
|
26
|
+
* - `recentTurnCount`: Number of recent turns to include (default: 5)
|
|
27
|
+
*
|
|
28
|
+
* @param params - URL path parameters (none for this resource)
|
|
29
|
+
* @param searchParams - URL query parameters for customization
|
|
30
|
+
* @param memoryManager - ConversationMemoryManager instance (injected by MCP server)
|
|
31
|
+
*
|
|
32
|
+
* @returns Promise resolving to resource generation result containing:
|
|
33
|
+
* - data: Conversation snapshot with session context (null if no active session)
|
|
34
|
+
* - contentType: "application/json"
|
|
35
|
+
* - lastModified: ISO timestamp of generation
|
|
36
|
+
* - cacheKey: Unique identifier "conversation-snapshot"
|
|
37
|
+
* - ttl: Cache duration (10 seconds)
|
|
38
|
+
* - etag: Entity tag for cache validation
|
|
39
|
+
*
|
|
40
|
+
* @throws {McpAdrError} When:
|
|
41
|
+
* - RESOURCE_GENERATION_ERROR: Memory manager not provided or snapshot retrieval fails
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* // Get conversation snapshot with default settings
|
|
46
|
+
* const snapshot = await generateConversationSnapshotResource(
|
|
47
|
+
* {},
|
|
48
|
+
* new URLSearchParams(),
|
|
49
|
+
* memoryManager
|
|
50
|
+
* );
|
|
51
|
+
*
|
|
52
|
+
* if (snapshot.data.snapshot) {
|
|
53
|
+
* console.log(`Session: ${snapshot.data.snapshot.sessionId}`);
|
|
54
|
+
* console.log(`Recent turns: ${snapshot.data.snapshot.recentTurns.length}`);
|
|
55
|
+
* console.log(`Active intents: ${snapshot.data.snapshot.activeIntents.length}`);
|
|
56
|
+
* }
|
|
57
|
+
*
|
|
58
|
+
* // Get snapshot with more recent turns
|
|
59
|
+
* const detailed = await generateConversationSnapshotResource(
|
|
60
|
+
* {},
|
|
61
|
+
* new URLSearchParams('recentTurnCount=10'),
|
|
62
|
+
* memoryManager
|
|
63
|
+
* );
|
|
64
|
+
*
|
|
65
|
+
* // Expected output structure:
|
|
66
|
+
* {
|
|
67
|
+
* data: {
|
|
68
|
+
* snapshot: {
|
|
69
|
+
* sessionId: "session-123",
|
|
70
|
+
* recentTurns: [...],
|
|
71
|
+
* activeIntents: [...],
|
|
72
|
+
* decisionsRecorded: [...],
|
|
73
|
+
* conversationFocus: {
|
|
74
|
+
* topic: "Database architecture",
|
|
75
|
+
* phase: "Decision making",
|
|
76
|
+
* nextSteps: ["Review options", "Make decision"]
|
|
77
|
+
* }
|
|
78
|
+
* },
|
|
79
|
+
* timestamp: "2025-12-16T04:30:00.000Z",
|
|
80
|
+
* recentTurnCount: 5
|
|
81
|
+
* },
|
|
82
|
+
* contentType: "application/json",
|
|
83
|
+
* cacheKey: "conversation-snapshot",
|
|
84
|
+
* ttl: 10
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* @since v2.2.0
|
|
89
|
+
* @see {@link ConversationMemoryManager.getContextSnapshot} for snapshot generation logic
|
|
90
|
+
*/
|
|
91
|
+
export declare function generateConversationSnapshotResource(_params: Record<string, string>, searchParams: URLSearchParams, memoryManager?: ConversationMemoryManager): Promise<ResourceGenerationResult>;
|
|
92
|
+
//# sourceMappingURL=conversation-snapshot-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-snapshot-resource.d.ts","sourceRoot":"","sources":["../../../src/resources/conversation-snapshot-resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AACH,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,YAAY,EAAE,eAAe,EAC7B,aAAa,CAAC,EAAE,yBAAyB,GACxC,OAAO,CAAC,wBAAwB,CAAC,CA+CnC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Snapshot Resource - Current conversation context
|
|
3
|
+
* URI Pattern: adr://conversation/snapshot
|
|
4
|
+
*/
|
|
5
|
+
import { McpAdrError } from '../types/index.js';
|
|
6
|
+
import { resourceCache, generateETag } from './resource-cache.js';
|
|
7
|
+
import { resourceRouter } from './resource-router.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate conversation snapshot resource showing current session context.
|
|
10
|
+
*
|
|
11
|
+
* Returns a snapshot of the active conversation session including:
|
|
12
|
+
* - Recent conversation turns
|
|
13
|
+
* - Active knowledge graph intents
|
|
14
|
+
* - Recorded architectural decisions
|
|
15
|
+
* - Current conversation focus and next steps
|
|
16
|
+
*
|
|
17
|
+
* **URI Pattern:** `adr://conversation/snapshot`
|
|
18
|
+
*
|
|
19
|
+
* **Query Parameters:**
|
|
20
|
+
* - `recentTurnCount`: Number of recent turns to include (default: 5)
|
|
21
|
+
*
|
|
22
|
+
* @param params - URL path parameters (none for this resource)
|
|
23
|
+
* @param searchParams - URL query parameters for customization
|
|
24
|
+
* @param memoryManager - ConversationMemoryManager instance (injected by MCP server)
|
|
25
|
+
*
|
|
26
|
+
* @returns Promise resolving to resource generation result containing:
|
|
27
|
+
* - data: Conversation snapshot with session context (null if no active session)
|
|
28
|
+
* - contentType: "application/json"
|
|
29
|
+
* - lastModified: ISO timestamp of generation
|
|
30
|
+
* - cacheKey: Unique identifier "conversation-snapshot"
|
|
31
|
+
* - ttl: Cache duration (10 seconds)
|
|
32
|
+
* - etag: Entity tag for cache validation
|
|
33
|
+
*
|
|
34
|
+
* @throws {McpAdrError} When:
|
|
35
|
+
* - RESOURCE_GENERATION_ERROR: Memory manager not provided or snapshot retrieval fails
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // Get conversation snapshot with default settings
|
|
40
|
+
* const snapshot = await generateConversationSnapshotResource(
|
|
41
|
+
* {},
|
|
42
|
+
* new URLSearchParams(),
|
|
43
|
+
* memoryManager
|
|
44
|
+
* );
|
|
45
|
+
*
|
|
46
|
+
* if (snapshot.data.snapshot) {
|
|
47
|
+
* console.log(`Session: ${snapshot.data.snapshot.sessionId}`);
|
|
48
|
+
* console.log(`Recent turns: ${snapshot.data.snapshot.recentTurns.length}`);
|
|
49
|
+
* console.log(`Active intents: ${snapshot.data.snapshot.activeIntents.length}`);
|
|
50
|
+
* }
|
|
51
|
+
*
|
|
52
|
+
* // Get snapshot with more recent turns
|
|
53
|
+
* const detailed = await generateConversationSnapshotResource(
|
|
54
|
+
* {},
|
|
55
|
+
* new URLSearchParams('recentTurnCount=10'),
|
|
56
|
+
* memoryManager
|
|
57
|
+
* );
|
|
58
|
+
*
|
|
59
|
+
* // Expected output structure:
|
|
60
|
+
* {
|
|
61
|
+
* data: {
|
|
62
|
+
* snapshot: {
|
|
63
|
+
* sessionId: "session-123",
|
|
64
|
+
* recentTurns: [...],
|
|
65
|
+
* activeIntents: [...],
|
|
66
|
+
* decisionsRecorded: [...],
|
|
67
|
+
* conversationFocus: {
|
|
68
|
+
* topic: "Database architecture",
|
|
69
|
+
* phase: "Decision making",
|
|
70
|
+
* nextSteps: ["Review options", "Make decision"]
|
|
71
|
+
* }
|
|
72
|
+
* },
|
|
73
|
+
* timestamp: "2025-12-16T04:30:00.000Z",
|
|
74
|
+
* recentTurnCount: 5
|
|
75
|
+
* },
|
|
76
|
+
* contentType: "application/json",
|
|
77
|
+
* cacheKey: "conversation-snapshot",
|
|
78
|
+
* ttl: 10
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @since v2.2.0
|
|
83
|
+
* @see {@link ConversationMemoryManager.getContextSnapshot} for snapshot generation logic
|
|
84
|
+
*/
|
|
85
|
+
export async function generateConversationSnapshotResource(_params, searchParams, memoryManager) {
|
|
86
|
+
const cacheKey = 'conversation-snapshot';
|
|
87
|
+
// Check cache
|
|
88
|
+
const cached = await resourceCache.get(cacheKey);
|
|
89
|
+
if (cached) {
|
|
90
|
+
return cached;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
if (!memoryManager) {
|
|
94
|
+
throw new McpAdrError('Conversation snapshot requires initialized memory manager. Access this resource through the MCP server.', 'RESOURCE_GENERATION_ERROR');
|
|
95
|
+
}
|
|
96
|
+
const recentTurnCount = parseInt(searchParams.get('recentTurnCount') || '5', 10);
|
|
97
|
+
// Get snapshot from memory manager
|
|
98
|
+
const snapshot = await memoryManager.getContextSnapshot(recentTurnCount);
|
|
99
|
+
const snapshotData = {
|
|
100
|
+
snapshot,
|
|
101
|
+
timestamp: new Date().toISOString(),
|
|
102
|
+
recentTurnCount,
|
|
103
|
+
};
|
|
104
|
+
const result = {
|
|
105
|
+
data: snapshotData,
|
|
106
|
+
contentType: 'application/json',
|
|
107
|
+
lastModified: new Date().toISOString(),
|
|
108
|
+
cacheKey,
|
|
109
|
+
ttl: 10, // 10 seconds cache (conversation context changes very frequently)
|
|
110
|
+
etag: generateETag(snapshotData),
|
|
111
|
+
};
|
|
112
|
+
// Cache result
|
|
113
|
+
resourceCache.set(cacheKey, result, result.ttl);
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new McpAdrError(`Failed to generate conversation snapshot: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_GENERATION_ERROR');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Register route
|
|
121
|
+
resourceRouter.register('/conversation/snapshot', generateConversationSnapshotResource, 'Current conversation context snapshot');
|
|
122
|
+
//# sourceMappingURL=conversation-snapshot-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-snapshot-resource.js","sourceRoot":"","sources":["../../../src/resources/conversation-snapshot-resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAUtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AACH,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,OAA+B,EAC/B,YAA6B,EAC7B,aAAyC;IAEzC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;IAEzC,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAA2B,QAAQ,CAAC,CAAC;IAC3E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CACnB,yGAAyG,EACzG,2BAA2B,CAC5B,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAEjF,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAEzE,MAAM,YAAY,GAA6B;YAC7C,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,eAAe;SAChB,CAAC;QAEF,MAAM,MAAM,GAA6B;YACvC,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,QAAQ;YACR,GAAG,EAAE,EAAE,EAAE,kEAAkE;YAC3E,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC;SACjC,CAAC;QAEF,eAAe;QACf,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrG,2BAA2B,CAC5B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,cAAc,CAAC,QAAQ,CACrB,wBAAwB,EACxB,oCAAoC,EACpC,uCAAuC,CACxC,CAAC"}
|