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.
- 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.js +1 -1
- 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 +24 -19
- 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,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Manager for MCP Tasks Integration
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified interface for managing MCP Tasks across
|
|
5
|
+
* long-running operations in the mcp-adr-analysis-server.
|
|
6
|
+
*
|
|
7
|
+
* Implements ADR-018: MCP Tasks Integration Strategy
|
|
8
|
+
*
|
|
9
|
+
* @experimental MCP Tasks is an experimental feature in the MCP specification
|
|
10
|
+
*/
|
|
11
|
+
import { randomBytes } from 'node:crypto';
|
|
12
|
+
import { createComponentLogger } from './enhanced-logging.js';
|
|
13
|
+
import { createTaskPersistence, } from './task-persistence.js';
|
|
14
|
+
const logger = createComponentLogger('TaskManager');
|
|
15
|
+
/**
|
|
16
|
+
* Check if a task status represents a terminal state
|
|
17
|
+
*/
|
|
18
|
+
export function isTerminalStatus(status) {
|
|
19
|
+
return status === 'completed' || status === 'failed' || status === 'cancelled';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate a unique task ID
|
|
23
|
+
*/
|
|
24
|
+
function generateTaskId() {
|
|
25
|
+
return randomBytes(16).toString('hex');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Task Manager for coordinating long-running operations
|
|
29
|
+
*
|
|
30
|
+
* Features:
|
|
31
|
+
* - Creates and tracks tasks for tool operations
|
|
32
|
+
* - Updates task progress and status
|
|
33
|
+
* - Supports multi-phase operations with individual phase tracking
|
|
34
|
+
* - Provides cancellation support
|
|
35
|
+
* - File-based persistence for durability across restarts
|
|
36
|
+
* - Designed to work with MCP SDK experimental tasks API
|
|
37
|
+
*/
|
|
38
|
+
export class TaskManager {
|
|
39
|
+
tasks = new Map();
|
|
40
|
+
taskProgress = new Map();
|
|
41
|
+
cleanupTimers = new Map();
|
|
42
|
+
persistence = null;
|
|
43
|
+
initialized = false;
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
const { persistence, enablePersistence = true } = options;
|
|
46
|
+
if (enablePersistence) {
|
|
47
|
+
this.persistence = createTaskPersistence(persistence);
|
|
48
|
+
}
|
|
49
|
+
logger.info('TaskManager initialized', { persistenceEnabled: enablePersistence });
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Initialize the TaskManager - loads persisted tasks
|
|
53
|
+
*/
|
|
54
|
+
async initialize() {
|
|
55
|
+
if (this.initialized) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (this.persistence) {
|
|
59
|
+
await this.persistence.initialize();
|
|
60
|
+
const { tasks, progress } = await this.persistence.load();
|
|
61
|
+
// Restore tasks and progress
|
|
62
|
+
for (const [taskId, task] of tasks) {
|
|
63
|
+
this.tasks.set(taskId, task);
|
|
64
|
+
// Re-establish TTL timers for non-terminal tasks
|
|
65
|
+
if (!isTerminalStatus(task.status) && task.ttl !== null && task.ttl > 0) {
|
|
66
|
+
const elapsed = Date.now() - new Date(task.createdAt).getTime();
|
|
67
|
+
const remainingTtl = Math.max(0, task.ttl - elapsed);
|
|
68
|
+
if (remainingTtl > 0) {
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
this.cleanupTask(taskId);
|
|
71
|
+
}, remainingTtl);
|
|
72
|
+
this.cleanupTimers.set(taskId, timer);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Task expired while server was down
|
|
76
|
+
this.cleanupTask(taskId);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const [taskId, prog] of progress) {
|
|
81
|
+
this.taskProgress.set(taskId, prog);
|
|
82
|
+
}
|
|
83
|
+
logger.info('TaskManager restored from persistence', { taskCount: this.tasks.size });
|
|
84
|
+
}
|
|
85
|
+
this.initialized = true;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Persist current state to disk
|
|
89
|
+
*/
|
|
90
|
+
async persistState() {
|
|
91
|
+
if (this.persistence?.isEnabled()) {
|
|
92
|
+
await this.persistence.save(this.tasks, this.taskProgress);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a new task for a tool operation
|
|
97
|
+
*/
|
|
98
|
+
async createTask(options) {
|
|
99
|
+
const { type, tool, phases, dependencies, projectPath, adrDirectory, ttl = 3600000, // Default 1 hour TTL
|
|
100
|
+
pollInterval = 1000, } = options;
|
|
101
|
+
const now = new Date().toISOString();
|
|
102
|
+
const taskId = generateTaskId();
|
|
103
|
+
// Initialize metadata
|
|
104
|
+
const metadata = {
|
|
105
|
+
type,
|
|
106
|
+
tool,
|
|
107
|
+
};
|
|
108
|
+
// Only add optional properties if they have values
|
|
109
|
+
if (projectPath !== undefined) {
|
|
110
|
+
metadata.projectPath = projectPath;
|
|
111
|
+
}
|
|
112
|
+
if (adrDirectory !== undefined) {
|
|
113
|
+
metadata.adrDirectory = adrDirectory;
|
|
114
|
+
}
|
|
115
|
+
if (dependencies !== undefined && dependencies.length > 0) {
|
|
116
|
+
metadata.dependencies = dependencies;
|
|
117
|
+
}
|
|
118
|
+
// Initialize phases if provided
|
|
119
|
+
if (phases !== undefined && phases.length > 0) {
|
|
120
|
+
metadata.phases = phases.map((name, index) => ({
|
|
121
|
+
name,
|
|
122
|
+
description: `Phase ${index + 1}: ${name}`,
|
|
123
|
+
progress: 0,
|
|
124
|
+
status: 'pending',
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
const task = {
|
|
128
|
+
taskId,
|
|
129
|
+
status: 'working',
|
|
130
|
+
ttl,
|
|
131
|
+
createdAt: now,
|
|
132
|
+
lastUpdatedAt: now,
|
|
133
|
+
pollInterval,
|
|
134
|
+
metadata,
|
|
135
|
+
};
|
|
136
|
+
this.tasks.set(taskId, task);
|
|
137
|
+
this.taskProgress.set(taskId, 0);
|
|
138
|
+
// Set up automatic cleanup if TTL is specified
|
|
139
|
+
if (ttl !== null && ttl > 0) {
|
|
140
|
+
const timer = setTimeout(() => {
|
|
141
|
+
this.cleanupTask(taskId);
|
|
142
|
+
}, ttl);
|
|
143
|
+
this.cleanupTimers.set(taskId, timer);
|
|
144
|
+
}
|
|
145
|
+
logger.info('Task created', {
|
|
146
|
+
taskId,
|
|
147
|
+
type,
|
|
148
|
+
tool,
|
|
149
|
+
phaseCount: phases?.length ?? 0,
|
|
150
|
+
});
|
|
151
|
+
// Persist state
|
|
152
|
+
await this.persistState();
|
|
153
|
+
return task;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get a task by ID
|
|
157
|
+
*/
|
|
158
|
+
async getTask(taskId) {
|
|
159
|
+
const task = this.tasks.get(taskId);
|
|
160
|
+
return task ?? null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get task result
|
|
164
|
+
*/
|
|
165
|
+
async getTaskResult(taskId) {
|
|
166
|
+
const task = this.tasks.get(taskId);
|
|
167
|
+
if (!task)
|
|
168
|
+
return null;
|
|
169
|
+
return task.result ?? null;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* List all tasks
|
|
173
|
+
*/
|
|
174
|
+
async listTasks(cursor) {
|
|
175
|
+
const allTasks = Array.from(this.tasks.values());
|
|
176
|
+
// Simple pagination: cursor is the index to start from
|
|
177
|
+
const startIndex = cursor ? parseInt(cursor, 10) : 0;
|
|
178
|
+
const pageSize = 50;
|
|
179
|
+
const tasks = allTasks.slice(startIndex, startIndex + pageSize);
|
|
180
|
+
// Handle nextCursor properly for exactOptionalPropertyTypes
|
|
181
|
+
if (startIndex + pageSize < allTasks.length) {
|
|
182
|
+
return { tasks, nextCursor: String(startIndex + pageSize) };
|
|
183
|
+
}
|
|
184
|
+
return { tasks };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Update task progress
|
|
188
|
+
*/
|
|
189
|
+
async updateProgress(update) {
|
|
190
|
+
const { taskId, progress, phase, phaseProgress, message } = update;
|
|
191
|
+
const task = this.tasks.get(taskId);
|
|
192
|
+
if (!task) {
|
|
193
|
+
logger.warn('Task not found for progress update', { taskId });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Update overall progress
|
|
197
|
+
this.taskProgress.set(taskId, progress);
|
|
198
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
199
|
+
// Update phase progress if applicable
|
|
200
|
+
if (phase !== undefined && task.metadata?.phases !== undefined) {
|
|
201
|
+
const phases = task.metadata.phases;
|
|
202
|
+
const phaseIndex = phases.findIndex(p => p.name === phase);
|
|
203
|
+
if (phaseIndex >= 0) {
|
|
204
|
+
const currentPhase = phases[phaseIndex];
|
|
205
|
+
if (currentPhase !== undefined) {
|
|
206
|
+
currentPhase.progress = phaseProgress ?? progress;
|
|
207
|
+
if (phaseProgress === 100) {
|
|
208
|
+
currentPhase.status = 'completed';
|
|
209
|
+
currentPhase.endTime = new Date().toISOString();
|
|
210
|
+
// Start next phase if available
|
|
211
|
+
const nextPhase = phases[phaseIndex + 1];
|
|
212
|
+
if (nextPhase !== undefined) {
|
|
213
|
+
nextPhase.status = 'running';
|
|
214
|
+
nextPhase.startTime = new Date().toISOString();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Update status message if provided
|
|
221
|
+
if (message !== undefined) {
|
|
222
|
+
task.statusMessage = message;
|
|
223
|
+
}
|
|
224
|
+
logger.debug('Task progress updated', {
|
|
225
|
+
taskId,
|
|
226
|
+
progress,
|
|
227
|
+
phase,
|
|
228
|
+
phaseProgress,
|
|
229
|
+
});
|
|
230
|
+
// Persist state
|
|
231
|
+
await this.persistState();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Start a phase
|
|
235
|
+
*/
|
|
236
|
+
async startPhase(taskId, phaseName) {
|
|
237
|
+
const task = this.tasks.get(taskId);
|
|
238
|
+
if (!task?.metadata?.phases)
|
|
239
|
+
return;
|
|
240
|
+
const phase = task.metadata.phases.find(p => p.name === phaseName);
|
|
241
|
+
if (phase !== undefined) {
|
|
242
|
+
phase.status = 'running';
|
|
243
|
+
phase.startTime = new Date().toISOString();
|
|
244
|
+
task.statusMessage = `Starting phase: ${phaseName}`;
|
|
245
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
246
|
+
logger.info('Phase started', { taskId, phaseName });
|
|
247
|
+
// Persist state
|
|
248
|
+
await this.persistState();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Complete a phase
|
|
253
|
+
*/
|
|
254
|
+
async completePhase(taskId, phaseName) {
|
|
255
|
+
const task = this.tasks.get(taskId);
|
|
256
|
+
if (!task?.metadata?.phases)
|
|
257
|
+
return;
|
|
258
|
+
const phases = task.metadata.phases;
|
|
259
|
+
const phaseIndex = phases.findIndex(p => p.name === phaseName);
|
|
260
|
+
if (phaseIndex >= 0) {
|
|
261
|
+
const phase = phases[phaseIndex];
|
|
262
|
+
if (phase !== undefined) {
|
|
263
|
+
phase.status = 'completed';
|
|
264
|
+
phase.progress = 100;
|
|
265
|
+
phase.endTime = new Date().toISOString();
|
|
266
|
+
// Calculate overall progress based on completed phases
|
|
267
|
+
const completedCount = phases.filter(p => p.status === 'completed').length;
|
|
268
|
+
const totalProgress = Math.round((completedCount / phases.length) * 100);
|
|
269
|
+
this.taskProgress.set(taskId, totalProgress);
|
|
270
|
+
// Start next phase if available
|
|
271
|
+
const nextPhase = phases[phaseIndex + 1];
|
|
272
|
+
if (nextPhase !== undefined) {
|
|
273
|
+
nextPhase.status = 'running';
|
|
274
|
+
nextPhase.startTime = new Date().toISOString();
|
|
275
|
+
}
|
|
276
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
277
|
+
logger.info('Phase completed', { taskId, phaseName, totalProgress });
|
|
278
|
+
// Persist state
|
|
279
|
+
await this.persistState();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Fail a phase
|
|
285
|
+
*/
|
|
286
|
+
async failPhase(taskId, phaseName, error) {
|
|
287
|
+
const task = this.tasks.get(taskId);
|
|
288
|
+
if (!task?.metadata?.phases)
|
|
289
|
+
return;
|
|
290
|
+
const phase = task.metadata.phases.find(p => p.name === phaseName);
|
|
291
|
+
if (phase !== undefined) {
|
|
292
|
+
phase.status = 'failed';
|
|
293
|
+
phase.error = error;
|
|
294
|
+
phase.endTime = new Date().toISOString();
|
|
295
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
296
|
+
logger.error('Phase failed', undefined, { taskId, phaseName, errorMessage: error });
|
|
297
|
+
// Persist state
|
|
298
|
+
await this.persistState();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Complete a task successfully
|
|
303
|
+
*/
|
|
304
|
+
async completeTask(taskId, result) {
|
|
305
|
+
const task = this.tasks.get(taskId);
|
|
306
|
+
if (!task) {
|
|
307
|
+
throw new Error(`Task ${taskId} not found`);
|
|
308
|
+
}
|
|
309
|
+
task.status = 'completed';
|
|
310
|
+
task.result = result;
|
|
311
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
312
|
+
this.taskProgress.set(taskId, 100);
|
|
313
|
+
// Mark all pending/running phases as completed
|
|
314
|
+
if (task.metadata?.phases) {
|
|
315
|
+
for (const phase of task.metadata.phases) {
|
|
316
|
+
if (phase.status !== 'failed') {
|
|
317
|
+
phase.status = 'completed';
|
|
318
|
+
phase.progress = 100;
|
|
319
|
+
if (!phase.endTime) {
|
|
320
|
+
phase.endTime = new Date().toISOString();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
logger.info('Task completed', { taskId });
|
|
326
|
+
// Persist state
|
|
327
|
+
await this.persistState();
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Fail a task
|
|
331
|
+
*/
|
|
332
|
+
async failTask(taskId, error) {
|
|
333
|
+
const task = this.tasks.get(taskId);
|
|
334
|
+
if (!task) {
|
|
335
|
+
throw new Error(`Task ${taskId} not found`);
|
|
336
|
+
}
|
|
337
|
+
task.status = 'failed';
|
|
338
|
+
task.result = {
|
|
339
|
+
success: false,
|
|
340
|
+
error: {
|
|
341
|
+
code: 'TASK_FAILED',
|
|
342
|
+
message: error,
|
|
343
|
+
recoverable: false,
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
task.statusMessage = error;
|
|
347
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
348
|
+
logger.error('Task failed', undefined, { taskId, errorMessage: error });
|
|
349
|
+
// Persist state
|
|
350
|
+
await this.persistState();
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Cancel a task
|
|
354
|
+
*/
|
|
355
|
+
async cancelTask(taskId, reason) {
|
|
356
|
+
const task = this.tasks.get(taskId);
|
|
357
|
+
if (!task) {
|
|
358
|
+
throw new Error(`Task ${taskId} not found`);
|
|
359
|
+
}
|
|
360
|
+
if (isTerminalStatus(task.status)) {
|
|
361
|
+
throw new Error(`Task ${taskId} is already in terminal state: ${task.status}`);
|
|
362
|
+
}
|
|
363
|
+
task.status = 'cancelled';
|
|
364
|
+
task.statusMessage = reason ?? 'Cancelled by user';
|
|
365
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
366
|
+
// Mark running/pending phases as skipped
|
|
367
|
+
if (task.metadata?.phases) {
|
|
368
|
+
for (const phase of task.metadata.phases) {
|
|
369
|
+
if (phase.status === 'running' || phase.status === 'pending') {
|
|
370
|
+
phase.status = 'skipped';
|
|
371
|
+
phase.endTime = new Date().toISOString();
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
logger.info('Task cancelled', { taskId, reason });
|
|
376
|
+
// Persist state
|
|
377
|
+
await this.persistState();
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Check if a task is still running
|
|
381
|
+
*/
|
|
382
|
+
async isTaskRunning(taskId) {
|
|
383
|
+
const task = this.tasks.get(taskId);
|
|
384
|
+
return task !== undefined && !isTerminalStatus(task.status);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Request input from the user (sets task to input_required state)
|
|
388
|
+
* Used for interactive tools that need user input during execution
|
|
389
|
+
*/
|
|
390
|
+
async requestInput(taskId, prompt) {
|
|
391
|
+
const task = this.tasks.get(taskId);
|
|
392
|
+
if (!task) {
|
|
393
|
+
logger.warn('Task not found for input request', { taskId });
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
task.status = 'input_required';
|
|
397
|
+
task.statusMessage = prompt;
|
|
398
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
399
|
+
logger.info('Task awaiting input', { taskId, prompt });
|
|
400
|
+
// Persist state
|
|
401
|
+
await this.persistState();
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Resume a task after receiving input (sets task back to working state)
|
|
405
|
+
*/
|
|
406
|
+
async resumeTask(taskId) {
|
|
407
|
+
const task = this.tasks.get(taskId);
|
|
408
|
+
if (!task) {
|
|
409
|
+
logger.warn('Task not found for resume', { taskId });
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (task.status !== 'input_required') {
|
|
413
|
+
logger.warn('Task not in input_required state', { taskId, status: task.status });
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
task.status = 'working';
|
|
417
|
+
task.statusMessage = 'Resumed after input';
|
|
418
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
419
|
+
logger.info('Task resumed', { taskId });
|
|
420
|
+
// Persist state
|
|
421
|
+
await this.persistState();
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Get task progress (0-100)
|
|
425
|
+
*/
|
|
426
|
+
getProgress(taskId) {
|
|
427
|
+
return this.taskProgress.get(taskId) ?? 0;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Get task metadata
|
|
431
|
+
*/
|
|
432
|
+
getMetadata(taskId) {
|
|
433
|
+
const task = this.tasks.get(taskId);
|
|
434
|
+
return task?.metadata;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Get all tasks for a specific tool
|
|
438
|
+
*/
|
|
439
|
+
async getTasksByTool(tool) {
|
|
440
|
+
const { tasks } = await this.listTasks();
|
|
441
|
+
return tasks.filter(task => task.metadata?.tool === tool);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Get all tasks of a specific type
|
|
445
|
+
*/
|
|
446
|
+
async getTasksByType(type) {
|
|
447
|
+
const { tasks } = await this.listTasks();
|
|
448
|
+
return tasks.filter(task => task.metadata?.type === type);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Clean up a specific task
|
|
452
|
+
*/
|
|
453
|
+
cleanupTask(taskId) {
|
|
454
|
+
const timer = this.cleanupTimers.get(taskId);
|
|
455
|
+
if (timer) {
|
|
456
|
+
clearTimeout(timer);
|
|
457
|
+
this.cleanupTimers.delete(taskId);
|
|
458
|
+
}
|
|
459
|
+
this.tasks.delete(taskId);
|
|
460
|
+
this.taskProgress.delete(taskId);
|
|
461
|
+
logger.debug('Task cleaned up', { taskId });
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Cleanup completed/failed tasks older than specified duration
|
|
465
|
+
*/
|
|
466
|
+
async cleanup(maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
467
|
+
const now = Date.now();
|
|
468
|
+
let cleanedCount = 0;
|
|
469
|
+
for (const [taskId, task] of this.tasks) {
|
|
470
|
+
if (isTerminalStatus(task.status)) {
|
|
471
|
+
const updatedAt = new Date(task.lastUpdatedAt).getTime();
|
|
472
|
+
if (now - updatedAt > maxAgeMs) {
|
|
473
|
+
this.cleanupTask(taskId);
|
|
474
|
+
cleanedCount++;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
if (cleanedCount > 0) {
|
|
479
|
+
logger.info('Cleaned up old tasks', { count: cleanedCount });
|
|
480
|
+
}
|
|
481
|
+
return cleanedCount;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Cleanup all tasks and timers (for graceful shutdown)
|
|
485
|
+
*/
|
|
486
|
+
async shutdown() {
|
|
487
|
+
// Flush persistence before clearing data
|
|
488
|
+
if (this.persistence?.isEnabled()) {
|
|
489
|
+
await this.persistence.saveImmediate(this.tasks, this.taskProgress);
|
|
490
|
+
await this.persistence.shutdown();
|
|
491
|
+
}
|
|
492
|
+
for (const timer of this.cleanupTimers.values()) {
|
|
493
|
+
clearTimeout(timer);
|
|
494
|
+
}
|
|
495
|
+
this.cleanupTimers.clear();
|
|
496
|
+
this.tasks.clear();
|
|
497
|
+
this.taskProgress.clear();
|
|
498
|
+
this.initialized = false;
|
|
499
|
+
logger.info('TaskManager shut down');
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Singleton instance for global use
|
|
503
|
+
let globalTaskManager = null;
|
|
504
|
+
/**
|
|
505
|
+
* Get the global TaskManager instance
|
|
506
|
+
*/
|
|
507
|
+
export function getTaskManager() {
|
|
508
|
+
if (!globalTaskManager) {
|
|
509
|
+
globalTaskManager = new TaskManager();
|
|
510
|
+
}
|
|
511
|
+
return globalTaskManager;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Set the global TaskManager instance (for testing or custom stores)
|
|
515
|
+
*/
|
|
516
|
+
export function setTaskManager(manager) {
|
|
517
|
+
globalTaskManager = manager;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Reset the global TaskManager (for testing)
|
|
521
|
+
*/
|
|
522
|
+
export async function resetTaskManager() {
|
|
523
|
+
if (globalTaskManager) {
|
|
524
|
+
await globalTaskManager.shutdown();
|
|
525
|
+
globalTaskManager = null;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=task-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../../src/utils/task-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Persistence for MCP Tasks Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides file-based persistence for tasks to survive server restarts.
|
|
5
|
+
* Uses JSON files stored in a configurable cache directory.
|
|
6
|
+
*
|
|
7
|
+
* Implements ADR-018: MCP Tasks Integration Strategy
|
|
8
|
+
*
|
|
9
|
+
* @experimental MCP Tasks is an experimental feature in the MCP specification
|
|
10
|
+
*/
|
|
11
|
+
import type { AdrTask } from './task-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for task persistence
|
|
14
|
+
*/
|
|
15
|
+
export interface TaskPersistenceConfig {
|
|
16
|
+
/** Directory to store task data (default: .mcp-adr-cache/tasks) */
|
|
17
|
+
cacheDir: string;
|
|
18
|
+
/** Whether persistence is enabled (default: true) */
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
/** Maximum age of persisted tasks in ms (default: 7 days) */
|
|
21
|
+
maxAge: number;
|
|
22
|
+
/** Write delay in ms for debouncing (default: 1000) */
|
|
23
|
+
writeDelay: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Task Persistence Manager
|
|
27
|
+
*
|
|
28
|
+
* Handles saving and loading tasks to/from disk for durability across
|
|
29
|
+
* server restarts. Uses debounced writes to avoid excessive disk I/O.
|
|
30
|
+
*/
|
|
31
|
+
export declare class TaskPersistence {
|
|
32
|
+
private config;
|
|
33
|
+
private writeTimer;
|
|
34
|
+
private pendingWrite;
|
|
35
|
+
private initialized;
|
|
36
|
+
constructor(config?: Partial<TaskPersistenceConfig>);
|
|
37
|
+
/**
|
|
38
|
+
* Initialize persistence - create cache directory if needed
|
|
39
|
+
*/
|
|
40
|
+
initialize(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the path to the tasks file
|
|
43
|
+
*/
|
|
44
|
+
private getTasksFilePath;
|
|
45
|
+
/**
|
|
46
|
+
* Load persisted tasks from disk
|
|
47
|
+
*/
|
|
48
|
+
load(): Promise<{
|
|
49
|
+
tasks: Map<string, AdrTask>;
|
|
50
|
+
progress: Map<string, number>;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Save tasks to disk (debounced)
|
|
54
|
+
*/
|
|
55
|
+
save(tasks: Map<string, AdrTask>, progress: Map<string, number>): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Force immediate save (for shutdown)
|
|
58
|
+
*/
|
|
59
|
+
saveImmediate(tasks: Map<string, AdrTask>, progress: Map<string, number>): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Write data to file
|
|
62
|
+
*/
|
|
63
|
+
private writeToFile;
|
|
64
|
+
/**
|
|
65
|
+
* Delete persisted task data
|
|
66
|
+
*/
|
|
67
|
+
clear(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Cleanup old task files
|
|
70
|
+
*/
|
|
71
|
+
cleanup(): Promise<number>;
|
|
72
|
+
/**
|
|
73
|
+
* Shutdown persistence - flush pending writes
|
|
74
|
+
*/
|
|
75
|
+
shutdown(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Check if persistence is enabled
|
|
78
|
+
*/
|
|
79
|
+
isEnabled(): boolean;
|
|
80
|
+
}
|
|
81
|
+
export declare function createTaskPersistence(config?: Partial<TaskPersistenceConfig>): TaskPersistence;
|
|
82
|
+
//# sourceMappingURL=task-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-persistence.d.ts","sourceRoot":"","sources":["../../../src/utils/task-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAoBD;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIvD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAyDrF;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrF;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9F;;OAEG;YACW,WAAW;IAwBzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBhC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAc/B;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAGD,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAE9F"}
|