@sudosandwich/limps 0.2.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/LICENSE +21 -0
- package/README.md +190 -0
- package/dist/agent-parser.d.ts +146 -0
- package/dist/agent-parser.d.ts.map +1 -0
- package/dist/agent-parser.js +448 -0
- package/dist/agent-parser.js.map +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +146 -0
- package/dist/config.js.map +1 -0
- package/dist/coordination.d.ts +102 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +157 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +256 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +83 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +467 -0
- package/dist/indexer.js.map +1 -0
- package/dist/resources/agents-status.d.ts +32 -0
- package/dist/resources/agents-status.d.ts.map +1 -0
- package/dist/resources/agents-status.js +73 -0
- package/dist/resources/agents-status.js.map +1 -0
- package/dist/resources/decisions-log.d.ts +21 -0
- package/dist/resources/decisions-log.d.ts.map +1 -0
- package/dist/resources/decisions-log.js +146 -0
- package/dist/resources/decisions-log.js.map +1 -0
- package/dist/resources/index.d.ts +10 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +74 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/plans-full.d.ts +11 -0
- package/dist/resources/plans-full.d.ts.map +1 -0
- package/dist/resources/plans-full.js +71 -0
- package/dist/resources/plans-full.js.map +1 -0
- package/dist/resources/plans-index.d.ts +30 -0
- package/dist/resources/plans-index.d.ts.map +1 -0
- package/dist/resources/plans-index.js +177 -0
- package/dist/resources/plans-index.js.map +1 -0
- package/dist/resources/plans-summary.d.ts +33 -0
- package/dist/resources/plans-summary.d.ts.map +1 -0
- package/dist/resources/plans-summary.js +238 -0
- package/dist/resources/plans-summary.js.map +1 -0
- package/dist/rlm/extractors.d.ts +39 -0
- package/dist/rlm/extractors.d.ts.map +1 -0
- package/dist/rlm/extractors.js +291 -0
- package/dist/rlm/extractors.js.map +1 -0
- package/dist/rlm/helpers-inject.d.ts +13 -0
- package/dist/rlm/helpers-inject.d.ts.map +1 -0
- package/dist/rlm/helpers-inject.js +586 -0
- package/dist/rlm/helpers-inject.js.map +1 -0
- package/dist/rlm/helpers.d.ts +124 -0
- package/dist/rlm/helpers.d.ts.map +1 -0
- package/dist/rlm/helpers.js +381 -0
- package/dist/rlm/helpers.js.map +1 -0
- package/dist/rlm/index.d.ts +12 -0
- package/dist/rlm/index.d.ts.map +1 -0
- package/dist/rlm/index.js +19 -0
- package/dist/rlm/index.js.map +1 -0
- package/dist/rlm/parallel.d.ts +45 -0
- package/dist/rlm/parallel.d.ts.map +1 -0
- package/dist/rlm/parallel.js +76 -0
- package/dist/rlm/parallel.js.map +1 -0
- package/dist/rlm/recursion.d.ts +96 -0
- package/dist/rlm/recursion.d.ts.map +1 -0
- package/dist/rlm/recursion.js +113 -0
- package/dist/rlm/recursion.js.map +1 -0
- package/dist/rlm/sampling.d.ts +100 -0
- package/dist/rlm/sampling.d.ts.map +1 -0
- package/dist/rlm/sampling.js +96 -0
- package/dist/rlm/sampling.js.map +1 -0
- package/dist/rlm/sandbox.d.ts +73 -0
- package/dist/rlm/sandbox.d.ts.map +1 -0
- package/dist/rlm/sandbox.js +160 -0
- package/dist/rlm/sandbox.js.map +1 -0
- package/dist/rlm/security.d.ts +28 -0
- package/dist/rlm/security.d.ts.map +1 -0
- package/dist/rlm/security.js +154 -0
- package/dist/rlm/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +107 -0
- package/dist/server.js.map +1 -0
- package/dist/task-parser.d.ts +47 -0
- package/dist/task-parser.d.ts.map +1 -0
- package/dist/task-parser.js +112 -0
- package/dist/task-parser.js.map +1 -0
- package/dist/test-setup.d.ts +6 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +37 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tools/claim-task.d.ts +28 -0
- package/dist/tools/claim-task.d.ts.map +1 -0
- package/dist/tools/claim-task.js +288 -0
- package/dist/tools/claim-task.js.map +1 -0
- package/dist/tools/create-doc.d.ts +47 -0
- package/dist/tools/create-doc.d.ts.map +1 -0
- package/dist/tools/create-doc.js +137 -0
- package/dist/tools/create-doc.js.map +1 -0
- package/dist/tools/create-plan.d.ts +25 -0
- package/dist/tools/create-plan.d.ts.map +1 -0
- package/dist/tools/create-plan.js +179 -0
- package/dist/tools/create-plan.js.map +1 -0
- package/dist/tools/delete-doc.d.ts +51 -0
- package/dist/tools/delete-doc.d.ts.map +1 -0
- package/dist/tools/delete-doc.js +194 -0
- package/dist/tools/delete-doc.js.map +1 -0
- package/dist/tools/get-next-task.d.ts +49 -0
- package/dist/tools/get-next-task.d.ts.map +1 -0
- package/dist/tools/get-next-task.js +204 -0
- package/dist/tools/get-next-task.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +122 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-docs.d.ts +53 -0
- package/dist/tools/list-docs.d.ts.map +1 -0
- package/dist/tools/list-docs.js +236 -0
- package/dist/tools/list-docs.js.map +1 -0
- package/dist/tools/open-document-in-cursor.d.ts +62 -0
- package/dist/tools/open-document-in-cursor.d.ts.map +1 -0
- package/dist/tools/open-document-in-cursor.js +211 -0
- package/dist/tools/open-document-in-cursor.js.map +1 -0
- package/dist/tools/read-doc.d.ts +44 -0
- package/dist/tools/read-doc.d.ts.map +1 -0
- package/dist/tools/read-doc.js +174 -0
- package/dist/tools/read-doc.js.map +1 -0
- package/dist/tools/release-task.d.ts +28 -0
- package/dist/tools/release-task.d.ts.map +1 -0
- package/dist/tools/release-task.js +154 -0
- package/dist/tools/release-task.js.map +1 -0
- package/dist/tools/rlm-multi-query.d.ts +110 -0
- package/dist/tools/rlm-multi-query.d.ts.map +1 -0
- package/dist/tools/rlm-multi-query.js +348 -0
- package/dist/tools/rlm-multi-query.js.map +1 -0
- package/dist/tools/rlm-query.d.ts +56 -0
- package/dist/tools/rlm-query.d.ts.map +1 -0
- package/dist/tools/rlm-query.js +228 -0
- package/dist/tools/rlm-query.js.map +1 -0
- package/dist/tools/search-docs.d.ts +34 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +292 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/tools/update-doc.d.ts +149 -0
- package/dist/tools/update-doc.d.ts.map +1 -0
- package/dist/tools/update-doc.js +195 -0
- package/dist/tools/update-doc.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +31 -0
- package/dist/tools/update-task-status.d.ts.map +1 -0
- package/dist/tools/update-task-status.js +303 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/backup.d.ts +76 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +172 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/errors.d.ts +93 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +125 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/os-paths.d.ts +45 -0
- package/dist/utils/os-paths.d.ts.map +1 -0
- package/dist/utils/os-paths.js +81 -0
- package/dist/utils/os-paths.js.map +1 -0
- package/dist/utils/paths.d.ts +71 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +165 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/watcher.d.ts +19 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +109 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readCoordination } from '../coordination.js';
|
|
3
|
+
import { extractPlanId, parseTasksFromDocument } from '../task-parser.js';
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for get_next_task tool.
|
|
6
|
+
*/
|
|
7
|
+
export const GetNextTaskInputSchema = z.object({
|
|
8
|
+
agentType: z.enum(['coder', 'reviewer', 'pm', 'customer']),
|
|
9
|
+
excludeIds: z.array(z.string()).optional(),
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Resolve dependency to task ID.
|
|
13
|
+
* Handles both feature numbers (#1) and full task IDs (0008#1).
|
|
14
|
+
*/
|
|
15
|
+
function resolveDependency(dep, planId) {
|
|
16
|
+
// If it's already a full task ID (format: planId#featureNumber), return it
|
|
17
|
+
// A full task ID has at least one character before the #
|
|
18
|
+
const fullTaskIdMatch = dep.match(/^([^#]+)#(\d+)$/);
|
|
19
|
+
if (fullTaskIdMatch) {
|
|
20
|
+
return dep;
|
|
21
|
+
}
|
|
22
|
+
// If it's a feature number like #1, resolve to task ID
|
|
23
|
+
const featureMatch = dep.match(/#(\d+)/);
|
|
24
|
+
if (featureMatch) {
|
|
25
|
+
const featureNum = featureMatch[1];
|
|
26
|
+
const taskId = `${planId}#${featureNum}`;
|
|
27
|
+
return taskId;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if all dependencies are satisfied (status is PASS).
|
|
33
|
+
*/
|
|
34
|
+
function areDependenciesSatisfied(task, coordination) {
|
|
35
|
+
if (task.dependencies.length === 0) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
for (const dep of task.dependencies) {
|
|
39
|
+
const taskId = resolveDependency(dep, task.planId);
|
|
40
|
+
if (!taskId) {
|
|
41
|
+
// Dependency not found - consider unsatisfied
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const depTask = coordination.tasks[taskId];
|
|
45
|
+
if (!depTask || depTask.status !== 'PASS') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if any files are locked by other agents.
|
|
53
|
+
*/
|
|
54
|
+
function hasFileConflicts(task, coordination) {
|
|
55
|
+
for (const file of task.files) {
|
|
56
|
+
const lockedBy = coordination.fileLocks[file];
|
|
57
|
+
if (lockedBy) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Score a task based on dependencies, agent match, and file conflicts.
|
|
65
|
+
*
|
|
66
|
+
* @param task - Task to score
|
|
67
|
+
* @param agentType - Requested agent persona type
|
|
68
|
+
* @param coordination - Coordination state
|
|
69
|
+
* @returns Task score with reasons
|
|
70
|
+
*/
|
|
71
|
+
export function scoreTask(task, agentType, coordination) {
|
|
72
|
+
const reasons = [];
|
|
73
|
+
let score = 100; // Base score
|
|
74
|
+
// Only GAP tasks are eligible
|
|
75
|
+
if (task.status !== 'GAP') {
|
|
76
|
+
return {
|
|
77
|
+
taskId: task.id,
|
|
78
|
+
score: -1000,
|
|
79
|
+
reasons: [`Task status is ${task.status}, not GAP`],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Check dependencies
|
|
83
|
+
if (!areDependenciesSatisfied(task, coordination)) {
|
|
84
|
+
return {
|
|
85
|
+
taskId: task.id,
|
|
86
|
+
score: -1000,
|
|
87
|
+
reasons: ['Not all dependencies are satisfied (PASS)'],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Bonus for satisfied dependencies
|
|
91
|
+
if (task.dependencies.length > 0) {
|
|
92
|
+
score += 50;
|
|
93
|
+
reasons.push('All dependencies satisfied');
|
|
94
|
+
}
|
|
95
|
+
// Check agent persona match
|
|
96
|
+
if (task.agentPersona === agentType) {
|
|
97
|
+
score += 100;
|
|
98
|
+
reasons.push(`Agent persona matches (${agentType})`);
|
|
99
|
+
}
|
|
100
|
+
// Check file conflicts
|
|
101
|
+
if (hasFileConflicts(task, coordination)) {
|
|
102
|
+
return {
|
|
103
|
+
taskId: task.id,
|
|
104
|
+
score: -1000,
|
|
105
|
+
reasons: ['One or more files are locked by another agent'],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
taskId: task.id,
|
|
110
|
+
score,
|
|
111
|
+
reasons: reasons.length > 0 ? reasons : ['Base score'],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Handle get_next_task tool request.
|
|
116
|
+
* Returns the highest-priority available task based on scoring algorithm.
|
|
117
|
+
*
|
|
118
|
+
* @param input - Tool input
|
|
119
|
+
* @param context - Tool context
|
|
120
|
+
* @returns Tool result
|
|
121
|
+
*/
|
|
122
|
+
export async function handleGetNextTask(input, context) {
|
|
123
|
+
const { agentType, excludeIds = [] } = input;
|
|
124
|
+
// Read fresh coordination state (will be used in scoring)
|
|
125
|
+
const coordination = await readCoordination(context.config.coordinationPath);
|
|
126
|
+
// Query database for all planning documents
|
|
127
|
+
const plansPath = context.config.plansPath;
|
|
128
|
+
const documents = context.db
|
|
129
|
+
.prepare(`
|
|
130
|
+
SELECT path, content
|
|
131
|
+
FROM documents
|
|
132
|
+
WHERE path LIKE ?
|
|
133
|
+
`)
|
|
134
|
+
.all(`${plansPath}%`);
|
|
135
|
+
// Parse all tasks from documents
|
|
136
|
+
const allTasks = [];
|
|
137
|
+
for (const doc of documents) {
|
|
138
|
+
const planId = extractPlanId(doc.path);
|
|
139
|
+
if (!planId) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const tasks = parseTasksFromDocument(doc.path, doc.content, planId);
|
|
143
|
+
allTasks.push(...tasks);
|
|
144
|
+
}
|
|
145
|
+
// Filter and score tasks
|
|
146
|
+
const scoredTasks = [];
|
|
147
|
+
for (const task of allTasks) {
|
|
148
|
+
// Skip excluded tasks
|
|
149
|
+
if (excludeIds.includes(task.id)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// Score the task
|
|
153
|
+
const score = scoreTask(task, agentType, coordination);
|
|
154
|
+
// Only include eligible tasks (score >= 0)
|
|
155
|
+
if (score.score >= 0) {
|
|
156
|
+
scoredTasks.push(score);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Sort by score (descending), then by planId (ascending), then by featureNumber (ascending)
|
|
160
|
+
scoredTasks.sort((a, b) => {
|
|
161
|
+
if (a.score !== b.score) {
|
|
162
|
+
return b.score - a.score; // Higher score first
|
|
163
|
+
}
|
|
164
|
+
// Tie-breaker: sort by task ID (planId#featureNumber)
|
|
165
|
+
const aParts = a.taskId.split('#');
|
|
166
|
+
const bParts = b.taskId.split('#');
|
|
167
|
+
const aPlanId = aParts[0];
|
|
168
|
+
const bPlanId = bParts[0];
|
|
169
|
+
if (aPlanId !== bPlanId) {
|
|
170
|
+
return aPlanId.localeCompare(bPlanId); // Lower planId first
|
|
171
|
+
}
|
|
172
|
+
const aFeature = parseInt(aParts[1] || '0', 10);
|
|
173
|
+
const bFeature = parseInt(bParts[1] || '0', 10);
|
|
174
|
+
return aFeature - bFeature; // Lower feature number first
|
|
175
|
+
});
|
|
176
|
+
// Return highest-scoring task
|
|
177
|
+
if (scoredTasks.length === 0) {
|
|
178
|
+
return {
|
|
179
|
+
content: [
|
|
180
|
+
{
|
|
181
|
+
type: 'text',
|
|
182
|
+
text: JSON.stringify({
|
|
183
|
+
taskId: null,
|
|
184
|
+
message: 'No available tasks found',
|
|
185
|
+
}, null, 2),
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const topTask = scoredTasks[0];
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{
|
|
194
|
+
type: 'text',
|
|
195
|
+
text: JSON.stringify({
|
|
196
|
+
taskId: topTask.taskId,
|
|
197
|
+
score: topTask.score,
|
|
198
|
+
reasons: topTask.reasons,
|
|
199
|
+
}, null, 2),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=get-next-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-next-task.js","sourceRoot":"","sources":["../../src/tools/get-next-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ToolContext } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register all MCP tools with the server.
|
|
5
|
+
*
|
|
6
|
+
* @param server - MCP server instance
|
|
7
|
+
* @param context - Tool context with db, config, and coordination
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerTools(server: McpServer, context: ToolContext): void;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAoL3E"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Import all tool schemas and handlers
|
|
2
|
+
import { CreatePlanInputSchema, handleCreatePlan } from './create-plan.js';
|
|
3
|
+
import { UpdateTaskStatusInputSchema, handleUpdateTaskStatus } from './update-task-status.js';
|
|
4
|
+
import { ClaimTaskInputSchema, handleClaimTask } from './claim-task.js';
|
|
5
|
+
import { ReleaseTaskInputSchema, handleReleaseTask } from './release-task.js';
|
|
6
|
+
import { GetNextTaskInputSchema, handleGetNextTask } from './get-next-task.js';
|
|
7
|
+
import { SearchDocsInputSchema, handleSearchDocs } from './search-docs.js';
|
|
8
|
+
import { ReadDocInputSchema, handleReadDoc } from './read-doc.js';
|
|
9
|
+
import { ListDocsInputSchema, handleListDocs } from './list-docs.js';
|
|
10
|
+
import { CreateDocInputSchema, handleCreateDoc } from './create-doc.js';
|
|
11
|
+
import { UpdateDocInputSchema, UpdateDocInputBaseSchema, handleUpdateDoc } from './update-doc.js';
|
|
12
|
+
import { DeleteDocInputSchema, handleDeleteDoc } from './delete-doc.js';
|
|
13
|
+
import { OpenDocumentInputSchema, handleOpenDocumentInCursor } from './open-document-in-cursor.js';
|
|
14
|
+
import { RlmQueryInputSchema, handleRlmQuery } from './rlm-query.js';
|
|
15
|
+
import { RlmMultiQueryInputBaseSchema, RlmMultiQueryInputSchema, handleRlmMultiQuery, } from './rlm-multi-query.js';
|
|
16
|
+
/**
|
|
17
|
+
* Register all MCP tools with the server.
|
|
18
|
+
*
|
|
19
|
+
* @param server - MCP server instance
|
|
20
|
+
* @param context - Tool context with db, config, and coordination
|
|
21
|
+
*/
|
|
22
|
+
export function registerTools(server, context) {
|
|
23
|
+
// Plan Management Tools
|
|
24
|
+
server.tool('create_plan', 'Create a new feature plan with directory structure and agent files', CreatePlanInputSchema.shape, async (input) => {
|
|
25
|
+
const parsed = CreatePlanInputSchema.parse(input);
|
|
26
|
+
return handleCreatePlan(parsed, context);
|
|
27
|
+
});
|
|
28
|
+
server.tool('update_task_status', 'Update task status (GAP → WIP → PASS/BLOCKED)', UpdateTaskStatusInputSchema.shape, async (input) => {
|
|
29
|
+
const parsed = UpdateTaskStatusInputSchema.parse(input);
|
|
30
|
+
return handleUpdateTaskStatus(parsed, context);
|
|
31
|
+
});
|
|
32
|
+
// Task Coordination Tools
|
|
33
|
+
server.tool('claim_task', 'Claim a task for an agent with file locks', ClaimTaskInputSchema.shape, async (input) => {
|
|
34
|
+
const parsed = ClaimTaskInputSchema.parse(input);
|
|
35
|
+
return handleClaimTask(parsed, context);
|
|
36
|
+
});
|
|
37
|
+
server.tool('release_task', 'Release a claimed task and file locks', ReleaseTaskInputSchema.shape, async (input) => {
|
|
38
|
+
const parsed = ReleaseTaskInputSchema.parse(input);
|
|
39
|
+
return handleReleaseTask(parsed, context);
|
|
40
|
+
});
|
|
41
|
+
// Task Selection Tools
|
|
42
|
+
server.tool('get_next_task', 'Get highest-priority available task based on dependencies and agent type', GetNextTaskInputSchema.shape, async (input) => {
|
|
43
|
+
const parsed = GetNextTaskInputSchema.parse(input);
|
|
44
|
+
return handleGetNextTask(parsed, context);
|
|
45
|
+
});
|
|
46
|
+
// Search Tools
|
|
47
|
+
server.tool('search_docs', 'Full-text search across planning documents', SearchDocsInputSchema.shape, async (input) => {
|
|
48
|
+
const parsed = SearchDocsInputSchema.parse(input);
|
|
49
|
+
return handleSearchDocs(parsed, context);
|
|
50
|
+
});
|
|
51
|
+
// Document CRUD Tools
|
|
52
|
+
server.tool('read_doc', 'Read full content of a document in the repository', ReadDocInputSchema.shape, async (input) => {
|
|
53
|
+
const parsed = ReadDocInputSchema.parse(input);
|
|
54
|
+
return handleReadDoc(parsed, context);
|
|
55
|
+
});
|
|
56
|
+
server.tool('list_docs', 'List files and directories in the repository', ListDocsInputSchema.shape, async (input) => {
|
|
57
|
+
const parsed = ListDocsInputSchema.parse(input);
|
|
58
|
+
return handleListDocs(parsed, context);
|
|
59
|
+
});
|
|
60
|
+
server.tool('create_doc', 'Create a new document in the repository', CreateDocInputSchema.shape, async (input) => {
|
|
61
|
+
const parsed = CreateDocInputSchema.parse(input);
|
|
62
|
+
return handleCreateDoc(parsed, context);
|
|
63
|
+
});
|
|
64
|
+
server.tool('update_doc', 'Update an existing document in the repository', UpdateDocInputBaseSchema.shape, async (input) => {
|
|
65
|
+
const parsed = UpdateDocInputSchema.parse(input);
|
|
66
|
+
return handleUpdateDoc(parsed, context);
|
|
67
|
+
});
|
|
68
|
+
server.tool('delete_doc', 'Delete a document from the repository', DeleteDocInputSchema.shape, async (input) => {
|
|
69
|
+
const parsed = DeleteDocInputSchema.parse(input);
|
|
70
|
+
return handleDeleteDoc(parsed, context);
|
|
71
|
+
});
|
|
72
|
+
// Cursor Integration Tools
|
|
73
|
+
server.registerTool('open_document_in_cursor', {
|
|
74
|
+
description: 'Open a file in Cursor editor at an optional line/column position',
|
|
75
|
+
inputSchema: OpenDocumentInputSchema.shape,
|
|
76
|
+
}, async (input) => {
|
|
77
|
+
const parsed = OpenDocumentInputSchema.parse(input);
|
|
78
|
+
return handleOpenDocumentInCursor(parsed, context);
|
|
79
|
+
});
|
|
80
|
+
// RLM Query Tools
|
|
81
|
+
server.tool('rlm_query', `Execute JavaScript code on a single document for filtered extraction.
|
|
82
|
+
|
|
83
|
+
Available helpers: extractSections(), extractFrontmatter(), extractCodeBlocks(),
|
|
84
|
+
extractFeatures(), extractAgents(), findByPattern(), summarize()
|
|
85
|
+
|
|
86
|
+
Example:
|
|
87
|
+
path: "plans/0009/plan.md"
|
|
88
|
+
code: "extractFeatures(doc.content).filter(f => f.status === 'GAP')"`, RlmQueryInputSchema.shape, async (input) => {
|
|
89
|
+
const parsed = RlmQueryInputSchema.parse(input);
|
|
90
|
+
return handleRlmQuery(parsed, context);
|
|
91
|
+
});
|
|
92
|
+
server.tool('rlm_multi_query', `Execute JavaScript code on multiple documents for cross-document analysis.
|
|
93
|
+
|
|
94
|
+
Available helpers: extractSections(), extractFrontmatter(), extractCodeBlocks(),
|
|
95
|
+
extractFeatures(), extractAgents(), findByPattern(), summarize()
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
pattern: "plans/*/plan.md"
|
|
99
|
+
code: "docs.map(d => ({ name: extractFrontmatter(d.content).meta.name, features: extractFeatures(d.content).length }))"`, RlmMultiQueryInputBaseSchema.shape, async (input) => {
|
|
100
|
+
try {
|
|
101
|
+
const parsed = RlmMultiQueryInputSchema.parse(input);
|
|
102
|
+
return handleRlmMultiQuery(parsed, context);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
// Handle Zod validation errors
|
|
106
|
+
if (error && typeof error === 'object' && 'issues' in error) {
|
|
107
|
+
const zodError = error;
|
|
108
|
+
return {
|
|
109
|
+
content: [
|
|
110
|
+
{
|
|
111
|
+
type: 'text',
|
|
112
|
+
text: `Validation error: ${zodError.issues.map((i) => i.message).join(', ')}`,
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
isError: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_docs tool: List files and directories with optional filtering.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { ToolContext, ToolResult } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Input schema for list_docs tool.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ListDocsInputSchema: z.ZodObject<{
|
|
10
|
+
path: z.ZodDefault<z.ZodString>;
|
|
11
|
+
pattern: z.ZodOptional<z.ZodString>;
|
|
12
|
+
depth: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
includeHidden: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
path: string;
|
|
16
|
+
depth: number;
|
|
17
|
+
includeHidden: boolean;
|
|
18
|
+
pattern?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
path?: string | undefined;
|
|
21
|
+
pattern?: string | undefined;
|
|
22
|
+
depth?: number | undefined;
|
|
23
|
+
includeHidden?: boolean | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type ListDocsInput = z.infer<typeof ListDocsInputSchema>;
|
|
26
|
+
/**
|
|
27
|
+
* Directory entry interface.
|
|
28
|
+
*/
|
|
29
|
+
export interface DirEntry {
|
|
30
|
+
name: string;
|
|
31
|
+
type: 'file' | 'directory';
|
|
32
|
+
size?: number;
|
|
33
|
+
children?: number;
|
|
34
|
+
modified?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Output interface for list_docs tool.
|
|
38
|
+
*/
|
|
39
|
+
export interface ListDocsOutput {
|
|
40
|
+
path: string;
|
|
41
|
+
entries: DirEntry[];
|
|
42
|
+
total: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Handle list_docs tool request.
|
|
46
|
+
* Lists directory contents with optional filtering.
|
|
47
|
+
*
|
|
48
|
+
* @param input - Tool input
|
|
49
|
+
* @param context - Tool context
|
|
50
|
+
* @returns Tool result
|
|
51
|
+
*/
|
|
52
|
+
export declare function handleListDocs(input: ListDocsInput, context: ToolContext): Promise<ToolResult>;
|
|
53
|
+
//# sourceMappingURL=list-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-docs.d.ts","sourceRoot":"","sources":["../../src/tools/list-docs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAiID;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA8GrB"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_docs tool: List files and directories with optional filtering.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { readdir, lstat } from 'fs/promises';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import micromatch from 'micromatch';
|
|
9
|
+
import { validatePath } from '../utils/paths.js';
|
|
10
|
+
import { notFound } from '../utils/errors.js';
|
|
11
|
+
/**
|
|
12
|
+
* Input schema for list_docs tool.
|
|
13
|
+
*/
|
|
14
|
+
export const ListDocsInputSchema = z.object({
|
|
15
|
+
path: z.string().default('').describe('Directory path relative to repo root'),
|
|
16
|
+
pattern: z.string().optional().describe('Glob pattern, e.g., "*.md"'),
|
|
17
|
+
depth: z.number().int().min(1).max(5).default(2).describe('Max directory depth'),
|
|
18
|
+
includeHidden: z.boolean().default(false).describe('Include hidden files'),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Get repository root from config.
|
|
22
|
+
* Uses the first docsPath entry as the repo root, or derives from plansPath.
|
|
23
|
+
*/
|
|
24
|
+
function getRepoRoot(config) {
|
|
25
|
+
// Prefer docsPaths[0] if it exists (it's the repo root)
|
|
26
|
+
if (config.docsPaths && config.docsPaths.length > 0) {
|
|
27
|
+
return config.docsPaths[0];
|
|
28
|
+
}
|
|
29
|
+
// Fallback: use plansPath parent directory
|
|
30
|
+
return dirname(config.plansPath);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a name matches a glob pattern.
|
|
34
|
+
*/
|
|
35
|
+
function matchesPattern(name, pattern) {
|
|
36
|
+
return micromatch.isMatch(name, pattern);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Recursively list directory entries with depth control.
|
|
40
|
+
*/
|
|
41
|
+
async function listDirectoryRecursive(dirPath, repoRoot, relativePath, options) {
|
|
42
|
+
const entries = [];
|
|
43
|
+
// Check if directory exists
|
|
44
|
+
if (!existsSync(dirPath)) {
|
|
45
|
+
return entries;
|
|
46
|
+
}
|
|
47
|
+
// Read directory entries
|
|
48
|
+
const dirents = await readdir(dirPath, { withFileTypes: true });
|
|
49
|
+
// Sort: directories first, then alphabetical
|
|
50
|
+
dirents.sort((a, b) => {
|
|
51
|
+
if (a.isDirectory() && !b.isDirectory()) {
|
|
52
|
+
return -1;
|
|
53
|
+
}
|
|
54
|
+
if (!a.isDirectory() && b.isDirectory()) {
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
return a.name.localeCompare(b.name);
|
|
58
|
+
});
|
|
59
|
+
for (const dirent of dirents) {
|
|
60
|
+
// Skip hidden files unless included
|
|
61
|
+
if (!options.includeHidden && dirent.name.startsWith('.')) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Apply pattern filter if specified
|
|
65
|
+
if (options.pattern && !matchesPattern(dirent.name, options.pattern)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const entryPath = join(dirPath, dirent.name);
|
|
69
|
+
const entryRelativePath = relativePath ? join(relativePath, dirent.name) : dirent.name;
|
|
70
|
+
if (dirent.isDirectory()) {
|
|
71
|
+
// Get directory stats
|
|
72
|
+
const stats = await lstat(entryPath);
|
|
73
|
+
// Count children if within depth limit
|
|
74
|
+
let children;
|
|
75
|
+
if (options.currentDepth < options.maxDepth) {
|
|
76
|
+
try {
|
|
77
|
+
const childEntries = await readdir(entryPath);
|
|
78
|
+
children = childEntries.length;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// If we can't read children, don't include count
|
|
82
|
+
children = undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// At max depth, summarize as "[N items]"
|
|
87
|
+
try {
|
|
88
|
+
const childEntries = await readdir(entryPath);
|
|
89
|
+
children = childEntries.length;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
children = undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
entries.push({
|
|
96
|
+
name: dirent.name,
|
|
97
|
+
type: 'directory',
|
|
98
|
+
children,
|
|
99
|
+
modified: stats.mtime.toISOString(),
|
|
100
|
+
});
|
|
101
|
+
// Recurse if within depth limit
|
|
102
|
+
if (options.currentDepth < options.maxDepth) {
|
|
103
|
+
const nestedEntries = await listDirectoryRecursive(entryPath, repoRoot, entryRelativePath, {
|
|
104
|
+
...options,
|
|
105
|
+
currentDepth: options.currentDepth + 1,
|
|
106
|
+
});
|
|
107
|
+
// Add nested entries with indentation or prefix
|
|
108
|
+
// For now, we'll flatten them but could add a prefix
|
|
109
|
+
entries.push(...nestedEntries);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// File entry
|
|
114
|
+
const stats = await lstat(entryPath);
|
|
115
|
+
entries.push({
|
|
116
|
+
name: dirent.name,
|
|
117
|
+
type: 'file',
|
|
118
|
+
size: stats.size,
|
|
119
|
+
modified: stats.mtime.toISOString(),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return entries;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Handle list_docs tool request.
|
|
127
|
+
* Lists directory contents with optional filtering.
|
|
128
|
+
*
|
|
129
|
+
* @param input - Tool input
|
|
130
|
+
* @param context - Tool context
|
|
131
|
+
* @returns Tool result
|
|
132
|
+
*/
|
|
133
|
+
export async function handleListDocs(input, context) {
|
|
134
|
+
const { path, pattern, depth = 2, includeHidden = false } = input;
|
|
135
|
+
const { config } = context;
|
|
136
|
+
try {
|
|
137
|
+
// Get repo root
|
|
138
|
+
const repoRoot = getRepoRoot(config);
|
|
139
|
+
// Validate path (for directory, we allow empty string for root)
|
|
140
|
+
const dirPath = path || '';
|
|
141
|
+
let validated;
|
|
142
|
+
if (!dirPath) {
|
|
143
|
+
// Empty path means repo root
|
|
144
|
+
validated = {
|
|
145
|
+
relative: '',
|
|
146
|
+
absolute: repoRoot,
|
|
147
|
+
type: 'other',
|
|
148
|
+
directory: '',
|
|
149
|
+
filename: '',
|
|
150
|
+
extension: '',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
validated = validatePath(dirPath, repoRoot);
|
|
155
|
+
}
|
|
156
|
+
// Check if path exists and is a directory
|
|
157
|
+
const targetPath = validated.absolute;
|
|
158
|
+
if (!existsSync(targetPath)) {
|
|
159
|
+
throw notFound(path || '');
|
|
160
|
+
}
|
|
161
|
+
const stats = await lstat(targetPath);
|
|
162
|
+
if (!stats.isDirectory()) {
|
|
163
|
+
return {
|
|
164
|
+
content: [
|
|
165
|
+
{
|
|
166
|
+
type: 'text',
|
|
167
|
+
text: `Error: Path "${path || ''}" is not a directory`,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
isError: true,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// List directory entries
|
|
174
|
+
const entries = await listDirectoryRecursive(targetPath, repoRoot, validated.relative, {
|
|
175
|
+
pattern,
|
|
176
|
+
maxDepth: depth,
|
|
177
|
+
currentDepth: 0,
|
|
178
|
+
includeHidden,
|
|
179
|
+
});
|
|
180
|
+
// Format output
|
|
181
|
+
const output = {
|
|
182
|
+
path: validated.relative || '',
|
|
183
|
+
entries,
|
|
184
|
+
total: entries.length,
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
content: [
|
|
188
|
+
{
|
|
189
|
+
type: 'text',
|
|
190
|
+
text: JSON.stringify(output, null, 2),
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
// Handle DocumentError
|
|
197
|
+
if (error instanceof Error && 'code' in error) {
|
|
198
|
+
const docError = error;
|
|
199
|
+
return {
|
|
200
|
+
content: [
|
|
201
|
+
{
|
|
202
|
+
type: 'text',
|
|
203
|
+
text: `Error: ${docError.message}${docError.path ? ` (path: ${docError.path})` : ''}`,
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
isError: true,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Handle file system errors
|
|
210
|
+
if (error instanceof Error) {
|
|
211
|
+
// Check for ENOENT (directory not found)
|
|
212
|
+
if ('code' in error && error.code === 'ENOENT') {
|
|
213
|
+
throw notFound(path || '');
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
content: [
|
|
217
|
+
{
|
|
218
|
+
type: 'text',
|
|
219
|
+
text: `Error listing directory: ${error.message}`,
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
isError: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
content: [
|
|
227
|
+
{
|
|
228
|
+
type: 'text',
|
|
229
|
+
text: `Unknown error: ${String(error)}`,
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
isError: true,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=list-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-docs.js","sourceRoot":"","sources":["../../src/tools/list-docs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC7E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAChF,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CAC3E,CAAC,CAAC;AAwBH;;;GAGG;AACH,SAAS,WAAW,CAAC,MAA6B;IAChD,wDAAwD;IACxD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,2CAA2C;IAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,OAAe,EACf,QAAgB,EAChB,YAAoB,EACpB,OAKC;IAED,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,4BAA4B;IAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,6CAA6C;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,oCAAoC;QACpC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,oCAAoC;QACpC,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrE,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAEvF,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,sBAAsB;YACtB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YAErC,uCAAuC;YACvC,IAAI,QAA4B,CAAC;YACjC,IAAI,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC9C,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,iDAAiD;oBACjD,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,yCAAyC;gBACzC,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC9C,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,WAAW;gBACjB,QAAQ;gBACR,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,gCAAgC;YAChC,IAAI,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5C,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE;oBACzF,GAAG,OAAO;oBACV,YAAY,EAAE,OAAO,CAAC,YAAY,GAAG,CAAC;iBACvC,CAAC,CAAC;gBAEH,gDAAgD;gBAChD,qDAAqD;gBACrD,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;YACb,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YAErC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAoB,EACpB,OAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,aAAa,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAErC,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,6BAA6B;YAC7B,SAAS,GAAG;gBACV,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,OAAgB;gBACtB,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,0CAA0C;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,IAAI,IAAI,EAAE,sBAAsB;qBACvD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE;YACrF,OAAO;YACP,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,CAAC;YACf,aAAa;SACd,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;YAC9B,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uBAAuB;QACvB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,KAAyD,CAAC;YAC3E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;qBACtF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,yCAAyC;YACzC,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,MAAM,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,KAAK,CAAC,OAAO,EAAE;qBAClD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kBAAkB,MAAM,CAAC,KAAK,CAAC,EAAE;iBACxC;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|