mcp-adr-analysis-server 2.1.20 → 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.
Files changed (226) hide show
  1. package/README.md +1 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/config/ai-config.d.ts +54 -6
  4. package/dist/src/config/ai-config.d.ts.map +1 -1
  5. package/dist/src/config/ai-config.js +69 -6
  6. package/dist/src/config/ai-config.js.map +1 -1
  7. package/dist/src/config/ape-descriptions.d.ts +77 -0
  8. package/dist/src/config/ape-descriptions.d.ts.map +1 -0
  9. package/dist/src/config/ape-descriptions.js +177 -0
  10. package/dist/src/config/ape-descriptions.js.map +1 -0
  11. package/dist/src/index.d.ts +40 -0
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +564 -8
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/prompts/adr-suggestion-prompts.d.ts +5 -0
  16. package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
  17. package/dist/src/prompts/adr-suggestion-prompts.js +22 -1
  18. package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
  19. package/dist/src/prompts/prompt-catalog.d.ts +95 -0
  20. package/dist/src/prompts/prompt-catalog.d.ts.map +1 -0
  21. package/dist/src/prompts/prompt-catalog.js +300 -0
  22. package/dist/src/prompts/prompt-catalog.js.map +1 -0
  23. package/dist/src/resources/adrs-discovered-resource.d.ts +124 -0
  24. package/dist/src/resources/adrs-discovered-resource.d.ts.map +1 -0
  25. package/dist/src/resources/adrs-discovered-resource.js +174 -0
  26. package/dist/src/resources/adrs-discovered-resource.js.map +1 -0
  27. package/dist/src/resources/adrs-review-resource.d.ts +82 -0
  28. package/dist/src/resources/adrs-review-resource.d.ts.map +1 -0
  29. package/dist/src/resources/adrs-review-resource.js +160 -0
  30. package/dist/src/resources/adrs-review-resource.js.map +1 -0
  31. package/dist/src/resources/architectural-context-resource.d.ts +95 -0
  32. package/dist/src/resources/architectural-context-resource.d.ts.map +1 -0
  33. package/dist/src/resources/architectural-context-resource.js +428 -0
  34. package/dist/src/resources/architectural-context-resource.js.map +1 -0
  35. package/dist/src/resources/conversation-snapshot-resource.d.ts +92 -0
  36. package/dist/src/resources/conversation-snapshot-resource.d.ts.map +1 -0
  37. package/dist/src/resources/conversation-snapshot-resource.js +122 -0
  38. package/dist/src/resources/conversation-snapshot-resource.js.map +1 -0
  39. package/dist/src/resources/deployment-status-resource.js +1 -1
  40. package/dist/src/resources/deployment-status-resource.js.map +1 -1
  41. package/dist/src/resources/environment-analysis-resource.js +1 -1
  42. package/dist/src/resources/environment-analysis-resource.js.map +1 -1
  43. package/dist/src/resources/knowledge-graph-resource.d.ts +129 -0
  44. package/dist/src/resources/knowledge-graph-resource.d.ts.map +1 -0
  45. package/dist/src/resources/knowledge-graph-resource.js +217 -0
  46. package/dist/src/resources/knowledge-graph-resource.js.map +1 -0
  47. package/dist/src/resources/memory-expand-resource.d.ts +90 -0
  48. package/dist/src/resources/memory-expand-resource.d.ts.map +1 -0
  49. package/dist/src/resources/memory-expand-resource.js +176 -0
  50. package/dist/src/resources/memory-expand-resource.js.map +1 -0
  51. package/dist/src/resources/memory-stats-resource.d.ts +77 -0
  52. package/dist/src/resources/memory-stats-resource.d.ts.map +1 -0
  53. package/dist/src/resources/memory-stats-resource.js +108 -0
  54. package/dist/src/resources/memory-stats-resource.js.map +1 -0
  55. package/dist/src/resources/project-metrics-resource.js +1 -1
  56. package/dist/src/resources/project-metrics-resource.js.map +1 -1
  57. package/dist/src/resources/resource-cache.d.ts.map +1 -1
  58. package/dist/src/resources/resource-cache.js +2 -1
  59. package/dist/src/resources/resource-cache.js.map +1 -1
  60. package/dist/src/resources/server-context-resource.d.ts +69 -0
  61. package/dist/src/resources/server-context-resource.d.ts.map +1 -0
  62. package/dist/src/resources/server-context-resource.js +104 -0
  63. package/dist/src/resources/server-context-resource.js.map +1 -0
  64. package/dist/src/resources/tool-catalog-resource.d.ts +122 -0
  65. package/dist/src/resources/tool-catalog-resource.d.ts.map +1 -0
  66. package/dist/src/resources/tool-catalog-resource.js +167 -0
  67. package/dist/src/resources/tool-catalog-resource.js.map +1 -0
  68. package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
  69. package/dist/src/tools/adr-bootstrap-validation-tool.js +7 -6
  70. package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
  71. package/dist/src/tools/adr-suggestion-tool.d.ts +5 -0
  72. package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
  73. package/dist/src/tools/adr-suggestion-tool.js +40 -71
  74. package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
  75. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +23 -1
  76. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
  77. package/dist/src/tools/bootstrap-validation-loop-tool.js +15 -5
  78. package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
  79. package/dist/src/tools/ce-mcp-tools.d.ts +291 -0
  80. package/dist/src/tools/ce-mcp-tools.d.ts.map +1 -0
  81. package/dist/src/tools/ce-mcp-tools.js +1188 -0
  82. package/dist/src/tools/ce-mcp-tools.js.map +1 -0
  83. package/dist/src/tools/content-masking-tool.d.ts +11 -0
  84. package/dist/src/tools/content-masking-tool.d.ts.map +1 -1
  85. package/dist/src/tools/content-masking-tool.js +13 -6
  86. package/dist/src/tools/content-masking-tool.js.map +1 -1
  87. package/dist/src/tools/deployment-readiness-tool.d.ts +11 -0
  88. package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
  89. package/dist/src/tools/deployment-readiness-tool.js +10 -4
  90. package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
  91. package/dist/src/tools/environment-analysis-tool.d.ts +96 -1
  92. package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
  93. package/dist/src/tools/environment-analysis-tool.js +38 -46
  94. package/dist/src/tools/environment-analysis-tool.js.map +1 -1
  95. package/dist/src/tools/research-question-tool.d.ts.map +1 -1
  96. package/dist/src/tools/research-question-tool.js +3 -2
  97. package/dist/src/tools/research-question-tool.js.map +1 -1
  98. package/dist/src/tools/review-existing-adrs-tool.d.ts +5 -0
  99. package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
  100. package/dist/src/tools/review-existing-adrs-tool.js +123 -42
  101. package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
  102. package/dist/src/tools/rule-generation-tool.d.ts.map +1 -1
  103. package/dist/src/tools/rule-generation-tool.js +3 -5
  104. package/dist/src/tools/rule-generation-tool.js.map +1 -1
  105. package/dist/src/tools/search-codebase-tool.d.ts +148 -0
  106. package/dist/src/tools/search-codebase-tool.d.ts.map +1 -0
  107. package/dist/src/tools/search-codebase-tool.js +406 -0
  108. package/dist/src/tools/search-codebase-tool.js.map +1 -0
  109. package/dist/src/tools/smart-git-push-tool-v2.js +1 -1
  110. package/dist/src/tools/smart-git-push-tool-v2.js.map +1 -1
  111. package/dist/src/tools/tool-catalog.d.ts +134 -0
  112. package/dist/src/tools/tool-catalog.d.ts.map +1 -0
  113. package/dist/src/tools/tool-catalog.js +1431 -0
  114. package/dist/src/tools/tool-catalog.js.map +1 -0
  115. package/dist/src/tools/tool-chain-orchestrator.d.ts +11 -2
  116. package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
  117. package/dist/src/tools/tool-chain-orchestrator.js +11 -2
  118. package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
  119. package/dist/src/tools/tool-dispatcher.d.ts +98 -0
  120. package/dist/src/tools/tool-dispatcher.d.ts.map +1 -0
  121. package/dist/src/tools/tool-dispatcher.js +225 -0
  122. package/dist/src/tools/tool-dispatcher.js.map +1 -0
  123. package/dist/src/tools/tree-sitter-code-tools.d.ts +184 -0
  124. package/dist/src/tools/tree-sitter-code-tools.d.ts.map +1 -0
  125. package/dist/src/tools/tree-sitter-code-tools.js +642 -0
  126. package/dist/src/tools/tree-sitter-code-tools.js.map +1 -0
  127. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +22 -0
  128. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
  129. package/dist/src/tools/troubleshoot-guided-workflow-tool.js +20 -3
  130. package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
  131. package/dist/src/tools/update-knowledge-tool.d.ts +89 -0
  132. package/dist/src/tools/update-knowledge-tool.d.ts.map +1 -0
  133. package/dist/src/tools/update-knowledge-tool.js +222 -0
  134. package/dist/src/tools/update-knowledge-tool.js.map +1 -0
  135. package/dist/src/types/ce-mcp.d.ts +248 -0
  136. package/dist/src/types/ce-mcp.d.ts.map +1 -0
  137. package/dist/src/types/ce-mcp.js +27 -0
  138. package/dist/src/types/ce-mcp.js.map +1 -0
  139. package/dist/src/utils/adr-context-detector.js +1 -1
  140. package/dist/src/utils/adr-context-detector.js.map +1 -1
  141. package/dist/src/utils/adr-planning-task-integration.d.ts +260 -0
  142. package/dist/src/utils/adr-planning-task-integration.d.ts.map +1 -0
  143. package/dist/src/utils/adr-planning-task-integration.js +466 -0
  144. package/dist/src/utils/adr-planning-task-integration.js.map +1 -0
  145. package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -1
  146. package/dist/src/utils/adr-timeline-extractor.js +3 -2
  147. package/dist/src/utils/adr-timeline-extractor.js.map +1 -1
  148. package/dist/src/utils/ai-executor.d.ts +10 -0
  149. package/dist/src/utils/ai-executor.d.ts.map +1 -1
  150. package/dist/src/utils/ai-executor.js +14 -3
  151. package/dist/src/utils/ai-executor.js.map +1 -1
  152. package/dist/src/utils/automatic-prompt-engineering.d.ts +5 -0
  153. package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
  154. package/dist/src/utils/automatic-prompt-engineering.js +10 -90
  155. package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
  156. package/dist/src/utils/bootstrap-task-integration.d.ts +214 -0
  157. package/dist/src/utils/bootstrap-task-integration.d.ts.map +1 -0
  158. package/dist/src/utils/bootstrap-task-integration.js +365 -0
  159. package/dist/src/utils/bootstrap-task-integration.js.map +1 -0
  160. package/dist/src/utils/dag-executor.js +1 -1
  161. package/dist/src/utils/dag-executor.js.map +1 -1
  162. package/dist/src/utils/deployment-task-integration.d.ts +260 -0
  163. package/dist/src/utils/deployment-task-integration.d.ts.map +1 -0
  164. package/dist/src/utils/deployment-task-integration.js +393 -0
  165. package/dist/src/utils/deployment-task-integration.js.map +1 -0
  166. package/dist/src/utils/dynamic-deployment-intelligence.js +1 -1
  167. package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -1
  168. package/dist/src/utils/enhanced-logging.d.ts +3 -0
  169. package/dist/src/utils/enhanced-logging.d.ts.map +1 -1
  170. package/dist/src/utils/enhanced-logging.js +9 -30
  171. package/dist/src/utils/enhanced-logging.js.map +1 -1
  172. package/dist/src/utils/environment-capability-registry.js +1 -1
  173. package/dist/src/utils/environment-capability-registry.js.map +1 -1
  174. package/dist/src/utils/file-system.d.ts.map +1 -1
  175. package/dist/src/utils/file-system.js +33 -3
  176. package/dist/src/utils/file-system.js.map +1 -1
  177. package/dist/src/utils/gitleaks-detector.js +1 -1
  178. package/dist/src/utils/gitleaks-detector.js.map +1 -1
  179. package/dist/src/utils/knowledge-graph-manager.d.ts +13 -0
  180. package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
  181. package/dist/src/utils/knowledge-graph-manager.js +13 -0
  182. package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
  183. package/dist/src/utils/prompt-execution.d.ts +29 -1
  184. package/dist/src/utils/prompt-execution.d.ts.map +1 -1
  185. package/dist/src/utils/prompt-execution.js +29 -1
  186. package/dist/src/utils/prompt-execution.js.map +1 -1
  187. package/dist/src/utils/research-orchestrator.d.ts +87 -1
  188. package/dist/src/utils/research-orchestrator.d.ts.map +1 -1
  189. package/dist/src/utils/research-orchestrator.js +121 -17
  190. package/dist/src/utils/research-orchestrator.js.map +1 -1
  191. package/dist/src/utils/research-task-integration.d.ts +297 -0
  192. package/dist/src/utils/research-task-integration.d.ts.map +1 -0
  193. package/dist/src/utils/research-task-integration.js +449 -0
  194. package/dist/src/utils/research-task-integration.js.map +1 -0
  195. package/dist/src/utils/ripgrep-wrapper.d.ts.map +1 -1
  196. package/dist/src/utils/ripgrep-wrapper.js +17 -3
  197. package/dist/src/utils/ripgrep-wrapper.js.map +1 -1
  198. package/dist/src/utils/sandbox-executor.d.ts +145 -0
  199. package/dist/src/utils/sandbox-executor.d.ts.map +1 -0
  200. package/dist/src/utils/sandbox-executor.js +642 -0
  201. package/dist/src/utils/sandbox-executor.js.map +1 -0
  202. package/dist/src/utils/server-context-generator.d.ts +5 -0
  203. package/dist/src/utils/server-context-generator.d.ts.map +1 -1
  204. package/dist/src/utils/server-context-generator.js +38 -0
  205. package/dist/src/utils/server-context-generator.js.map +1 -1
  206. package/dist/src/utils/task-manager.d.ts +239 -0
  207. package/dist/src/utils/task-manager.d.ts.map +1 -0
  208. package/dist/src/utils/task-manager.js +528 -0
  209. package/dist/src/utils/task-manager.js.map +1 -0
  210. package/dist/src/utils/task-persistence.d.ts +82 -0
  211. package/dist/src/utils/task-persistence.d.ts.map +1 -0
  212. package/dist/src/utils/task-persistence.js +248 -0
  213. package/dist/src/utils/task-persistence.js.map +1 -0
  214. package/dist/src/utils/test-aware-defaults.d.ts +57 -0
  215. package/dist/src/utils/test-aware-defaults.d.ts.map +1 -0
  216. package/dist/src/utils/test-aware-defaults.js +71 -0
  217. package/dist/src/utils/test-aware-defaults.js.map +1 -0
  218. package/dist/src/utils/tree-sitter-analyzer.d.ts +42 -5
  219. package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
  220. package/dist/src/utils/tree-sitter-analyzer.js +499 -17
  221. package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
  222. package/package.json +24 -19
  223. package/dist/src/tools/smart-git-push-tool.d.ts +0 -55
  224. package/dist/src/tools/smart-git-push-tool.d.ts.map +0 -1
  225. package/dist/src/tools/smart-git-push-tool.js +0 -1011
  226. 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"}