agent-orchestration 0.5.0 → 0.6.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/.cursor/rules/orchestrator-auto.mdc +2 -0
- package/.cursor/rules/orchestrator-main.mdc +37 -7
- package/.cursor/rules/orchestrator-sub.mdc +89 -27
- package/README.md +278 -66
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +54 -157
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cursorCommands.d.ts +3 -0
- package/dist/bin/cursorCommands.d.ts.map +1 -0
- package/dist/bin/cursorCommands.js +330 -0
- package/dist/bin/cursorCommands.js.map +1 -0
- package/dist/database.d.ts +32 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +105 -5
- package/dist/database.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +59 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +69 -0
- package/dist/models.js.map +1 -1
- package/dist/providers/cursor.d.ts +14 -0
- package/dist/providers/cursor.d.ts.map +1 -0
- package/dist/providers/cursor.js +203 -0
- package/dist/providers/cursor.js.map +1 -0
- package/dist/providers/types.d.ts +60 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +5 -0
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/coordination.d.ts.map +1 -1
- package/dist/tools/coordination.js +47 -0
- package/dist/tools/coordination.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/memory.js +6 -1
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/provider.d.ts +3 -0
- package/dist/tools/provider.d.ts.map +1 -0
- package/dist/tools/provider.js +403 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/proxy.d.ts +6 -0
- package/dist/tools/proxy.d.ts.map +1 -0
- package/dist/tools/proxy.js +107 -0
- package/dist/tools/proxy.js.map +1 -0
- package/dist/tools/research.d.ts +9 -0
- package/dist/tools/research.d.ts.map +1 -0
- package/dist/tools/research.js +182 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +98 -9
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/utility.d.ts.map +1 -1
- package/dist/tools/utility.js +85 -16
- package/dist/tools/utility.js.map +1 -1
- package/dist/utils/autoDocumentation.d.ts +8 -0
- package/dist/utils/autoDocumentation.d.ts.map +1 -0
- package/dist/utils/autoDocumentation.js +140 -0
- package/dist/utils/autoDocumentation.js.map +1 -0
- package/dist/utils/autoDocumentation.test.d.ts +2 -0
- package/dist/utils/autoDocumentation.test.d.ts.map +1 -0
- package/dist/utils/autoDocumentation.test.js +47 -0
- package/dist/utils/autoDocumentation.test.js.map +1 -0
- package/dist/utils/contextSync.d.ts.map +1 -1
- package/dist/utils/contextSync.js +21 -1
- package/dist/utils/contextSync.js.map +1 -1
- package/dist/utils/cursorCli.d.ts +46 -0
- package/dist/utils/cursorCli.d.ts.map +1 -0
- package/dist/utils/cursorCli.js +176 -0
- package/dist/utils/cursorCli.js.map +1 -0
- package/dist/utils/cursorCli.test.d.ts +2 -0
- package/dist/utils/cursorCli.test.d.ts.map +1 -0
- package/dist/utils/cursorCli.test.js +134 -0
- package/dist/utils/cursorCli.test.js.map +1 -0
- package/dist/utils/delegatedTaskRuntime.d.ts +45 -0
- package/dist/utils/delegatedTaskRuntime.d.ts.map +1 -0
- package/dist/utils/delegatedTaskRuntime.js +147 -0
- package/dist/utils/delegatedTaskRuntime.js.map +1 -0
- package/dist/utils/delegationKnowledge.d.ts +51 -0
- package/dist/utils/delegationKnowledge.d.ts.map +1 -0
- package/dist/utils/delegationKnowledge.js +197 -0
- package/dist/utils/delegationKnowledge.js.map +1 -0
- package/dist/utils/delegationRecovery.d.ts +17 -0
- package/dist/utils/delegationRecovery.d.ts.map +1 -0
- package/dist/utils/delegationRecovery.js +63 -0
- package/dist/utils/delegationRecovery.js.map +1 -0
- package/dist/utils/delegationRecovery.test.d.ts +2 -0
- package/dist/utils/delegationRecovery.test.d.ts.map +1 -0
- package/dist/utils/delegationRecovery.test.js +42 -0
- package/dist/utils/delegationRecovery.test.js.map +1 -0
- package/dist/utils/orchestratorConfig.d.ts +19 -0
- package/dist/utils/orchestratorConfig.d.ts.map +1 -0
- package/dist/utils/orchestratorConfig.js +38 -0
- package/dist/utils/orchestratorConfig.js.map +1 -0
- package/dist/utils/subprocess.d.ts +27 -0
- package/dist/utils/subprocess.d.ts.map +1 -0
- package/dist/utils/subprocess.js +84 -0
- package/dist/utils/subprocess.js.map +1 -0
- package/package.json +17 -5
- package/templates/AGENTS.md +164 -0
- package/activeContext.md +0 -37
- package/src/bin/cli.ts +0 -430
- package/src/database.ts +0 -764
- package/src/index.ts +0 -71
- package/src/models.ts +0 -226
- package/src/tools/agent.ts +0 -241
- package/src/tools/coordination.ts +0 -152
- package/src/tools/index.ts +0 -9
- package/src/tools/memory.ts +0 -150
- package/src/tools/task.ts +0 -334
- package/src/tools/utility.ts +0 -202
- package/src/utils/contextSync.ts +0 -144
- package/tsconfig.json +0 -20
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getDatabase } from '../database.js';
|
|
3
|
+
import { getCurrentAgentId } from './agent.js';
|
|
4
|
+
import { syncToActiveContext } from '../utils/contextSync.js';
|
|
5
|
+
import { CursorProvider, getCursorMetadata } from '../providers/cursor.js';
|
|
6
|
+
import { TaskStatus } from '../models.js';
|
|
7
|
+
import { getDelegationDisplayStatus } from '../utils/cursorCli.js';
|
|
8
|
+
import { listDelegationKnowledge, writeDelegationBrief, writeDelegationHandoff, } from '../utils/delegationKnowledge.js';
|
|
9
|
+
import { getRecoveryDisplayLine } from '../utils/delegationRecovery.js';
|
|
10
|
+
import { generateTaskDocumentation } from '../utils/autoDocumentation.js';
|
|
11
|
+
import { getTaskDelegationContext, recoverDelegatedTask, syncDelegatedTask } from '../utils/delegatedTaskRuntime.js';
|
|
12
|
+
function toDecisionValue(value) {
|
|
13
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
14
|
+
}
|
|
15
|
+
export function registerProviderTools(server) {
|
|
16
|
+
server.tool('cursor_task_status', 'Show the latest health, recovery state, and hints for a delegated Cursor task.', {
|
|
17
|
+
task_id: z.string().describe('Task ID to inspect'),
|
|
18
|
+
}, async ({ task_id }) => {
|
|
19
|
+
const task = await syncDelegatedTask({
|
|
20
|
+
db: getDatabase(),
|
|
21
|
+
taskId: task_id,
|
|
22
|
+
persistKnowledge: true,
|
|
23
|
+
createdBy: getCurrentAgentId(),
|
|
24
|
+
});
|
|
25
|
+
if (!task) {
|
|
26
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
27
|
+
}
|
|
28
|
+
const metadata = getCursorMetadata(task.metadata);
|
|
29
|
+
if (!metadata) {
|
|
30
|
+
return { content: [{ type: 'text', text: `Task ${task_id} is not delegated to Cursor.` }] };
|
|
31
|
+
}
|
|
32
|
+
const lines = [
|
|
33
|
+
'# Cursor Task Status',
|
|
34
|
+
'',
|
|
35
|
+
`**Task**: ${task.title}`,
|
|
36
|
+
`**Task status**: ${task.status}`,
|
|
37
|
+
`**Provider status**: ${metadata.providerStatus}`,
|
|
38
|
+
`**Recovery**: ${getRecoveryDisplayLine(metadata)}`,
|
|
39
|
+
`**Chat ID**: ${metadata.providerChatId ?? 'Unavailable'}`,
|
|
40
|
+
`**Retry count**: ${metadata.providerRetryCount ?? 0}`,
|
|
41
|
+
];
|
|
42
|
+
if (metadata.providerLastError) {
|
|
43
|
+
lines.push('', '## Last Error', metadata.providerLastError);
|
|
44
|
+
}
|
|
45
|
+
if (metadata.providerRecoveryHints && metadata.providerRecoveryHints.length > 0) {
|
|
46
|
+
lines.push('', '## Recovery Hints');
|
|
47
|
+
for (const hint of metadata.providerRecoveryHints) {
|
|
48
|
+
lines.push(`- ${hint}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
52
|
+
});
|
|
53
|
+
server.tool('cursor_check', 'Check whether Cursor CLI is installed and which orchestration features are available.', {}, async () => {
|
|
54
|
+
const result = await new CursorProvider().check();
|
|
55
|
+
const lines = [
|
|
56
|
+
'# Cursor Provider Check',
|
|
57
|
+
'',
|
|
58
|
+
`**Available**: ${result.available ? 'Yes' : 'No'}`,
|
|
59
|
+
`**Binary**: ${result.binary}`,
|
|
60
|
+
`**Runtime**: ${result.runtime}`,
|
|
61
|
+
`**Version**: ${result.version ?? 'Unknown'}`,
|
|
62
|
+
`**Features**: ${result.features.length > 0 ? result.features.join(', ') : 'None detected'}`,
|
|
63
|
+
];
|
|
64
|
+
if (result.warnings.length > 0) {
|
|
65
|
+
lines.push('', '## Warnings');
|
|
66
|
+
for (const warning of result.warnings) {
|
|
67
|
+
lines.push(`- ${warning}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
71
|
+
});
|
|
72
|
+
server.tool('cursor_delegate_task', 'Delegate a task to Cursor CLI and store session metadata for later resume/sync.', {
|
|
73
|
+
task_id: z.string().describe('Task ID to delegate'),
|
|
74
|
+
mode: z.enum(['agent', 'plan', 'ask']).optional().describe('Cursor execution mode'),
|
|
75
|
+
model: z.string().optional().describe('Optional Cursor model'),
|
|
76
|
+
use_worktree: z.boolean().optional().describe('Override worktree policy'),
|
|
77
|
+
cloud: z.boolean().optional().default(false).describe('Run using Cursor cloud mode'),
|
|
78
|
+
force: z.boolean().optional().describe('Allow unattended execution with approvals pre-accepted'),
|
|
79
|
+
}, async ({ task_id, mode, model, use_worktree, cloud, force }) => {
|
|
80
|
+
const context = getTaskDelegationContext(getDatabase(), task_id);
|
|
81
|
+
if (!context) {
|
|
82
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
83
|
+
}
|
|
84
|
+
const { task, currentFocus, decisions, research } = context;
|
|
85
|
+
const db = getDatabase();
|
|
86
|
+
const check = await new CursorProvider().check();
|
|
87
|
+
if (!check.available) {
|
|
88
|
+
return { content: [{ type: 'text', text: check.warnings.join('\n') || 'Cursor CLI is not available.' }] };
|
|
89
|
+
}
|
|
90
|
+
const delegated = await new CursorProvider().spawnTask({
|
|
91
|
+
cwd: process.cwd(),
|
|
92
|
+
task,
|
|
93
|
+
currentFocus,
|
|
94
|
+
decisions,
|
|
95
|
+
research,
|
|
96
|
+
mode,
|
|
97
|
+
model,
|
|
98
|
+
useWorktree: use_worktree,
|
|
99
|
+
cloud,
|
|
100
|
+
force,
|
|
101
|
+
spawnedBy: getCurrentAgentId(),
|
|
102
|
+
});
|
|
103
|
+
const updated = db.updateTask(task.id, {
|
|
104
|
+
status: TaskStatus.IN_PROGRESS,
|
|
105
|
+
metadata: delegated.metadata,
|
|
106
|
+
});
|
|
107
|
+
if (updated) {
|
|
108
|
+
writeDelegationBrief({
|
|
109
|
+
db,
|
|
110
|
+
task: updated,
|
|
111
|
+
currentFocus,
|
|
112
|
+
decisions,
|
|
113
|
+
research,
|
|
114
|
+
metadata: delegated.metadata,
|
|
115
|
+
createdBy: getCurrentAgentId(),
|
|
116
|
+
});
|
|
117
|
+
generateTaskDocumentation(db, updated.id);
|
|
118
|
+
}
|
|
119
|
+
syncToActiveContext();
|
|
120
|
+
const lines = [
|
|
121
|
+
'# Cursor Task Delegated',
|
|
122
|
+
'',
|
|
123
|
+
`**Task**: ${task.title}`,
|
|
124
|
+
`**Task ID**: \`${task.id}\``,
|
|
125
|
+
`**Provider status**: ${delegated.metadata.providerStatus}`,
|
|
126
|
+
`**Mode**: ${delegated.metadata.providerMode}`,
|
|
127
|
+
`**Chat ID**: ${delegated.metadata.providerChatId ?? 'Unavailable'}`,
|
|
128
|
+
`**Worktree**: ${delegated.metadata.providerWorktree ? 'Yes' : 'No'}`,
|
|
129
|
+
`**Run log**: ${delegated.metadata.providerLogPath ?? 'Unavailable'}`,
|
|
130
|
+
'',
|
|
131
|
+
'## Launch Command',
|
|
132
|
+
delegated.command,
|
|
133
|
+
];
|
|
134
|
+
if (delegated.warnings.length > 0) {
|
|
135
|
+
lines.push('', '## Warnings');
|
|
136
|
+
for (const warning of delegated.warnings) {
|
|
137
|
+
lines.push(`- ${warning}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (updated?.output) {
|
|
141
|
+
lines.push('', '## Latest Output', updated.output);
|
|
142
|
+
}
|
|
143
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
144
|
+
});
|
|
145
|
+
server.tool('cursor_resume_task', 'Return the Cursor resume command for a delegated task and refresh its last known status.', {
|
|
146
|
+
task_id: z.string().describe('Task ID to resume'),
|
|
147
|
+
}, async ({ task_id }) => {
|
|
148
|
+
const task = await syncDelegatedTask({
|
|
149
|
+
db: getDatabase(),
|
|
150
|
+
taskId: task_id,
|
|
151
|
+
createdBy: getCurrentAgentId(),
|
|
152
|
+
});
|
|
153
|
+
if (!task) {
|
|
154
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
155
|
+
}
|
|
156
|
+
const metadata = getCursorMetadata(task.metadata);
|
|
157
|
+
if (!metadata) {
|
|
158
|
+
return { content: [{ type: 'text', text: `Task ${task_id} is not delegated to Cursor.` }] };
|
|
159
|
+
}
|
|
160
|
+
const context = getTaskDelegationContext(getDatabase(), task_id);
|
|
161
|
+
if (!context) {
|
|
162
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
163
|
+
}
|
|
164
|
+
const resumed = await new CursorProvider().resumeSession({
|
|
165
|
+
cwd: process.cwd(),
|
|
166
|
+
task: context.task,
|
|
167
|
+
currentFocus: context.currentFocus,
|
|
168
|
+
decisions: context.decisions,
|
|
169
|
+
research: context.research,
|
|
170
|
+
delegationKnowledge: context.knowledge,
|
|
171
|
+
metadata,
|
|
172
|
+
});
|
|
173
|
+
const lines = [
|
|
174
|
+
'# Cursor Resume',
|
|
175
|
+
'',
|
|
176
|
+
`**Task**: ${task.title}`,
|
|
177
|
+
`**Provider status**: ${metadata.providerStatus}`,
|
|
178
|
+
`**Chat ID**: ${metadata.providerChatId ?? 'Unavailable'}`,
|
|
179
|
+
'',
|
|
180
|
+
'## Resume Command',
|
|
181
|
+
resumed.command,
|
|
182
|
+
];
|
|
183
|
+
if (resumed.prompt) {
|
|
184
|
+
lines.push('', '## Resume Prompt', resumed.prompt);
|
|
185
|
+
}
|
|
186
|
+
if (resumed.warnings.length > 0) {
|
|
187
|
+
lines.push('', '## Warnings');
|
|
188
|
+
for (const warning of resumed.warnings) {
|
|
189
|
+
lines.push(`- ${warning}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
193
|
+
});
|
|
194
|
+
server.tool('cursor_sync_task', 'Refresh a delegated Cursor task, sync the latest provider status, and persist knowledge back into shared memory.', {
|
|
195
|
+
task_id: z.string().describe('Task ID to sync'),
|
|
196
|
+
}, async ({ task_id }) => {
|
|
197
|
+
const task = await syncDelegatedTask({
|
|
198
|
+
db: getDatabase(),
|
|
199
|
+
taskId: task_id,
|
|
200
|
+
persistKnowledge: true,
|
|
201
|
+
createdBy: getCurrentAgentId(),
|
|
202
|
+
});
|
|
203
|
+
if (!task) {
|
|
204
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
205
|
+
}
|
|
206
|
+
const metadata = getCursorMetadata(task.metadata);
|
|
207
|
+
if (!metadata) {
|
|
208
|
+
return { content: [{ type: 'text', text: `Task ${task_id} is not delegated to Cursor.` }] };
|
|
209
|
+
}
|
|
210
|
+
const knowledge = listDelegationKnowledge(getDatabase(), task.id);
|
|
211
|
+
const lines = [
|
|
212
|
+
'# Cursor Task Synced',
|
|
213
|
+
'',
|
|
214
|
+
`**Task**: ${task.title}`,
|
|
215
|
+
`**Provider status**: ${metadata.providerStatus}`,
|
|
216
|
+
`**Chat ID**: ${metadata.providerChatId ?? 'Unavailable'}`,
|
|
217
|
+
`**Task status**: ${task.status}`,
|
|
218
|
+
'',
|
|
219
|
+
'## Knowledge Namespaces',
|
|
220
|
+
`- \`delegation:${task.id}:brief\` (${knowledge.brief.length} entries)`,
|
|
221
|
+
`- \`delegation:${task.id}:updates\` (${knowledge.updates.length} entries)`,
|
|
222
|
+
`- \`delegation:${task.id}:findings\` (${knowledge.findings.length} entries)`,
|
|
223
|
+
`- \`delegation:${task.id}:decisions\` (${knowledge.decisions.length} entries)`,
|
|
224
|
+
`- \`delegation:${task.id}:handoff\` (${knowledge.handoff.length} entries)`,
|
|
225
|
+
];
|
|
226
|
+
if (task.output) {
|
|
227
|
+
lines.push('', '## Latest Output', task.output);
|
|
228
|
+
}
|
|
229
|
+
const generated = generateTaskDocumentation(getDatabase(), task.id);
|
|
230
|
+
if (generated) {
|
|
231
|
+
lines.push('', '## Documentation', generated.taskDocPath);
|
|
232
|
+
}
|
|
233
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
234
|
+
});
|
|
235
|
+
server.tool('cursor_handoff_task', 'Write a structured handoff for a delegated Cursor task so the next agent can resume with shared context.', {
|
|
236
|
+
task_id: z.string().describe('Task ID to hand off'),
|
|
237
|
+
summary: z.string().describe('High-level handoff summary'),
|
|
238
|
+
findings: z.array(z.string()).optional().default([]).describe('Important findings discovered so far'),
|
|
239
|
+
next_steps: z.array(z.string()).optional().default([]).describe('Recommended next steps'),
|
|
240
|
+
blockers: z.array(z.string()).optional().default([]).describe('Known blockers or risks'),
|
|
241
|
+
}, async ({ task_id, summary, findings, next_steps, blockers }) => {
|
|
242
|
+
const task = await syncDelegatedTask({
|
|
243
|
+
db: getDatabase(),
|
|
244
|
+
taskId: task_id,
|
|
245
|
+
persistKnowledge: true,
|
|
246
|
+
createdBy: getCurrentAgentId(),
|
|
247
|
+
});
|
|
248
|
+
if (!task) {
|
|
249
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
250
|
+
}
|
|
251
|
+
const metadata = getCursorMetadata(task.metadata);
|
|
252
|
+
if (!metadata) {
|
|
253
|
+
return { content: [{ type: 'text', text: `Task ${task_id} is not delegated to Cursor.` }] };
|
|
254
|
+
}
|
|
255
|
+
writeDelegationHandoff({
|
|
256
|
+
db: getDatabase(),
|
|
257
|
+
taskId: task.id,
|
|
258
|
+
summary,
|
|
259
|
+
findings,
|
|
260
|
+
nextSteps: next_steps,
|
|
261
|
+
blockers,
|
|
262
|
+
createdBy: getCurrentAgentId(),
|
|
263
|
+
});
|
|
264
|
+
const generated = generateTaskDocumentation(getDatabase(), task.id);
|
|
265
|
+
syncToActiveContext();
|
|
266
|
+
const lines = [
|
|
267
|
+
'# Cursor Handoff Recorded',
|
|
268
|
+
'',
|
|
269
|
+
`**Task**: ${task.title}`,
|
|
270
|
+
`**Provider status**: ${metadata.providerStatus}`,
|
|
271
|
+
`**Summary**: ${summary}`,
|
|
272
|
+
];
|
|
273
|
+
if (findings.length > 0) {
|
|
274
|
+
lines.push('', '## Findings');
|
|
275
|
+
for (const finding of findings) {
|
|
276
|
+
lines.push(`- ${finding}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (next_steps.length > 0) {
|
|
280
|
+
lines.push('', '## Next Steps');
|
|
281
|
+
for (const step of next_steps) {
|
|
282
|
+
lines.push(`- ${step}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (blockers.length > 0) {
|
|
286
|
+
lines.push('', '## Blockers');
|
|
287
|
+
for (const blocker of blockers) {
|
|
288
|
+
lines.push(`- ${blocker}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (generated) {
|
|
292
|
+
lines.push('', '## Documentation', generated.taskDocPath);
|
|
293
|
+
}
|
|
294
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
295
|
+
});
|
|
296
|
+
server.tool('cursor_recover_task', 'Recover a failed or stale delegated Cursor task by relaunching it with the latest shared context.', {
|
|
297
|
+
task_id: z.string().describe('Task ID to recover'),
|
|
298
|
+
mode: z.enum(['agent', 'plan', 'ask']).optional().describe('Override the recovery mode'),
|
|
299
|
+
model: z.string().optional().describe('Optional Cursor model override'),
|
|
300
|
+
use_worktree: z.boolean().optional().describe('Override worktree policy during recovery'),
|
|
301
|
+
cloud: z.boolean().optional().describe('Override cloud mode during recovery'),
|
|
302
|
+
force: z.boolean().optional().default(false).describe('Recover even if the current run still looks healthy'),
|
|
303
|
+
}, async ({ task_id, mode, model, use_worktree, cloud, force }) => {
|
|
304
|
+
const result = await recoverDelegatedTask({
|
|
305
|
+
db: getDatabase(),
|
|
306
|
+
taskId: task_id,
|
|
307
|
+
createdBy: getCurrentAgentId(),
|
|
308
|
+
options: {
|
|
309
|
+
mode,
|
|
310
|
+
model,
|
|
311
|
+
useWorktree: use_worktree,
|
|
312
|
+
cloud,
|
|
313
|
+
force,
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
if (!result) {
|
|
317
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
318
|
+
}
|
|
319
|
+
if (result.blocked) {
|
|
320
|
+
return {
|
|
321
|
+
content: [{ type: 'text', text: result.reason ?? 'Recovery blocked.' }],
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
const lines = [
|
|
325
|
+
'# Cursor Task Recovered',
|
|
326
|
+
'',
|
|
327
|
+
`**Task**: ${result.task.title}`,
|
|
328
|
+
`**Provider status**: ${result.metadata.providerStatus}`,
|
|
329
|
+
`**Recovery state**: ${result.metadata.providerRecoveryState ?? 'healthy'}`,
|
|
330
|
+
`**Retry count**: ${result.metadata.providerRetryCount ?? 0}`,
|
|
331
|
+
`**Chat ID**: ${result.metadata.providerChatId ?? 'Unavailable'}`,
|
|
332
|
+
];
|
|
333
|
+
if (result.delegated) {
|
|
334
|
+
lines.push('', '## Launch Command', result.delegated.command);
|
|
335
|
+
}
|
|
336
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
337
|
+
});
|
|
338
|
+
server.tool('task_generate_doc', 'Generate or refresh the Markdown documentation for a task using current orchestration state.', {
|
|
339
|
+
task_id: z.string().describe('Task ID to document'),
|
|
340
|
+
}, async ({ task_id }) => {
|
|
341
|
+
const generated = generateTaskDocumentation(getDatabase(), task_id);
|
|
342
|
+
if (!generated) {
|
|
343
|
+
return { content: [{ type: 'text', text: `Task ${task_id} not found.` }] };
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
content: [
|
|
347
|
+
{
|
|
348
|
+
type: 'text',
|
|
349
|
+
text: [
|
|
350
|
+
'# Task Documentation Generated',
|
|
351
|
+
'',
|
|
352
|
+
`**Task doc**: ${generated.taskDocPath}`,
|
|
353
|
+
`**Index**: ${generated.indexDocPath}`,
|
|
354
|
+
].join('\n'),
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
};
|
|
358
|
+
});
|
|
359
|
+
server.tool('cursor_list_delegations', 'List all tasks currently delegated to Cursor, including last known status and session metadata.', {
|
|
360
|
+
status: z.enum(['spawned', 'running', 'completed', 'failed']).optional().describe('Filter by provider status'),
|
|
361
|
+
}, async ({ status }) => {
|
|
362
|
+
const db = getDatabase();
|
|
363
|
+
const allTasks = db.listTasks();
|
|
364
|
+
const delegated = [];
|
|
365
|
+
for (const task of allTasks) {
|
|
366
|
+
const metadata = getCursorMetadata(task.metadata);
|
|
367
|
+
if (!metadata) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const synced = await syncDelegatedTask({
|
|
371
|
+
db,
|
|
372
|
+
taskId: task.id,
|
|
373
|
+
createdBy: getCurrentAgentId(),
|
|
374
|
+
});
|
|
375
|
+
if (!synced) {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
const syncedMetadata = getCursorMetadata(synced.metadata);
|
|
379
|
+
if (!syncedMetadata) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (status && syncedMetadata.providerStatus !== status) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
delegated.push({ task: synced, metadata: syncedMetadata });
|
|
386
|
+
}
|
|
387
|
+
if (delegated.length === 0) {
|
|
388
|
+
return { content: [{ type: 'text', text: 'No Cursor delegations found.' }] };
|
|
389
|
+
}
|
|
390
|
+
const lines = ['# Cursor Delegations', ''];
|
|
391
|
+
for (const entry of delegated) {
|
|
392
|
+
lines.push(`- **${entry.task.title}** (\`${entry.task.id.slice(0, 8)}...\`)`);
|
|
393
|
+
lines.push(` ${getDelegationDisplayStatus(entry.metadata)}`);
|
|
394
|
+
lines.push(` recovery=${getRecoveryDisplayLine(entry.metadata)}`);
|
|
395
|
+
lines.push(` chat=${entry.metadata.providerChatId ?? 'n/a'} model=${entry.metadata.providerModel ?? 'default'}`);
|
|
396
|
+
if (entry.task.output) {
|
|
397
|
+
lines.push(` output=${toDecisionValue(entry.task.output).slice(0, 140)}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/tools/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErH,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,gFAAgF,EAChF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACnD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC;YACnC,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,OAAO;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,sBAAsB;YACtB,EAAE;YACF,aAAa,IAAI,CAAC,KAAK,EAAE;YACzB,oBAAoB,IAAI,CAAC,MAAM,EAAE;YACjC,wBAAwB,QAAQ,CAAC,cAAc,EAAE;YACjD,iBAAiB,sBAAsB,CAAC,QAAQ,CAAC,EAAE;YACnD,gBAAgB,QAAQ,CAAC,cAAc,IAAI,aAAa,EAAE;YAC1D,oBAAoB,QAAQ,CAAC,kBAAkB,IAAI,CAAC,EAAE;SACvD,CAAC;QAEF,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,QAAQ,CAAC,qBAAqB,IAAI,QAAQ,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChF,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,uFAAuF,EACvF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG;YACZ,yBAAyB;YACzB,EAAE;YACF,kBAAkB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACnD,eAAe,MAAM,CAAC,MAAM,EAAE;YAC9B,gBAAgB,MAAM,CAAC,OAAO,EAAE;YAChC,gBAAgB,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE;YAC7C,iBAAiB,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE;SAC7F,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,iFAAiF,EACjF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC9D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACzE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACpF,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KACjG,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,wBAAwB,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC5D,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC5G,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC,SAAS,CAAC;YACrD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,IAAI;YACJ,YAAY;YACZ,SAAS;YACT,QAAQ;YACR,IAAI;YACJ,KAAK;YACL,WAAW,EAAE,YAAY;YACzB,KAAK;YACL,KAAK;YACL,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,UAAU,CAAC,WAAW;YAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,oBAAoB,CAAC;gBACnB,EAAE;gBACF,IAAI,EAAE,OAAO;gBACb,YAAY;gBACZ,SAAS;gBACT,QAAQ;gBACR,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,SAAS,EAAE,iBAAiB,EAAE;aAC/B,CAAC,CAAC;YACH,yBAAyB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,mBAAmB,EAAE,CAAC;QAEtB,MAAM,KAAK,GAAG;YACZ,yBAAyB;YACzB,EAAE;YACF,aAAa,IAAI,CAAC,KAAK,EAAE;YACzB,kBAAkB,IAAI,CAAC,EAAE,IAAI;YAC7B,wBAAwB,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE;YAC3D,aAAa,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE;YAC9C,gBAAgB,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,aAAa,EAAE;YACpE,iBAAiB,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACrE,gBAAgB,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,aAAa,EAAE;YACrE,EAAE;YACF,mBAAmB;YACnB,SAAS,CAAC,OAAO;SAClB,CAAC;QAEF,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,0FAA0F,EAC1F;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAClD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC;YACnC,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC,aAAa,CAAC;YACvD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,mBAAmB,EAAE,OAAO,CAAC,SAAS;YACtC,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG;YACZ,iBAAiB;YACjB,EAAE;YACF,aAAa,IAAI,CAAC,KAAK,EAAE;YACzB,wBAAwB,QAAQ,CAAC,cAAc,EAAE;YACjD,gBAAgB,QAAQ,CAAC,cAAc,IAAI,aAAa,EAAE;YAC1D,EAAE;YACF,mBAAmB;YACnB,OAAO,CAAC,OAAO;SAChB,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kHAAkH,EAClH;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KAChD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC;YACnC,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,OAAO;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG;YACZ,sBAAsB;YACtB,EAAE;YACF,aAAa,IAAI,CAAC,KAAK,EAAE;YACzB,wBAAwB,QAAQ,CAAC,cAAc,EAAE;YACjD,gBAAgB,QAAQ,CAAC,cAAc,IAAI,aAAa,EAAE;YAC1D,oBAAoB,IAAI,CAAC,MAAM,EAAE;YACjC,EAAE;YACF,yBAAyB;YACzB,kBAAkB,IAAI,CAAC,EAAE,aAAa,SAAS,CAAC,KAAK,CAAC,MAAM,WAAW;YACvE,kBAAkB,IAAI,CAAC,EAAE,eAAe,SAAS,CAAC,OAAO,CAAC,MAAM,WAAW;YAC3E,kBAAkB,IAAI,CAAC,EAAE,gBAAgB,SAAS,CAAC,QAAQ,CAAC,MAAM,WAAW;YAC7E,kBAAkB,IAAI,CAAC,EAAE,iBAAiB,SAAS,CAAC,SAAS,CAAC,MAAM,WAAW;YAC/E,kBAAkB,IAAI,CAAC,EAAE,eAAe,SAAS,CAAC,OAAO,CAAC,MAAM,WAAW;SAC5E,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,SAAS,GAAG,yBAAyB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,0GAA0G,EAC1G;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC1D,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACrG,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACzF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACzF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC;YACnC,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,OAAO;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;QAED,sBAAsB,CAAC;YACrB,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO;YACP,QAAQ;YACR,SAAS,EAAE,UAAU;YACrB,QAAQ;YACR,SAAS,EAAE,iBAAiB,EAAE;SAC/B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,yBAAyB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,mBAAmB,EAAE,CAAC;QAEtB,MAAM,KAAK,GAAG;YACZ,2BAA2B;YAC3B,EAAE;YACF,aAAa,IAAI,CAAC,KAAK,EAAE;YACzB,wBAAwB,QAAQ,CAAC,cAAc,EAAE;YACjD,gBAAgB,OAAO,EAAE;SAC1B,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,mGAAmG,EACnG;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAClD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACvE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACzF,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC7E,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KAC7G,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;YACxC,EAAE,EAAE,WAAW,EAAE;YACjB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,iBAAiB,EAAE;YAC9B,OAAO,EAAE;gBACP,IAAI;gBACJ,KAAK;gBACL,WAAW,EAAE,YAAY;gBACzB,KAAK;gBACL,KAAK;aACN;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;aACxE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,yBAAyB;YACzB,EAAE;YACF,aAAa,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;YAChC,wBAAwB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACxD,uBAAuB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,IAAI,SAAS,EAAE;YAC3E,oBAAoB,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,EAAE;YAC7D,gBAAgB,MAAM,CAAC,QAAQ,CAAC,cAAc,IAAI,aAAa,EAAE;SAClE,CAAC;QAEF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,8FAA8F,EAC9F;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACpD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,SAAS,GAAG,yBAAyB,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,gCAAgC;wBAChC,EAAE;wBACF,iBAAiB,SAAS,CAAC,WAAW,EAAE;wBACxC,cAAc,SAAS,CAAC,YAAY,EAAE;qBACvC,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,iGAAiG,EACjG;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC/G,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,EAAE,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;gBACrC,EAAE;gBACF,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,SAAS,EAAE,iBAAiB,EAAE;aAC/B,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,IAAI,MAAM,IAAI,cAAc,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;gBACvD,SAAS;YACX,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC/E,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,cAAc,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,QAAQ,CAAC,cAAc,IAAI,KAAK,UAAU,KAAK,CAAC,QAAQ,CAAC,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;YAClH,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register tools from downstream servers onto the main orchestration server
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerProxyTools(server: McpServer): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/tools/proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuFpE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCzE"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
// Zod schema for mcp_config.json
|
|
7
|
+
const McpConfigSchema = z.object({
|
|
8
|
+
mcpServers: z.record(z.object({
|
|
9
|
+
command: z.string(),
|
|
10
|
+
args: z.array(z.string()).optional(),
|
|
11
|
+
env: z.record(z.string()).optional(),
|
|
12
|
+
})),
|
|
13
|
+
});
|
|
14
|
+
const clients = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Load MCP config from the current working directory
|
|
17
|
+
*/
|
|
18
|
+
function loadMcpConfig() {
|
|
19
|
+
const configPath = path.resolve(process.cwd(), 'mcp_config.json');
|
|
20
|
+
if (!fs.existsSync(configPath)) {
|
|
21
|
+
console.warn(`[Proxy] No mcp_config.json found at ${configPath}`);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
26
|
+
const json = JSON.parse(content);
|
|
27
|
+
return McpConfigSchema.parse(json);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(`[Proxy] Failed to load mcp_config.json:`, error);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Connect to downstream MCP servers defined in the config
|
|
36
|
+
*/
|
|
37
|
+
async function connectToDownstreamServers() {
|
|
38
|
+
const config = loadMcpConfig();
|
|
39
|
+
if (!config)
|
|
40
|
+
return;
|
|
41
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
42
|
+
// Skip self to prevent infinite loops if misconfigured
|
|
43
|
+
if (name === 'agent-orchestration')
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
console.error(`[Proxy] Connecting to downstream server: ${name}`);
|
|
47
|
+
const env = { ...process.env };
|
|
48
|
+
if (serverConfig.env) {
|
|
49
|
+
Object.assign(env, serverConfig.env);
|
|
50
|
+
}
|
|
51
|
+
const transport = new StdioClientTransport({
|
|
52
|
+
command: serverConfig.command,
|
|
53
|
+
args: serverConfig.args,
|
|
54
|
+
env,
|
|
55
|
+
});
|
|
56
|
+
const client = new Client({
|
|
57
|
+
name: `proxy-${name}`,
|
|
58
|
+
version: '1.0.0',
|
|
59
|
+
}, {
|
|
60
|
+
capabilities: {},
|
|
61
|
+
});
|
|
62
|
+
await client.connect(transport);
|
|
63
|
+
clients.set(name, client);
|
|
64
|
+
console.error(`[Proxy] Connected to ${name}`);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(`[Proxy] Failed to connect to ${name}:`, error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Register tools from downstream servers onto the main orchestration server
|
|
73
|
+
*/
|
|
74
|
+
export async function registerProxyTools(server) {
|
|
75
|
+
await connectToDownstreamServers();
|
|
76
|
+
for (const [serverName, client] of clients.entries()) {
|
|
77
|
+
try {
|
|
78
|
+
const result = await client.listTools();
|
|
79
|
+
for (const tool of result.tools) {
|
|
80
|
+
// Prefix tool name to avoid collisions and indicate source
|
|
81
|
+
const proxyToolName = `${serverName}_${tool.name}`;
|
|
82
|
+
console.error(`[Proxy] Registering tool: ${proxyToolName}`);
|
|
83
|
+
// Note: We use a passthrough schema because converting JSON Schema back to Zod is complex.
|
|
84
|
+
// This loses some validation info in the proxy declaration but allows execution to flow.
|
|
85
|
+
server.tool(proxyToolName, tool.description || `Proxy tool from ${serverName}`, {
|
|
86
|
+
// We define a broad schema that accepts any property
|
|
87
|
+
// This effectively mimics 'any' object but satisfies ZodRawShape type
|
|
88
|
+
...Object.keys(tool.inputSchema?.properties || {}).reduce((acc, key) => ({
|
|
89
|
+
...acc,
|
|
90
|
+
[key]: z.any().optional().describe('Proxied argument')
|
|
91
|
+
}), {})
|
|
92
|
+
}, async (args) => {
|
|
93
|
+
console.error(`[Proxy] Forwarding call to ${proxyToolName}`);
|
|
94
|
+
const result = await client.callTool({
|
|
95
|
+
name: tool.name,
|
|
96
|
+
arguments: args,
|
|
97
|
+
});
|
|
98
|
+
return result;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`[Proxy] Failed to list tools for ${serverName}:`, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/tools/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research workflow tools
|
|
3
|
+
*
|
|
4
|
+
* These tools implement the Research-First Workflow, ensuring agents
|
|
5
|
+
* properly understand context, requirements, and design before implementation.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerResearchTools(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuN7D"}
|