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,529 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt builders for task management tools.
|
|
3
|
+
* Each builder generates formatted prompts by combining templates with runtime data.
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - Builder per tool (separation of concerns)
|
|
7
|
+
* - Template loading via TemplateLoader (caching)
|
|
8
|
+
* - Rendering via TemplateEngine (safe string replacement)
|
|
9
|
+
* - Conditional rendering logic in code (not templates)
|
|
10
|
+
*
|
|
11
|
+
* @module prompts/taskPromptBuilders
|
|
12
|
+
*/
|
|
13
|
+
import { loadTemplate } from './templateLoader.js';
|
|
14
|
+
import { render } from './templateEngine.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Helper Functions
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Truncates text to max length with ellipsis.
|
|
20
|
+
*/
|
|
21
|
+
function truncate(text, maxLength) {
|
|
22
|
+
if (text.length <= maxLength) {
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
return text.substring(0, maxLength) + '...';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Formats a timestamp in a human-readable format.
|
|
29
|
+
*/
|
|
30
|
+
function formatDate(dateString) {
|
|
31
|
+
const date = new Date(dateString);
|
|
32
|
+
return date.toLocaleDateString('en-US', {
|
|
33
|
+
weekday: 'long',
|
|
34
|
+
day: 'numeric',
|
|
35
|
+
month: 'long',
|
|
36
|
+
year: 'numeric',
|
|
37
|
+
hour: '2-digit',
|
|
38
|
+
minute: '2-digit'
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Converts task status string to serialized value (pass-through for now).
|
|
43
|
+
*/
|
|
44
|
+
function taskStatusToString(status) {
|
|
45
|
+
return status;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Formats task dependencies as markdown list.
|
|
49
|
+
*/
|
|
50
|
+
function formatDependencies(dependencies) {
|
|
51
|
+
if (dependencies.length === 0) {
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
const list = dependencies.map(dep => `\`${dep.taskId}\``).join(', ');
|
|
55
|
+
return ` - dependencies: ${list}\n`;
|
|
56
|
+
}
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// AnalyzeTaskPromptBuilder
|
|
59
|
+
// ============================================================================
|
|
60
|
+
export class AnalyzeTaskPromptBuilder {
|
|
61
|
+
async build(summary, initialConcept, previousAnalysis) {
|
|
62
|
+
const iterationPrompt = await this.buildIteration(previousAnalysis);
|
|
63
|
+
const template = await loadTemplate('analyzeTask/index.md');
|
|
64
|
+
return render(template, {
|
|
65
|
+
summary,
|
|
66
|
+
initialConcept,
|
|
67
|
+
iterationPrompt
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async buildIteration(previousAnalysis) {
|
|
71
|
+
if (!previousAnalysis || previousAnalysis.trim() === '') {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
const template = await loadTemplate('analyzeTask/iteration.md');
|
|
75
|
+
return render(template, { previousAnalysis });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// ReflectTaskPromptBuilder
|
|
80
|
+
// ============================================================================
|
|
81
|
+
export class ReflectTaskPromptBuilder {
|
|
82
|
+
async build(summary, analysis) {
|
|
83
|
+
const template = await loadTemplate('reflectTask/index.md');
|
|
84
|
+
return render(template, { summary, analysis });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ============================================================================
|
|
88
|
+
// PlanTaskPromptBuilder
|
|
89
|
+
// ============================================================================
|
|
90
|
+
export class PlanTaskPromptBuilder {
|
|
91
|
+
static COMPLETED_TASK_LIMIT = 10;
|
|
92
|
+
async build(description, requirements, existingTasksReference, completedTasks, pendingTasks, memoryDir, rulesPath) {
|
|
93
|
+
const tasksTemplate = await this.buildTasksTemplate(existingTasksReference, completedTasks, pendingTasks);
|
|
94
|
+
const thoughtTemplate = await this.loadThoughtTemplate();
|
|
95
|
+
const template = await loadTemplate('planTask/index.md');
|
|
96
|
+
return render(template, {
|
|
97
|
+
description,
|
|
98
|
+
requirements: requirements || 'No requirements',
|
|
99
|
+
tasksTemplate,
|
|
100
|
+
rulesPath,
|
|
101
|
+
memoryDir,
|
|
102
|
+
thoughtTemplate
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async buildTasksTemplate(existingTasksReference, completedTasks, pendingTasks) {
|
|
106
|
+
if (!existingTasksReference) {
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
const totalCount = completedTasks.length + pendingTasks.length;
|
|
110
|
+
if (totalCount === 0) {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
const template = await loadTemplate('planTask/tasks.md');
|
|
114
|
+
return render(template, {
|
|
115
|
+
completedTasks: this.buildCompletedTasksContent(completedTasks),
|
|
116
|
+
unfinishedTasks: this.buildPendingTasksContent(pendingTasks)
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
buildCompletedTasksContent(completedTasks) {
|
|
120
|
+
if (completedTasks.length === 0) {
|
|
121
|
+
return 'no completed tasks';
|
|
122
|
+
}
|
|
123
|
+
const sorted = [...completedTasks].sort((a, b) => {
|
|
124
|
+
const aTime = Date.parse(a.completedAt ?? a.updatedAt ?? a.createdAt);
|
|
125
|
+
const bTime = Date.parse(b.completedAt ?? b.updatedAt ?? b.createdAt);
|
|
126
|
+
return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);
|
|
127
|
+
});
|
|
128
|
+
const limited = sorted.slice(0, 10);
|
|
129
|
+
const items = limited.map((task, index) => this.formatCompletedTask(index + 1, task));
|
|
130
|
+
return items.join('\n\n');
|
|
131
|
+
}
|
|
132
|
+
buildPendingTasksContent(pendingTasks) {
|
|
133
|
+
if (pendingTasks.length === 0) {
|
|
134
|
+
return 'no pending tasks';
|
|
135
|
+
}
|
|
136
|
+
const items = pendingTasks.map((task, index) => this.formatPendingTask(index + 1, task));
|
|
137
|
+
return items.join('\n\n');
|
|
138
|
+
}
|
|
139
|
+
formatCompletedTask(index, task) {
|
|
140
|
+
const description = truncate(task.description, 100);
|
|
141
|
+
const completedAt = task.completedAt
|
|
142
|
+
? ` - completedAt: ${formatDate(task.completedAt)}\n`
|
|
143
|
+
: '';
|
|
144
|
+
return `${index}. **${task.name}** (ID: \`${task.id}\`)\n - description: ${description}\n${completedAt}`;
|
|
145
|
+
}
|
|
146
|
+
formatPendingTask(index, task) {
|
|
147
|
+
const description = truncate(task.description, 150);
|
|
148
|
+
const dependencies = formatDependencies(task.dependencies);
|
|
149
|
+
return (`${index}. **${task.name}** (ID: \`${task.id}\`)\n` +
|
|
150
|
+
` - description: ${description}\n` +
|
|
151
|
+
` - status: ${taskStatusToString(task.status)}\n` +
|
|
152
|
+
`${dependencies}`);
|
|
153
|
+
}
|
|
154
|
+
async loadThoughtTemplate() {
|
|
155
|
+
const thoughtEnabled = process.env['ENABLE_THOUGHT_CHAIN'];
|
|
156
|
+
const templatePath = thoughtEnabled?.toLowerCase() === 'false'
|
|
157
|
+
? 'planTask/noThought.md'
|
|
158
|
+
: 'planTask/hasThought.md';
|
|
159
|
+
return await loadTemplate(templatePath);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// SplitTasksPromptBuilder
|
|
164
|
+
// ============================================================================
|
|
165
|
+
export class SplitTasksPromptBuilder {
|
|
166
|
+
async build(updateMode, createdTasks, allTasks) {
|
|
167
|
+
const taskDetailsTemplate = await loadTemplate('splitTasks/taskDetails.md');
|
|
168
|
+
const tasksContent = this.buildTasksContent(taskDetailsTemplate, createdTasks, allTasks);
|
|
169
|
+
const indexTemplate = await loadTemplate('splitTasks/index.md');
|
|
170
|
+
return render(indexTemplate, {
|
|
171
|
+
updateMode,
|
|
172
|
+
tasksContent
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
buildTasksContent(taskDetailsTemplate, createdTasks, allTasks) {
|
|
176
|
+
const items = createdTasks.map((task, index) => {
|
|
177
|
+
const taskData = {
|
|
178
|
+
index: index + 1,
|
|
179
|
+
id: task.id,
|
|
180
|
+
name: task.name,
|
|
181
|
+
description: task.description,
|
|
182
|
+
dependencies: this.formatTaskDependencies(task.dependencies, allTasks),
|
|
183
|
+
implementationGuide: task.implementationGuide || '',
|
|
184
|
+
verificationCriteria: task.verificationCriteria || '',
|
|
185
|
+
notes: task.notes || ''
|
|
186
|
+
};
|
|
187
|
+
return render(taskDetailsTemplate, taskData);
|
|
188
|
+
});
|
|
189
|
+
return items.join('\n\n');
|
|
190
|
+
}
|
|
191
|
+
formatTaskDependencies(dependencies, allTasks) {
|
|
192
|
+
if (dependencies.length === 0) {
|
|
193
|
+
return 'none';
|
|
194
|
+
}
|
|
195
|
+
return dependencies
|
|
196
|
+
.map(dep => {
|
|
197
|
+
const task = allTasks.find(t => t.id === dep.taskId);
|
|
198
|
+
return task ? `\`${task.name}\`` : `\`${dep.taskId}\``;
|
|
199
|
+
})
|
|
200
|
+
.join(', ');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// ListTasksPromptBuilder
|
|
205
|
+
// ============================================================================
|
|
206
|
+
export class ListTasksPromptBuilder {
|
|
207
|
+
async build(tasks, statusFilter) {
|
|
208
|
+
const statusCounts = this.calculateStatusCounts(tasks);
|
|
209
|
+
const tasksByStatus = this.groupTasksByStatus(tasks, statusFilter);
|
|
210
|
+
const taskDetailsTemplate = this.buildTaskDetails(tasksByStatus);
|
|
211
|
+
const template = await loadTemplate('listTasks/index.md');
|
|
212
|
+
return render(template, {
|
|
213
|
+
statusCount: this.formatStatusCounts(statusCounts),
|
|
214
|
+
taskDetailsTemplate
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
calculateStatusCounts(tasks) {
|
|
218
|
+
const counts = {
|
|
219
|
+
pending: 0,
|
|
220
|
+
in_progress: 0,
|
|
221
|
+
completed: 0,
|
|
222
|
+
blocked: 0
|
|
223
|
+
};
|
|
224
|
+
for (const task of tasks) {
|
|
225
|
+
const status = taskStatusToString(task.status);
|
|
226
|
+
if (status in counts) {
|
|
227
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
228
|
+
counts[status]++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return counts;
|
|
232
|
+
}
|
|
233
|
+
groupTasksByStatus(tasks, statusFilter) {
|
|
234
|
+
if (statusFilter !== undefined) {
|
|
235
|
+
return tasks.filter(t => t.status === statusFilter);
|
|
236
|
+
}
|
|
237
|
+
return tasks;
|
|
238
|
+
}
|
|
239
|
+
formatStatusCounts(counts) {
|
|
240
|
+
return Object.entries(counts)
|
|
241
|
+
.map(([status, count]) => `- **${status}**: ${count} tasks`)
|
|
242
|
+
.join('\n');
|
|
243
|
+
}
|
|
244
|
+
buildTaskDetails(tasks) {
|
|
245
|
+
if (tasks.length === 0) {
|
|
246
|
+
return 'No tasks found.';
|
|
247
|
+
}
|
|
248
|
+
const items = [];
|
|
249
|
+
for (const task of tasks) {
|
|
250
|
+
const summary = truncate(task.description, 200);
|
|
251
|
+
const deps = task.dependencies.length > 0
|
|
252
|
+
? `\n\n**Dependencies:** ${formatDependencies(task.dependencies)}`
|
|
253
|
+
: '';
|
|
254
|
+
const completed = task.completedAt
|
|
255
|
+
? `\n\n**Completed:** ${formatDate(task.completedAt)}`
|
|
256
|
+
: '';
|
|
257
|
+
items.push(`### ${task.name}\n\n` +
|
|
258
|
+
`**ID:** \`${task.id}\`\n\n` +
|
|
259
|
+
`**Description:** ${summary}\n\n` +
|
|
260
|
+
`${deps}${completed}\n\n` +
|
|
261
|
+
`**Creation Time:** ${formatDate(task.createdAt)}\n`);
|
|
262
|
+
}
|
|
263
|
+
return items.join('\n\n');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// ============================================================================
|
|
267
|
+
// QueryTaskPromptBuilder
|
|
268
|
+
// ============================================================================
|
|
269
|
+
export class QueryTaskPromptBuilder {
|
|
270
|
+
async build(query, tasks, page, pageSize, totalTasks) {
|
|
271
|
+
const totalPages = Math.ceil(totalTasks / pageSize);
|
|
272
|
+
const tasksContent = this.buildTasksContent(tasks);
|
|
273
|
+
const template = await loadTemplate('queryTask/index.md');
|
|
274
|
+
return render(template, {
|
|
275
|
+
query,
|
|
276
|
+
tasksContent,
|
|
277
|
+
page,
|
|
278
|
+
pageSize,
|
|
279
|
+
totalPages,
|
|
280
|
+
totalTasks
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
buildTasksContent(tasks) {
|
|
284
|
+
if (tasks.length === 0) {
|
|
285
|
+
return 'No tasks found matching the query.';
|
|
286
|
+
}
|
|
287
|
+
const items = tasks.map(task => {
|
|
288
|
+
const summary = truncate(task.description, 150);
|
|
289
|
+
return (`### ${task.name} (ID: ${task.id})\n\n` +
|
|
290
|
+
`- Status: ${taskStatusToString(task.status)}\n` +
|
|
291
|
+
`- Description: ${summary}\n` +
|
|
292
|
+
`- Creation Time: ${formatDate(task.createdAt)}\n`);
|
|
293
|
+
});
|
|
294
|
+
return items.join('\n\n');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// GetTaskDetailPromptBuilder
|
|
299
|
+
// ============================================================================
|
|
300
|
+
export class GetTaskDetailPromptBuilder {
|
|
301
|
+
async build(task, allTasks) {
|
|
302
|
+
const template = await loadTemplate('getTaskDetail/index.md');
|
|
303
|
+
return render(template, {
|
|
304
|
+
id: task.id,
|
|
305
|
+
name: task.name,
|
|
306
|
+
description: task.description,
|
|
307
|
+
dependenciesPrompt: await this.buildDependenciesPrompt(task.dependencies, allTasks),
|
|
308
|
+
implementationGuidePrompt: this.buildImplementationGuidePrompt(task.implementationGuide ?? undefined),
|
|
309
|
+
verificationCriteriaPrompt: this.buildVerificationCriteriaPrompt(task.verificationCriteria ?? undefined),
|
|
310
|
+
notesPrompt: this.buildNotesPrompt(task.notes ?? undefined),
|
|
311
|
+
relatedFilesSummaryPrompt: await this.buildRelatedFilesPrompt(task.relatedFiles),
|
|
312
|
+
completedSummaryPrompt: await this.buildCompletedSummaryPrompt(task)
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
async buildDependenciesPrompt(dependencies, allTasks) {
|
|
316
|
+
if (dependencies.length === 0) {
|
|
317
|
+
return '';
|
|
318
|
+
}
|
|
319
|
+
const template = await loadTemplate('getTaskDetail/dependencies.md');
|
|
320
|
+
const depTasks = dependencies
|
|
321
|
+
.map(dep => allTasks.find(t => t.id === dep.taskId))
|
|
322
|
+
.filter((t) => t !== undefined);
|
|
323
|
+
const list = depTasks.map(t => `\`${t.id}\``).join(', ');
|
|
324
|
+
return render(template, { dependencies: list });
|
|
325
|
+
}
|
|
326
|
+
buildImplementationGuidePrompt(guide) {
|
|
327
|
+
return guide ? `\n\n**Implementation Guide:**\n\n${guide}\n` : '';
|
|
328
|
+
}
|
|
329
|
+
buildVerificationCriteriaPrompt(criteria) {
|
|
330
|
+
return criteria ? `\n\n**Verification Criteria:**\n\n${criteria}\n` : '';
|
|
331
|
+
}
|
|
332
|
+
buildNotesPrompt(notes) {
|
|
333
|
+
return notes ? `\n\n**Notes:** ${notes}\n` : '';
|
|
334
|
+
}
|
|
335
|
+
async buildRelatedFilesPrompt(relatedFiles) {
|
|
336
|
+
if (relatedFiles.length === 0) {
|
|
337
|
+
return '';
|
|
338
|
+
}
|
|
339
|
+
const template = await loadTemplate('getTaskDetail/relatedFiles.md');
|
|
340
|
+
const grouped = this.groupFilesByType(relatedFiles);
|
|
341
|
+
const filesList = Object.entries(grouped)
|
|
342
|
+
.map(([type, files]) => {
|
|
343
|
+
const paths = files.map(f => `\`${f.path}\``).join(', ');
|
|
344
|
+
return `- **${type}**: ${paths}`;
|
|
345
|
+
})
|
|
346
|
+
.join('\n');
|
|
347
|
+
return render(template, { filesList });
|
|
348
|
+
}
|
|
349
|
+
groupFilesByType(files) {
|
|
350
|
+
const grouped = {};
|
|
351
|
+
for (const file of files) {
|
|
352
|
+
if (!grouped[file.type]) {
|
|
353
|
+
grouped[file.type] = [];
|
|
354
|
+
}
|
|
355
|
+
grouped[file.type].push(file);
|
|
356
|
+
}
|
|
357
|
+
return grouped;
|
|
358
|
+
}
|
|
359
|
+
async buildCompletedSummaryPrompt(task) {
|
|
360
|
+
if (!task.completedAt) {
|
|
361
|
+
return '';
|
|
362
|
+
}
|
|
363
|
+
const template = await loadTemplate('getTaskDetail/completed.md');
|
|
364
|
+
return render(template, {
|
|
365
|
+
completedAt: formatDate(task.completedAt),
|
|
366
|
+
completedSummary: task.summary || 'No summary provided'
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// ============================================================================
|
|
371
|
+
// ExecuteTaskPromptBuilder
|
|
372
|
+
// ============================================================================
|
|
373
|
+
export class ExecuteTaskPromptBuilder {
|
|
374
|
+
async build(task, dependencyTasks, complexity, analysisResult) {
|
|
375
|
+
const dependencyTasksTemplate = await this.buildDependencyTasksTemplate(dependencyTasks);
|
|
376
|
+
const complexityTemplate = await this.buildComplexityTemplate(complexity);
|
|
377
|
+
const analysisResultTemplate = this.buildAnalysisResultTemplate(analysisResult);
|
|
378
|
+
const template = await loadTemplate('executeTask/index.md');
|
|
379
|
+
return render(template, {
|
|
380
|
+
id: task.id,
|
|
381
|
+
name: task.name,
|
|
382
|
+
description: task.description,
|
|
383
|
+
dependencyTasksTemplate,
|
|
384
|
+
implementationGuideTemplate: task.implementationGuide || '',
|
|
385
|
+
verificationCriteriaTemplate: task.verificationCriteria || '',
|
|
386
|
+
notesTemplate: task.notes || '',
|
|
387
|
+
relatedFilesSummaryTemplate: this.buildRelatedFilesSection(task.relatedFiles),
|
|
388
|
+
complexityTemplate,
|
|
389
|
+
analysisResultTemplate
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
async buildDependencyTasksTemplate(tasks) {
|
|
393
|
+
if (tasks.length === 0) {
|
|
394
|
+
return '';
|
|
395
|
+
}
|
|
396
|
+
const template = await loadTemplate('executeTask/dependencies.md');
|
|
397
|
+
const list = tasks.map(t => `\`${t.id}\``).join(', ');
|
|
398
|
+
return render(template, { dependencies: list });
|
|
399
|
+
}
|
|
400
|
+
async buildComplexityTemplate(complexity) {
|
|
401
|
+
const levelLabels = {
|
|
402
|
+
LOW: 'low',
|
|
403
|
+
MEDIUM: 'moderate',
|
|
404
|
+
HIGH: 'high',
|
|
405
|
+
VERY_HIGH: 'extremely complex'
|
|
406
|
+
};
|
|
407
|
+
const template = await loadTemplate('executeTask/complexity.md');
|
|
408
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
409
|
+
const level = levelLabels[complexity];
|
|
410
|
+
return render(template, {
|
|
411
|
+
level,
|
|
412
|
+
recommendation: this.getComplexityRecommendation(complexity)
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
getComplexityRecommendation(complexity) {
|
|
416
|
+
if (complexity === 'MEDIUM') {
|
|
417
|
+
return 'TIP: This task has moderate complexity.';
|
|
418
|
+
}
|
|
419
|
+
else if (complexity === 'HIGH') {
|
|
420
|
+
return 'WARNING: This task has high complexity.';
|
|
421
|
+
}
|
|
422
|
+
else if (complexity === 'VERY_HIGH') {
|
|
423
|
+
return 'WARNING: This task is extremely complex.';
|
|
424
|
+
}
|
|
425
|
+
return '';
|
|
426
|
+
}
|
|
427
|
+
buildAnalysisResultTemplate(analysisResult) {
|
|
428
|
+
return analysisResult ? `\n\n## Analysis Background\n\n${analysisResult}\n` : '';
|
|
429
|
+
}
|
|
430
|
+
buildRelatedFilesSection(files) {
|
|
431
|
+
if (files.length === 0) {
|
|
432
|
+
return '';
|
|
433
|
+
}
|
|
434
|
+
return files.map(f => `- \`${f.path}\` (${f.type})`).join('\n');
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// ============================================================================
|
|
438
|
+
// VerifyTaskPromptBuilder
|
|
439
|
+
// ============================================================================
|
|
440
|
+
export class VerifyTaskPromptBuilder {
|
|
441
|
+
async build(task) {
|
|
442
|
+
const template = await loadTemplate('verifyTask/index.md');
|
|
443
|
+
return render(template, {
|
|
444
|
+
taskId: task.id,
|
|
445
|
+
taskName: task.name,
|
|
446
|
+
taskSummary: task.summary || 'No summary provided'
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// ============================================================================
|
|
451
|
+
// UpdateTaskPromptBuilder
|
|
452
|
+
// ============================================================================
|
|
453
|
+
export class UpdateTaskPromptBuilder {
|
|
454
|
+
async buildResult(task, updatedFields) {
|
|
455
|
+
const successDetails = await this.buildSuccessDetails(updatedFields);
|
|
456
|
+
const relatedFilesContent = this.buildRelatedFilesContent(task.relatedFiles);
|
|
457
|
+
const template = await loadTemplate('updateTaskContent/index.md');
|
|
458
|
+
return render(template, {
|
|
459
|
+
taskId: task.id,
|
|
460
|
+
taskName: task.name,
|
|
461
|
+
successDetails,
|
|
462
|
+
relatedFilesContent
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
async buildNotFound(taskId) {
|
|
466
|
+
const template = await loadTemplate('updateTaskContent/notFound.md');
|
|
467
|
+
return render(template, { taskId });
|
|
468
|
+
}
|
|
469
|
+
async buildEmptyUpdate() {
|
|
470
|
+
return await loadTemplate('updateTaskContent/emptyUpdate.md');
|
|
471
|
+
}
|
|
472
|
+
async buildValidation(errors) {
|
|
473
|
+
const template = await loadTemplate('updateTaskContent/validation.md');
|
|
474
|
+
return render(template, { errors: errors.join('\n') });
|
|
475
|
+
}
|
|
476
|
+
async buildSuccessDetails(fields) {
|
|
477
|
+
const template = await loadTemplate('updateTaskContent/successDetails.md');
|
|
478
|
+
const fieldsList = fields.map(f => `- ${f}`).join('\n');
|
|
479
|
+
return render(template, { fields: fieldsList });
|
|
480
|
+
}
|
|
481
|
+
buildRelatedFilesContent(files) {
|
|
482
|
+
if (files.length === 0) {
|
|
483
|
+
return '';
|
|
484
|
+
}
|
|
485
|
+
return '\n\n**Related Files:**\n' +
|
|
486
|
+
files.map(f => `- \`${f.path}\` (${f.type})`).join('\n');
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// ============================================================================
|
|
490
|
+
// DeleteTaskPromptBuilder
|
|
491
|
+
// ============================================================================
|
|
492
|
+
export class DeleteTaskPromptBuilder {
|
|
493
|
+
async buildResult(taskName) {
|
|
494
|
+
const template = await loadTemplate('deleteTask/result.md');
|
|
495
|
+
return render(template, { taskName });
|
|
496
|
+
}
|
|
497
|
+
async buildNotFound(taskId) {
|
|
498
|
+
const template = await loadTemplate('deleteTask/notFound.md');
|
|
499
|
+
return render(template, { taskId });
|
|
500
|
+
}
|
|
501
|
+
async buildCompleted(taskId) {
|
|
502
|
+
const template = await loadTemplate('deleteTask/completed.md');
|
|
503
|
+
return render(template, { taskId });
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// ============================================================================
|
|
507
|
+
// ClearAllTasksPromptBuilder
|
|
508
|
+
// ============================================================================
|
|
509
|
+
export class ClearAllTasksPromptBuilder {
|
|
510
|
+
async buildResult(deletedCount, backupPath) {
|
|
511
|
+
const backupInfo = await this.buildBackupInfo(backupPath);
|
|
512
|
+
const template = await loadTemplate('clearAllTasks/result.md');
|
|
513
|
+
return render(template, {
|
|
514
|
+
count: deletedCount,
|
|
515
|
+
backupInfo
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
async buildEmpty() {
|
|
519
|
+
return await loadTemplate('clearAllTasks/empty.md');
|
|
520
|
+
}
|
|
521
|
+
async buildCancel() {
|
|
522
|
+
return await loadTemplate('clearAllTasks/cancel.md');
|
|
523
|
+
}
|
|
524
|
+
async buildBackupInfo(backupPath) {
|
|
525
|
+
const template = await loadTemplate('clearAllTasks/backupInfo.md');
|
|
526
|
+
return render(template, { backupPath });
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=taskPromptBuilders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskPromptBuilders.js","sourceRoot":"","sources":["../../src/prompts/taskPromptBuilders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight template engine for rendering prompt templates with variable substitution.
|
|
3
|
+
*
|
|
4
|
+
* Design:
|
|
5
|
+
* - Matches the reference prompt rendering behavior
|
|
6
|
+
* - Simple token replacement: {{key}}, {{ key }}, {key}
|
|
7
|
+
* - Logic handled in code, not templates (separation of concerns)
|
|
8
|
+
* - Zero external dependencies
|
|
9
|
+
*
|
|
10
|
+
* @module prompts/templateEngine
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Template parameters - string keys to any values.
|
|
14
|
+
* Values will be converted to string via .toString() or empty string for null/undefined.
|
|
15
|
+
*/
|
|
16
|
+
export type TemplateParameters = Readonly<Record<string, unknown>>;
|
|
17
|
+
/**
|
|
18
|
+
* Renders a template string by replacing tokens with provided parameter values.
|
|
19
|
+
*
|
|
20
|
+
* Supported token formats (case-sensitive):
|
|
21
|
+
* - {{key}} - standard Handlebars/Mustache style
|
|
22
|
+
* - {{ key }} - with spaces
|
|
23
|
+
* - {key} - simple braces (for compatibility)
|
|
24
|
+
*
|
|
25
|
+
* Performance: O(n*m) where n = template length, m = number of parameters.
|
|
26
|
+
* For 1000 renders: ~5-10ms (much faster than Handlebars compilation)
|
|
27
|
+
*
|
|
28
|
+
* @param template - The template string with tokens to replace
|
|
29
|
+
* @param parameters - Key-value pairs for token replacement
|
|
30
|
+
* @returns Rendered template with tokens replaced
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const template = "Hello {{name}}, you have {{count}} messages!";
|
|
35
|
+
* const result = render(template, { name: "Alice", count: 5 });
|
|
36
|
+
* // Returns: "Hello Alice, you have 5 messages!"
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Nested template composition (logic in code, not template)
|
|
42
|
+
* const partial = render("Task: {{taskName}}", { taskName: "Deploy" });
|
|
43
|
+
* const full = render("{{header}}\n{{body}}", { header: "# Tasks", body: partial });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function render(template: string, parameters?: TemplateParameters | null): string;
|
|
47
|
+
/**
|
|
48
|
+
* Template engine for batch rendering multiple templates efficiently.
|
|
49
|
+
* Useful for rendering template partials and composing complex prompts.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const engine = new TemplateEngine();
|
|
54
|
+
* const header = engine.render("# {{title}}", { title: "Tasks" });
|
|
55
|
+
* const body = engine.render("Count: {{count}}", { count: 42 });
|
|
56
|
+
* const full = engine.render("{{header}}\n{{body}}", { header, body });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare class TemplateEngine {
|
|
60
|
+
/**
|
|
61
|
+
* Renders a template with parameters.
|
|
62
|
+
* Convenience method that delegates to the `render` function.
|
|
63
|
+
*
|
|
64
|
+
* @param template - Template string
|
|
65
|
+
* @param parameters - Replacement parameters
|
|
66
|
+
* @returns Rendered result
|
|
67
|
+
*/
|
|
68
|
+
render(template: string, parameters?: TemplateParameters | null): string;
|
|
69
|
+
/**
|
|
70
|
+
* Renders multiple templates in sequence, passing results as parameters.
|
|
71
|
+
* Useful for composing nested templates.
|
|
72
|
+
*
|
|
73
|
+
* @param templates - Array of {template, parameters} objects
|
|
74
|
+
* @returns Array of rendered results
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const engine = new TemplateEngine();
|
|
79
|
+
* const results = engine.renderBatch([
|
|
80
|
+
* { template: "Name: {{name}}", parameters: { name: "Alice" } },
|
|
81
|
+
* { template: "Age: {{age}}", parameters: { age: 30 } }
|
|
82
|
+
* ]);
|
|
83
|
+
* // Returns: ["Name: Alice", "Age: 30"]
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
renderBatch(templates: ReadonlyArray<{
|
|
87
|
+
template: string;
|
|
88
|
+
parameters?: TemplateParameters | null;
|
|
89
|
+
}>): string[];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Default template engine instance for convenience.
|
|
93
|
+
* Use this for simple one-off rendering operations.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* import { defaultEngine } from './templateEngine.js';
|
|
98
|
+
* const result = defaultEngine.render("Hello {{name}}", { name: "World" });
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare const defaultEngine: TemplateEngine;
|
|
102
|
+
//# sourceMappingURL=templateEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateEngine.d.ts","sourceRoot":"","sources":["../../src/prompts/templateEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACrC,MAAM,CAwBR;AAyCD;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,MAAM;IAIxE;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CACT,SAAS,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;KACxC,CAAC,GACD,MAAM,EAAE;CAKZ;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gBAAuB,CAAC"}
|