mcp-taskflow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE.md +21 -0
- package/README.md +275 -0
- package/dist/config/pathResolver.d.ts +33 -0
- package/dist/config/pathResolver.d.ts.map +1 -0
- package/dist/config/pathResolver.js +130 -0
- package/dist/config/pathResolver.js.map +1 -0
- package/dist/data/fileOperations.d.ts +43 -0
- package/dist/data/fileOperations.d.ts.map +1 -0
- package/dist/data/fileOperations.js +248 -0
- package/dist/data/fileOperations.js.map +1 -0
- package/dist/data/memoryStore.d.ts +86 -0
- package/dist/data/memoryStore.d.ts.map +1 -0
- package/dist/data/memoryStore.js +216 -0
- package/dist/data/memoryStore.js.map +1 -0
- package/dist/data/rulesStore.d.ts +63 -0
- package/dist/data/rulesStore.d.ts.map +1 -0
- package/dist/data/rulesStore.js +196 -0
- package/dist/data/rulesStore.js.map +1 -0
- package/dist/data/schemas.d.ts +840 -0
- package/dist/data/schemas.d.ts.map +1 -0
- package/dist/data/schemas.js +265 -0
- package/dist/data/schemas.js.map +1 -0
- package/dist/data/taskSearchService.d.ts +110 -0
- package/dist/data/taskSearchService.d.ts.map +1 -0
- package/dist/data/taskSearchService.js +165 -0
- package/dist/data/taskSearchService.js.map +1 -0
- package/dist/data/taskStore.d.ts +192 -0
- package/dist/data/taskStore.d.ts.map +1 -0
- package/dist/data/taskStore.js +347 -0
- package/dist/data/taskStore.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +12 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/projectPromptBuilder.d.ts +13 -0
- package/dist/prompts/projectPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/projectPromptBuilder.js +29 -0
- package/dist/prompts/projectPromptBuilder.js.map +1 -0
- package/dist/prompts/researchPromptBuilder.d.ts +10 -0
- package/dist/prompts/researchPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/researchPromptBuilder.js +20 -0
- package/dist/prompts/researchPromptBuilder.js.map +1 -0
- package/dist/prompts/taskPromptBuilders.d.ts +87 -0
- package/dist/prompts/taskPromptBuilders.d.ts.map +1 -0
- package/dist/prompts/taskPromptBuilders.js +529 -0
- package/dist/prompts/taskPromptBuilders.js.map +1 -0
- package/dist/prompts/templateEngine.d.ts +102 -0
- package/dist/prompts/templateEngine.d.ts.map +1 -0
- package/dist/prompts/templateEngine.js +145 -0
- package/dist/prompts/templateEngine.js.map +1 -0
- package/dist/prompts/templateLoader.d.ts +61 -0
- package/dist/prompts/templateLoader.d.ts.map +1 -0
- package/dist/prompts/templateLoader.js +129 -0
- package/dist/prompts/templateLoader.js.map +1 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/index.md +65 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/iteration.md +12 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/backupInfo.md +1 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/cancel.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/empty.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/result.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/completed.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/result.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/analysisResult.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/complexity.md +15 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencies.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencyTasks.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/index.md +39 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/relatedFilesSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/complatedSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/dependencies.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/error.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/index.md +25 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/relatedFiles.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/initProjectRules/index.md +81 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/taskDetails.md +13 -0
- package/dist/prompts/templates/v1/templates_en/planTask/hasThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/index.md +96 -0
- package/dist/prompts/templates/v1/templates_en/planTask/noThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/tasks.md +17 -0
- package/dist/prompts/templates/v1/templates_en/processThought/complatedThought.md +6 -0
- package/dist/prompts/templates/v1/templates_en/processThought/index.md +13 -0
- package/dist/prompts/templates/v1/templates_en/processThought/moreThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/index.md +24 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/notFound.md +15 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/taskDetails.md +5 -0
- package/dist/prompts/templates/v1/templates_en/reflectTask/index.md +57 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/index.md +95 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/previousState.md +9 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/index.md +34 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/taskDetails.md +12 -0
- package/dist/prompts/templates/v1/templates_en/tests/basic.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/analyzeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/clearAllTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/deleteTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/executeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/getTaskDetail.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/initProjectRules.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/listTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/planTask.md +3 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/processThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/queryTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/reflectTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/researchMode.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/splitTasks.md +83 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/updateTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/verifyTask.md +37 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/emptyUpdate.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/fileDetails.md +1 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/success.md +9 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/successDetails.md +3 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/validation.md +5 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/index.md +19 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/noPass.md +12 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts +11 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/thoughtPromptBuilder.js +30 -0
- package/dist/prompts/thoughtPromptBuilder.js.map +1 -0
- package/dist/server/container.d.ts +111 -0
- package/dist/server/container.d.ts.map +1 -0
- package/dist/server/container.js +135 -0
- package/dist/server/container.js.map +1 -0
- package/dist/server/logger.d.ts +98 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +295 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/mcpServer.d.ts +162 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +236 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/tools/project/index.d.ts +7 -0
- package/dist/tools/project/index.d.ts.map +1 -0
- package/dist/tools/project/index.js +7 -0
- package/dist/tools/project/index.js.map +1 -0
- package/dist/tools/project/projectTools.d.ts +17 -0
- package/dist/tools/project/projectTools.d.ts.map +1 -0
- package/dist/tools/project/projectTools.js +73 -0
- package/dist/tools/project/projectTools.js.map +1 -0
- package/dist/tools/research/index.d.ts +7 -0
- package/dist/tools/research/index.d.ts.map +1 -0
- package/dist/tools/research/index.js +7 -0
- package/dist/tools/research/index.js.map +1 -0
- package/dist/tools/research/researchTools.d.ts +16 -0
- package/dist/tools/research/researchTools.d.ts.map +1 -0
- package/dist/tools/research/researchTools.js +41 -0
- package/dist/tools/research/researchTools.js.map +1 -0
- package/dist/tools/task/index.d.ts +8 -0
- package/dist/tools/task/index.d.ts.map +1 -0
- package/dist/tools/task/index.js +8 -0
- package/dist/tools/task/index.js.map +1 -0
- package/dist/tools/task/taskTools.d.ts +32 -0
- package/dist/tools/task/taskTools.d.ts.map +1 -0
- package/dist/tools/task/taskTools.js +542 -0
- package/dist/tools/task/taskTools.js.map +1 -0
- package/dist/tools/thought/index.d.ts +7 -0
- package/dist/tools/thought/index.d.ts.map +1 -0
- package/dist/tools/thought/index.js +7 -0
- package/dist/tools/thought/index.js.map +1 -0
- package/dist/tools/thought/thoughtTools.d.ts +16 -0
- package/dist/tools/thought/thoughtTools.d.ts.map +1 -0
- package/dist/tools/thought/thoughtTools.js +47 -0
- package/dist/tools/thought/thoughtTools.js.map +1 -0
- package/docs/API.md +32 -0
- package/docs/ARCHITECTURE.md +44 -0
- package/docs/COMPATIBILITY_REPORT.md +26 -0
- package/docs/PERFORMANCE.md +66 -0
- package/package.json +77 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskStore - CRUD operations for task management
|
|
3
|
+
*
|
|
4
|
+
* Provides thread-safe task operations with:
|
|
5
|
+
* - Atomic read-modify-write pattern
|
|
6
|
+
* - Dependency resolution (by ID or name)
|
|
7
|
+
* - Automatic timestamp management
|
|
8
|
+
* - Event notifications
|
|
9
|
+
*/
|
|
10
|
+
import { type TaskItem } from './schemas.js';
|
|
11
|
+
/**
|
|
12
|
+
* Related file type enumeration
|
|
13
|
+
*/
|
|
14
|
+
export type RelatedFileType = 'TO_MODIFY' | 'REFERENCE' | 'CREATE' | 'DEPENDENCY' | 'OTHER';
|
|
15
|
+
/**
|
|
16
|
+
* Related file information for a task
|
|
17
|
+
*/
|
|
18
|
+
export interface RelatedFileInfo {
|
|
19
|
+
path: string;
|
|
20
|
+
type: RelatedFileType;
|
|
21
|
+
description?: string | null;
|
|
22
|
+
lineStart?: number | null;
|
|
23
|
+
lineEnd?: number | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fields that can be set when creating a task
|
|
27
|
+
* Excludes auto-generated fields (id, timestamps, status, summary)
|
|
28
|
+
*/
|
|
29
|
+
type TaskCreatableFields = Pick<TaskItem, 'name' | 'description' | 'notes' | 'analysisResult' | 'agent' | 'implementationGuide' | 'verificationCriteria'>;
|
|
30
|
+
/**
|
|
31
|
+
* Request to create a new task
|
|
32
|
+
*
|
|
33
|
+
* Allows creating a task with user-provided fields.
|
|
34
|
+
* Dependencies can be specified by ID or name (resolved at creation time).
|
|
35
|
+
*/
|
|
36
|
+
export interface TaskCreateRequest extends TaskCreatableFields {
|
|
37
|
+
/** Task dependencies (IDs or names) */
|
|
38
|
+
dependencies?: string[];
|
|
39
|
+
/** Related files for the task */
|
|
40
|
+
relatedFiles?: RelatedFileInfo[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fields that can be updated on an existing task
|
|
44
|
+
* All fields are optional and nullable (undefined = keep existing, null = clear)
|
|
45
|
+
*/
|
|
46
|
+
type TaskUpdatableFields = Partial<Pick<TaskItem, 'name' | 'description' | 'notes' | 'status' | 'summary' | 'analysisResult' | 'agent' | 'implementationGuide' | 'verificationCriteria'>>;
|
|
47
|
+
/**
|
|
48
|
+
* Request to update an existing task
|
|
49
|
+
*
|
|
50
|
+
* Three-way null handling:
|
|
51
|
+
* - `undefined` (field omitted) = keep existing value
|
|
52
|
+
* - `null` = clear the field
|
|
53
|
+
* - value = update to new value
|
|
54
|
+
*/
|
|
55
|
+
export interface TaskUpdateRequest extends TaskUpdatableFields {
|
|
56
|
+
/** Updated dependencies (IDs or names), or null to clear */
|
|
57
|
+
dependencies?: string[] | null;
|
|
58
|
+
/** Updated related files, or null to clear */
|
|
59
|
+
relatedFiles?: RelatedFileInfo[] | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of clearing all tasks
|
|
63
|
+
*/
|
|
64
|
+
export interface ClearAllResult {
|
|
65
|
+
success: boolean;
|
|
66
|
+
message: string;
|
|
67
|
+
backupFile?: string | null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Task change event types
|
|
71
|
+
*/
|
|
72
|
+
export type TaskChangeEvent = {
|
|
73
|
+
type: 'created';
|
|
74
|
+
task: TaskItem;
|
|
75
|
+
} | {
|
|
76
|
+
type: 'updated';
|
|
77
|
+
task: TaskItem;
|
|
78
|
+
} | {
|
|
79
|
+
type: 'deleted';
|
|
80
|
+
task: TaskItem;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'cleared';
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Task change event handler
|
|
86
|
+
*/
|
|
87
|
+
export type TaskChangeHandler = (event: TaskChangeEvent) => void;
|
|
88
|
+
/**
|
|
89
|
+
* TaskStore - Main storage for task data
|
|
90
|
+
*
|
|
91
|
+
* This class provides CRUD operations with:
|
|
92
|
+
* - Atomic file operations to prevent corruption
|
|
93
|
+
* - Dependency resolution (supports both task IDs and task names)
|
|
94
|
+
* - Automatic timestamp management
|
|
95
|
+
* - Event notifications for changes
|
|
96
|
+
*/
|
|
97
|
+
export declare class TaskStore {
|
|
98
|
+
private readonly tasksFilePath;
|
|
99
|
+
private readonly handlers;
|
|
100
|
+
private writeQueue;
|
|
101
|
+
private cachedDocument;
|
|
102
|
+
private cachedMtimeMs;
|
|
103
|
+
/**
|
|
104
|
+
* Create a new TaskStore
|
|
105
|
+
*
|
|
106
|
+
* @param dataDir - Optional data directory override (for testing)
|
|
107
|
+
*/
|
|
108
|
+
constructor(dataDir?: string);
|
|
109
|
+
/**
|
|
110
|
+
* Subscribe to task change events
|
|
111
|
+
*
|
|
112
|
+
* @param handler - Function to call when tasks change
|
|
113
|
+
* @returns Unsubscribe function
|
|
114
|
+
*/
|
|
115
|
+
onTaskChanged(handler: TaskChangeHandler): () => void;
|
|
116
|
+
/**
|
|
117
|
+
* Get all tasks
|
|
118
|
+
*
|
|
119
|
+
* @returns Array of all tasks
|
|
120
|
+
*/
|
|
121
|
+
getAllAsync(): Promise<TaskItem[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Get a single task by ID
|
|
124
|
+
*
|
|
125
|
+
* @param taskId - UUID of the task
|
|
126
|
+
* @returns Task if found, null otherwise
|
|
127
|
+
*/
|
|
128
|
+
getByIdAsync(taskId: string): Promise<TaskItem | null>;
|
|
129
|
+
/**
|
|
130
|
+
* Create a new task
|
|
131
|
+
*
|
|
132
|
+
* @param request - Task creation data
|
|
133
|
+
* @returns Newly created task
|
|
134
|
+
*/
|
|
135
|
+
createAsync(request: TaskCreateRequest): Promise<TaskItem>;
|
|
136
|
+
/**
|
|
137
|
+
* Update an existing task
|
|
138
|
+
*
|
|
139
|
+
* @param taskId - UUID of the task to update
|
|
140
|
+
* @param request - Update data
|
|
141
|
+
* @returns Updated task if found, null otherwise
|
|
142
|
+
*/
|
|
143
|
+
updateAsync(taskId: string, request: TaskUpdateRequest): Promise<TaskItem | null>;
|
|
144
|
+
/**
|
|
145
|
+
* Delete a task by ID
|
|
146
|
+
*
|
|
147
|
+
* @param taskId - UUID of the task to delete
|
|
148
|
+
* @returns True if deleted, false if not found
|
|
149
|
+
*/
|
|
150
|
+
deleteAsync(taskId: string): Promise<boolean>;
|
|
151
|
+
/**
|
|
152
|
+
* Clear all tasks (with backup of completed tasks)
|
|
153
|
+
*
|
|
154
|
+
* @returns Result with backup file path
|
|
155
|
+
*/
|
|
156
|
+
clearAllAsync(): Promise<ClearAllResult>;
|
|
157
|
+
/**
|
|
158
|
+
* Read task document from disk
|
|
159
|
+
* Creates empty document if file doesn't exist
|
|
160
|
+
*/
|
|
161
|
+
private readDocumentAsync;
|
|
162
|
+
/**
|
|
163
|
+
* Write task document to disk atomically
|
|
164
|
+
*/
|
|
165
|
+
private writeDocumentAsync;
|
|
166
|
+
/**
|
|
167
|
+
* Find task index by ID
|
|
168
|
+
*/
|
|
169
|
+
private findTaskIndex;
|
|
170
|
+
/**
|
|
171
|
+
* Apply updates to an existing task
|
|
172
|
+
* Handles status transitions and automatic timestamp management
|
|
173
|
+
*/
|
|
174
|
+
private applyUpdates;
|
|
175
|
+
/**
|
|
176
|
+
* Convert dependency strings to TaskDependency objects
|
|
177
|
+
* Supports both task IDs (UUIDs) and task names
|
|
178
|
+
*
|
|
179
|
+
* Resolution logic:
|
|
180
|
+
* 1. Try exact UUID match
|
|
181
|
+
* 2. Try case-sensitive name match
|
|
182
|
+
* 3. Skip if no match found
|
|
183
|
+
*/
|
|
184
|
+
private toDependencies;
|
|
185
|
+
/**
|
|
186
|
+
* Notify all registered handlers of a task change
|
|
187
|
+
*/
|
|
188
|
+
private notifyHandlers;
|
|
189
|
+
private withWriteLock;
|
|
190
|
+
}
|
|
191
|
+
export {};
|
|
192
|
+
//# sourceMappingURL=taskStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskStore.d.ts","sourceRoot":"","sources":["../../src/data/taskStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskStore - CRUD operations for task management
|
|
3
|
+
*
|
|
4
|
+
* Provides thread-safe task operations with:
|
|
5
|
+
* - Atomic read-modify-write pattern
|
|
6
|
+
* - Dependency resolution (by ID or name)
|
|
7
|
+
* - Automatic timestamp management
|
|
8
|
+
* - Event notifications
|
|
9
|
+
*/
|
|
10
|
+
import { writeJsonFile, readJsonFileOrDefault, } from './fileOperations.js';
|
|
11
|
+
import fs from 'fs/promises';
|
|
12
|
+
import { TaskDocumentSchema, TaskItemSchema, } from './schemas.js';
|
|
13
|
+
import { getDataPath } from '../config/pathResolver.js';
|
|
14
|
+
import { randomUUID } from 'crypto';
|
|
15
|
+
/**
|
|
16
|
+
* TaskStore - Main storage for task data
|
|
17
|
+
*
|
|
18
|
+
* This class provides CRUD operations with:
|
|
19
|
+
* - Atomic file operations to prevent corruption
|
|
20
|
+
* - Dependency resolution (supports both task IDs and task names)
|
|
21
|
+
* - Automatic timestamp management
|
|
22
|
+
* - Event notifications for changes
|
|
23
|
+
*/
|
|
24
|
+
export class TaskStore {
|
|
25
|
+
tasksFilePath;
|
|
26
|
+
handlers = [];
|
|
27
|
+
writeQueue = Promise.resolve();
|
|
28
|
+
cachedDocument = null;
|
|
29
|
+
cachedMtimeMs = null;
|
|
30
|
+
/**
|
|
31
|
+
* Create a new TaskStore
|
|
32
|
+
*
|
|
33
|
+
* @param dataDir - Optional data directory override (for testing)
|
|
34
|
+
*/
|
|
35
|
+
constructor(dataDir) {
|
|
36
|
+
this.tasksFilePath = getDataPath('tasks.json', dataDir);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to task change events
|
|
40
|
+
*
|
|
41
|
+
* @param handler - Function to call when tasks change
|
|
42
|
+
* @returns Unsubscribe function
|
|
43
|
+
*/
|
|
44
|
+
onTaskChanged(handler) {
|
|
45
|
+
this.handlers.push(handler);
|
|
46
|
+
return () => {
|
|
47
|
+
const index = this.handlers.indexOf(handler);
|
|
48
|
+
if (index >= 0) {
|
|
49
|
+
this.handlers.splice(index, 1);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get all tasks
|
|
55
|
+
*
|
|
56
|
+
* @returns Array of all tasks
|
|
57
|
+
*/
|
|
58
|
+
async getAllAsync() {
|
|
59
|
+
const document = await this.readDocumentAsync();
|
|
60
|
+
return document.tasks;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get a single task by ID
|
|
64
|
+
*
|
|
65
|
+
* @param taskId - UUID of the task
|
|
66
|
+
* @returns Task if found, null otherwise
|
|
67
|
+
*/
|
|
68
|
+
async getByIdAsync(taskId) {
|
|
69
|
+
const document = await this.readDocumentAsync();
|
|
70
|
+
return document.tasks.find(task => task.id === taskId) ?? null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a new task
|
|
74
|
+
*
|
|
75
|
+
* @param request - Task creation data
|
|
76
|
+
* @returns Newly created task
|
|
77
|
+
*/
|
|
78
|
+
async createAsync(request) {
|
|
79
|
+
return await this.withWriteLock(async () => {
|
|
80
|
+
const document = await this.readDocumentAsync();
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const task = {
|
|
83
|
+
id: randomUUID(),
|
|
84
|
+
name: request.name,
|
|
85
|
+
description: request.description,
|
|
86
|
+
notes: request.notes ?? null,
|
|
87
|
+
status: 'pending',
|
|
88
|
+
dependencies: this.toDependencies(request.dependencies ?? [], document.tasks),
|
|
89
|
+
createdAt: now,
|
|
90
|
+
updatedAt: now,
|
|
91
|
+
completedAt: null,
|
|
92
|
+
summary: null,
|
|
93
|
+
relatedFiles: request.relatedFiles ?? [],
|
|
94
|
+
analysisResult: request.analysisResult ?? null,
|
|
95
|
+
agent: request.agent ?? null,
|
|
96
|
+
implementationGuide: request.implementationGuide ?? null,
|
|
97
|
+
verificationCriteria: request.verificationCriteria ?? null,
|
|
98
|
+
};
|
|
99
|
+
// Validate the task matches schema
|
|
100
|
+
TaskItemSchema.parse(task);
|
|
101
|
+
const updatedDocument = {
|
|
102
|
+
version: document.version,
|
|
103
|
+
tasks: [...document.tasks, task],
|
|
104
|
+
};
|
|
105
|
+
await this.writeDocumentAsync(updatedDocument);
|
|
106
|
+
this.notifyHandlers({ type: 'created', task });
|
|
107
|
+
return task;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update an existing task
|
|
112
|
+
*
|
|
113
|
+
* @param taskId - UUID of the task to update
|
|
114
|
+
* @param request - Update data
|
|
115
|
+
* @returns Updated task if found, null otherwise
|
|
116
|
+
*/
|
|
117
|
+
async updateAsync(taskId, request) {
|
|
118
|
+
return await this.withWriteLock(async () => {
|
|
119
|
+
const document = await this.readDocumentAsync();
|
|
120
|
+
const index = this.findTaskIndex(document.tasks, taskId);
|
|
121
|
+
if (index < 0) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const now = new Date().toISOString();
|
|
125
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
126
|
+
const existing = document.tasks[index]; // Safe: index validated above
|
|
127
|
+
const updated = this.applyUpdates(existing, request, now, document.tasks);
|
|
128
|
+
const updatedTasks = [...document.tasks];
|
|
129
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
130
|
+
updatedTasks[index] = updated;
|
|
131
|
+
const updatedDocument = {
|
|
132
|
+
version: document.version,
|
|
133
|
+
tasks: updatedTasks,
|
|
134
|
+
};
|
|
135
|
+
await this.writeDocumentAsync(updatedDocument);
|
|
136
|
+
this.notifyHandlers({ type: 'updated', task: updated });
|
|
137
|
+
return updated;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Delete a task by ID
|
|
142
|
+
*
|
|
143
|
+
* @param taskId - UUID of the task to delete
|
|
144
|
+
* @returns True if deleted, false if not found
|
|
145
|
+
*/
|
|
146
|
+
async deleteAsync(taskId) {
|
|
147
|
+
return await this.withWriteLock(async () => {
|
|
148
|
+
const document = await this.readDocumentAsync();
|
|
149
|
+
const index = this.findTaskIndex(document.tasks, taskId);
|
|
150
|
+
if (index < 0) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
154
|
+
const deletedTask = document.tasks[index]; // Safe: index validated above
|
|
155
|
+
const updatedTasks = [...document.tasks];
|
|
156
|
+
updatedTasks.splice(index, 1);
|
|
157
|
+
const updatedDocument = {
|
|
158
|
+
version: document.version,
|
|
159
|
+
tasks: updatedTasks,
|
|
160
|
+
};
|
|
161
|
+
await this.writeDocumentAsync(updatedDocument);
|
|
162
|
+
this.notifyHandlers({ type: 'deleted', task: deletedTask });
|
|
163
|
+
return true;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clear all tasks (with backup of completed tasks)
|
|
168
|
+
*
|
|
169
|
+
* @returns Result with backup file path
|
|
170
|
+
*/
|
|
171
|
+
async clearAllAsync() {
|
|
172
|
+
return await this.withWriteLock(async () => {
|
|
173
|
+
const document = await this.readDocumentAsync();
|
|
174
|
+
if (document.tasks.length === 0) {
|
|
175
|
+
return {
|
|
176
|
+
success: true,
|
|
177
|
+
message: 'No tasks to clear.',
|
|
178
|
+
backupFile: null,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// TODO: Implement backup functionality when MemoryStore is available
|
|
182
|
+
// For now, just clear tasks
|
|
183
|
+
const emptyDocument = {
|
|
184
|
+
version: '1.0',
|
|
185
|
+
tasks: [],
|
|
186
|
+
};
|
|
187
|
+
await this.writeDocumentAsync(emptyDocument);
|
|
188
|
+
this.notifyHandlers({ type: 'cleared' });
|
|
189
|
+
return {
|
|
190
|
+
success: true,
|
|
191
|
+
message: `Cleared ${document.tasks.length} task(s).`,
|
|
192
|
+
backupFile: null,
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Read task document from disk
|
|
198
|
+
* Creates empty document if file doesn't exist
|
|
199
|
+
*/
|
|
200
|
+
async readDocumentAsync() {
|
|
201
|
+
const defaultDocument = {
|
|
202
|
+
version: '1.0',
|
|
203
|
+
tasks: [],
|
|
204
|
+
};
|
|
205
|
+
let stats = null;
|
|
206
|
+
try {
|
|
207
|
+
stats = await fs.stat(this.tasksFilePath);
|
|
208
|
+
if (this.cachedDocument && this.cachedMtimeMs === stats.mtimeMs) {
|
|
209
|
+
return this.cachedDocument;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const code = error.code;
|
|
214
|
+
if (code !== 'ENOENT') {
|
|
215
|
+
console.warn('Failed to stat tasks file:', error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const document = await readJsonFileOrDefault(this.tasksFilePath, TaskDocumentSchema, defaultDocument);
|
|
219
|
+
this.cachedDocument = document;
|
|
220
|
+
this.cachedMtimeMs = stats?.mtimeMs ?? null;
|
|
221
|
+
// Schema defaults ensure arrays are never undefined, but TypeScript needs assertion
|
|
222
|
+
return document;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Write task document to disk atomically
|
|
226
|
+
*/
|
|
227
|
+
async writeDocumentAsync(document) {
|
|
228
|
+
await writeJsonFile(this.tasksFilePath, document, TaskDocumentSchema);
|
|
229
|
+
this.cachedDocument = document;
|
|
230
|
+
try {
|
|
231
|
+
const stats = await fs.stat(this.tasksFilePath);
|
|
232
|
+
this.cachedMtimeMs = stats.mtimeMs;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
this.cachedMtimeMs = null;
|
|
236
|
+
console.warn('Failed to stat tasks file after write:', error);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Find task index by ID
|
|
241
|
+
*/
|
|
242
|
+
findTaskIndex(tasks, taskId) {
|
|
243
|
+
return tasks.findIndex(task => task.id === taskId);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Apply updates to an existing task
|
|
247
|
+
* Handles status transitions and automatic timestamp management
|
|
248
|
+
*/
|
|
249
|
+
applyUpdates(existing, request, now, allTasks) {
|
|
250
|
+
const status = request.status ?? existing.status;
|
|
251
|
+
const completedAt = status === 'completed'
|
|
252
|
+
? (existing.completedAt ?? now)
|
|
253
|
+
: null;
|
|
254
|
+
const updated = {
|
|
255
|
+
...existing,
|
|
256
|
+
name: request.name ?? existing.name,
|
|
257
|
+
description: request.description ?? existing.description,
|
|
258
|
+
notes: request.notes !== undefined ? request.notes : existing.notes,
|
|
259
|
+
status,
|
|
260
|
+
dependencies: request.dependencies !== undefined
|
|
261
|
+
? this.toDependencies(request.dependencies ?? [], allTasks)
|
|
262
|
+
: existing.dependencies,
|
|
263
|
+
relatedFiles: request.relatedFiles ?? existing.relatedFiles,
|
|
264
|
+
summary: request.summary !== undefined ? request.summary : existing.summary,
|
|
265
|
+
analysisResult: request.analysisResult !== undefined
|
|
266
|
+
? request.analysisResult
|
|
267
|
+
: existing.analysisResult,
|
|
268
|
+
agent: request.agent !== undefined ? request.agent : existing.agent,
|
|
269
|
+
implementationGuide: request.implementationGuide !== undefined
|
|
270
|
+
? request.implementationGuide
|
|
271
|
+
: existing.implementationGuide,
|
|
272
|
+
verificationCriteria: request.verificationCriteria !== undefined
|
|
273
|
+
? request.verificationCriteria
|
|
274
|
+
: existing.verificationCriteria,
|
|
275
|
+
updatedAt: now,
|
|
276
|
+
completedAt,
|
|
277
|
+
};
|
|
278
|
+
// Validate updated task
|
|
279
|
+
TaskItemSchema.parse(updated);
|
|
280
|
+
return updated;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Convert dependency strings to TaskDependency objects
|
|
284
|
+
* Supports both task IDs (UUIDs) and task names
|
|
285
|
+
*
|
|
286
|
+
* Resolution logic:
|
|
287
|
+
* 1. Try exact UUID match
|
|
288
|
+
* 2. Try case-sensitive name match
|
|
289
|
+
* 3. Skip if no match found
|
|
290
|
+
*/
|
|
291
|
+
toDependencies(dependencyStrings, allTasks) {
|
|
292
|
+
const dependencies = [];
|
|
293
|
+
for (const depStr of dependencyStrings) {
|
|
294
|
+
if (!depStr || depStr.trim().length === 0) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
const trimmed = depStr.trim();
|
|
298
|
+
// Try UUID match first (exact ID)
|
|
299
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
300
|
+
if (uuidRegex.test(trimmed)) {
|
|
301
|
+
const taskById = allTasks.find(t => t.id === trimmed);
|
|
302
|
+
if (taskById) {
|
|
303
|
+
dependencies.push({ taskId: taskById.id });
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Try name match (case-sensitive)
|
|
308
|
+
const taskByName = allTasks.find(t => t.name === trimmed);
|
|
309
|
+
if (taskByName) {
|
|
310
|
+
dependencies.push({ taskId: taskByName.id });
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
// If no match found, skip this dependency
|
|
314
|
+
// This prevents invalid dependencies from being created
|
|
315
|
+
}
|
|
316
|
+
return dependencies;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Notify all registered handlers of a task change
|
|
320
|
+
*/
|
|
321
|
+
notifyHandlers(event) {
|
|
322
|
+
for (const handler of this.handlers) {
|
|
323
|
+
try {
|
|
324
|
+
handler(event);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
// Don't let handler errors break the store
|
|
328
|
+
console.error('Error in task change handler:', error);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
async withWriteLock(fn) {
|
|
333
|
+
const previous = this.writeQueue;
|
|
334
|
+
let release;
|
|
335
|
+
this.writeQueue = new Promise((resolve) => {
|
|
336
|
+
release = resolve;
|
|
337
|
+
});
|
|
338
|
+
await previous;
|
|
339
|
+
try {
|
|
340
|
+
return await fn();
|
|
341
|
+
}
|
|
342
|
+
finally {
|
|
343
|
+
release();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=taskStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskStore.js","sourceRoot":"","sources":["../../src/data/taskStore.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Entry Point for MCP Task and Research Server
|
|
4
|
+
*
|
|
5
|
+
* This file serves as the main entry point for the MCP server.
|
|
6
|
+
* It handles:
|
|
7
|
+
* - Environment configuration (DATA_DIR, LOG_LEVEL, NODE_ENV)
|
|
8
|
+
* - Server initialization and startup
|
|
9
|
+
* - Global error handling
|
|
10
|
+
* - Process lifecycle management
|
|
11
|
+
*
|
|
12
|
+
* The server uses STDIO transport, so:
|
|
13
|
+
* - stdin: Receives JSON-RPC requests from MCP client
|
|
14
|
+
* - stdout: Sends JSON-RPC responses to MCP client
|
|
15
|
+
* - stderr: Logs (don't pollute stdout!)
|
|
16
|
+
*
|
|
17
|
+
* Environment Variables:
|
|
18
|
+
* - DATA_DIR: Directory for task data (default: .mcp-tasks in workspace)
|
|
19
|
+
* - LOG_LEVEL: Log verbosity (trace, debug, info, warn, error)
|
|
20
|
+
* - NODE_ENV: Environment (development, production)
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Entry Point for MCP Task and Research Server
|
|
4
|
+
*
|
|
5
|
+
* This file serves as the main entry point for the MCP server.
|
|
6
|
+
* It handles:
|
|
7
|
+
* - Environment configuration (DATA_DIR, LOG_LEVEL, NODE_ENV)
|
|
8
|
+
* - Server initialization and startup
|
|
9
|
+
* - Global error handling
|
|
10
|
+
* - Process lifecycle management
|
|
11
|
+
*
|
|
12
|
+
* The server uses STDIO transport, so:
|
|
13
|
+
* - stdin: Receives JSON-RPC requests from MCP client
|
|
14
|
+
* - stdout: Sends JSON-RPC responses to MCP client
|
|
15
|
+
* - stderr: Logs (don't pollute stdout!)
|
|
16
|
+
*
|
|
17
|
+
* Environment Variables:
|
|
18
|
+
* - DATA_DIR: Directory for task data (default: .mcp-tasks in workspace)
|
|
19
|
+
* - LOG_LEVEL: Log verbosity (trace, debug, info, warn, error)
|
|
20
|
+
* - NODE_ENV: Environment (development, production)
|
|
21
|
+
*/
|
|
22
|
+
import { getLogger } from './server/logger.js';
|
|
23
|
+
import { createMcpServer } from './server/mcpServer.js';
|
|
24
|
+
import { initializeGlobalContainer } from './server/container.js';
|
|
25
|
+
import pino from 'pino';
|
|
26
|
+
/**
|
|
27
|
+
* Main entry point
|
|
28
|
+
*
|
|
29
|
+
* Handles server lifecycle:
|
|
30
|
+
* 1. Configure logging (silent in production, verbose in dev)
|
|
31
|
+
* 2. Initialize dependency injection container
|
|
32
|
+
* 3. Create and configure MCP server
|
|
33
|
+
* 4. Start STDIO transport
|
|
34
|
+
* 5. Handle uncaught errors gracefully
|
|
35
|
+
*/
|
|
36
|
+
async function main() {
|
|
37
|
+
const isProduction = process.env['NODE_ENV'] === 'production';
|
|
38
|
+
let logger = getLogger();
|
|
39
|
+
if (isProduction && !process.env['LOG_LEVEL']) {
|
|
40
|
+
logger = pino({ level: 'error' });
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
// Log startup (to stderr, won't interfere with STDIO transport)
|
|
44
|
+
logger.info({
|
|
45
|
+
nodeVersion: process.version,
|
|
46
|
+
platform: process.platform,
|
|
47
|
+
dataDir: process.env['DATA_DIR'] ?? '.mcp-tasks',
|
|
48
|
+
}, 'Starting MCP Task and Research Server');
|
|
49
|
+
// Initialize dependency injection container
|
|
50
|
+
// This is the "Composition Root" - where all services are wired together
|
|
51
|
+
const container = initializeGlobalContainer({
|
|
52
|
+
dataDir: process.env['DATA_DIR'],
|
|
53
|
+
});
|
|
54
|
+
// Create and start server with container
|
|
55
|
+
const server = createMcpServer(container);
|
|
56
|
+
await server.start();
|
|
57
|
+
// Server is now running and processing requests via STDIO
|
|
58
|
+
// It will continue until SIGINT/SIGTERM is received
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error({ err: error }, 'Failed to start MCP server');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Global error handlers
|
|
67
|
+
*
|
|
68
|
+
* Ensures that uncaught errors are logged before process termination
|
|
69
|
+
* This prevents silent failures in production
|
|
70
|
+
*/
|
|
71
|
+
process.on('uncaughtException', (error) => {
|
|
72
|
+
const logger = getLogger();
|
|
73
|
+
logger.fatal({ err: error }, 'Uncaught exception');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
});
|
|
76
|
+
process.on('unhandledRejection', (reason) => {
|
|
77
|
+
const logger = getLogger();
|
|
78
|
+
logger.fatal({ err: reason }, 'Unhandled promise rejection');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
// Start the server
|
|
82
|
+
main().catch((error) => {
|
|
83
|
+
console.error('Fatal error:', error);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;GASG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC;IAE9D,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,MAAM,CAAC,IAAI,CACT;YACE,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,YAAY;SACjD,EACD,uCAAuC,CACxC,CAAC;QAEF,4CAA4C;QAC5C,yEAAyE;QACzE,MAAM,SAAS,GAAG,yBAAyB,CAAC;YAC1C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;SACjC,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,0DAA0D;QAC1D,oDAAoD;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|