@rigour-labs/mcp 2.22.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/index.js +73 -1236
- package/dist/tools/agent-handlers.d.ts +14 -0
- package/dist/tools/agent-handlers.js +176 -0
- package/dist/tools/definitions.d.ts +293 -0
- package/dist/tools/definitions.js +249 -0
- package/dist/tools/execution-handlers.d.ts +11 -0
- package/dist/tools/execution-handlers.js +134 -0
- package/dist/tools/memory-handlers.d.ts +10 -0
- package/dist/tools/memory-handlers.js +52 -0
- package/dist/tools/pattern-handlers.d.ts +9 -0
- package/dist/tools/pattern-handlers.js +72 -0
- package/dist/tools/quality-handlers.d.ts +25 -0
- package/dist/tools/quality-handlers.js +116 -0
- package/dist/tools/review-handler.d.ts +16 -0
- package/dist/tools/review-handler.js +42 -0
- package/dist/utils/config.d.ts +153 -0
- package/dist/utils/config.js +93 -0
- package/package.json +21 -3
- package/.claude-plugin/SKILL.md +0 -51
- package/.claude-plugin/marketplace.json +0 -21
- package/.claude-plugin/plugin.json +0 -17
- package/server.json +0 -21
- package/src/index.test.ts +0 -333
- package/src/index.ts +0 -1432
- package/src/smoke.test.ts +0 -7
- package/src/supervisor.test.ts +0 -158
- package/tsconfig.json +0 -10
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type ToolResult = {
|
|
2
|
+
content: {
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
}[];
|
|
6
|
+
isError?: boolean;
|
|
7
|
+
_shouldContinue?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function handleAgentRegister(cwd: string, agentId: string, taskScope: string[], requestId: string): Promise<ToolResult>;
|
|
10
|
+
export declare function handleCheckpoint(cwd: string, progressPct: number, filesChanged: string[], summary: string, qualityScore: number, requestId: string): Promise<ToolResult>;
|
|
11
|
+
export declare function handleHandoff(cwd: string, fromAgentId: string, toAgentId: string, taskDescription: string, filesInScope: string[], context: string, requestId: string): Promise<ToolResult>;
|
|
12
|
+
export declare function handleAgentDeregister(cwd: string, agentId: string, requestId: string): Promise<ToolResult>;
|
|
13
|
+
export declare function handleHandoffAccept(cwd: string, handoffId: string, agentId: string, requestId: string): Promise<ToolResult>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Governance Tool Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handlers for: rigour_agent_register, rigour_checkpoint, rigour_handoff,
|
|
5
|
+
* rigour_agent_deregister, rigour_handoff_accept
|
|
6
|
+
*
|
|
7
|
+
* @since v2.17.0 — extracted from monolithic index.ts
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs-extra";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import { logStudioEvent } from '../utils/config.js';
|
|
12
|
+
// ─── Agent Register ───────────────────────────────────────────────
|
|
13
|
+
export async function handleAgentRegister(cwd, agentId, taskScope, requestId) {
|
|
14
|
+
const sessionPath = path.join(cwd, '.rigour', 'agent-session.json');
|
|
15
|
+
let session = { agents: [], startedAt: new Date().toISOString() };
|
|
16
|
+
if (await fs.pathExists(sessionPath)) {
|
|
17
|
+
session = JSON.parse(await fs.readFile(sessionPath, 'utf-8'));
|
|
18
|
+
}
|
|
19
|
+
const existingIdx = session.agents.findIndex((a) => a.agentId === agentId);
|
|
20
|
+
if (existingIdx >= 0) {
|
|
21
|
+
session.agents[existingIdx] = {
|
|
22
|
+
agentId, taskScope,
|
|
23
|
+
registeredAt: session.agents[existingIdx].registeredAt,
|
|
24
|
+
lastCheckpoint: new Date().toISOString(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
session.agents.push({
|
|
29
|
+
agentId, taskScope,
|
|
30
|
+
registeredAt: new Date().toISOString(),
|
|
31
|
+
lastCheckpoint: new Date().toISOString(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Scope conflict detection
|
|
35
|
+
const conflicts = [];
|
|
36
|
+
for (const agent of session.agents) {
|
|
37
|
+
if (agent.agentId !== agentId) {
|
|
38
|
+
for (const scope of taskScope) {
|
|
39
|
+
if (agent.taskScope.includes(scope)) {
|
|
40
|
+
conflicts.push(`${agent.agentId} also claims "${scope}"`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
await fs.ensureDir(path.join(cwd, '.rigour'));
|
|
46
|
+
await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));
|
|
47
|
+
await logStudioEvent(cwd, { type: "agent_registered", requestId, agentId, taskScope, conflicts });
|
|
48
|
+
let text = `✅ AGENT REGISTERED: "${agentId}" claimed scope: ${taskScope.join(', ')}\n\n`;
|
|
49
|
+
text += `Active agents in session: ${session.agents.length}\n`;
|
|
50
|
+
if (conflicts.length > 0) {
|
|
51
|
+
text += `\n⚠️ SCOPE CONFLICTS DETECTED:\n${conflicts.map(c => ` - ${c}`).join('\n')}\n`;
|
|
52
|
+
text += `\nConsider coordinating with other agents or narrowing your scope.`;
|
|
53
|
+
}
|
|
54
|
+
return { content: [{ type: "text", text }] };
|
|
55
|
+
}
|
|
56
|
+
// ─── Checkpoint ───────────────────────────────────────────────────
|
|
57
|
+
export async function handleCheckpoint(cwd, progressPct, filesChanged, summary, qualityScore, requestId) {
|
|
58
|
+
const checkpointPath = path.join(cwd, '.rigour', 'checkpoint-session.json');
|
|
59
|
+
let session = {
|
|
60
|
+
sessionId: `chk-session-${Date.now()}`,
|
|
61
|
+
startedAt: new Date().toISOString(),
|
|
62
|
+
checkpoints: [],
|
|
63
|
+
status: 'active',
|
|
64
|
+
};
|
|
65
|
+
if (await fs.pathExists(checkpointPath)) {
|
|
66
|
+
session = JSON.parse(await fs.readFile(checkpointPath, 'utf-8'));
|
|
67
|
+
}
|
|
68
|
+
const checkpointId = `cp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
69
|
+
const warnings = [];
|
|
70
|
+
if (qualityScore < 80) {
|
|
71
|
+
warnings.push(`Quality score ${qualityScore}% is below threshold 80%`);
|
|
72
|
+
}
|
|
73
|
+
// Drift detection
|
|
74
|
+
if (session.checkpoints.length >= 2) {
|
|
75
|
+
const recentScores = session.checkpoints.slice(-3).map((cp) => cp.qualityScore);
|
|
76
|
+
const avgRecent = recentScores.reduce((a, b) => a + b, 0) / recentScores.length;
|
|
77
|
+
if (qualityScore < avgRecent - 10) {
|
|
78
|
+
warnings.push(`Drift detected: quality dropped from avg ${avgRecent.toFixed(0)}% to ${qualityScore}%`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
session.checkpoints.push({
|
|
82
|
+
checkpointId,
|
|
83
|
+
timestamp: new Date().toISOString(),
|
|
84
|
+
progressPct, filesChanged, summary, qualityScore, warnings,
|
|
85
|
+
});
|
|
86
|
+
await fs.ensureDir(path.join(cwd, '.rigour'));
|
|
87
|
+
await fs.writeFile(checkpointPath, JSON.stringify(session, null, 2));
|
|
88
|
+
await logStudioEvent(cwd, { type: "checkpoint_recorded", requestId, checkpointId, progressPct, qualityScore, warnings });
|
|
89
|
+
let text = `📍 CHECKPOINT RECORDED: ${checkpointId}\n\n`;
|
|
90
|
+
text += `Progress: ${progressPct}% | Quality: ${qualityScore}%\n`;
|
|
91
|
+
text += `Summary: ${summary}\n`;
|
|
92
|
+
text += `Total checkpoints: ${session.checkpoints.length}\n`;
|
|
93
|
+
if (warnings.length > 0) {
|
|
94
|
+
text += `\n⚠️ WARNINGS:\n${warnings.map(w => ` - ${w}`).join('\n')}\n`;
|
|
95
|
+
if (qualityScore < 80)
|
|
96
|
+
text += `\n⛔ QUALITY BELOW THRESHOLD: Consider pausing and reviewing recent work.`;
|
|
97
|
+
}
|
|
98
|
+
const result = { content: [{ type: "text", text }] };
|
|
99
|
+
result._shouldContinue = qualityScore >= 80;
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
// ─── Handoff ──────────────────────────────────────────────────────
|
|
103
|
+
export async function handleHandoff(cwd, fromAgentId, toAgentId, taskDescription, filesInScope, context, requestId) {
|
|
104
|
+
const handoffId = `handoff-${Date.now()}`;
|
|
105
|
+
const handoffPath = path.join(cwd, '.rigour', 'handoffs.jsonl');
|
|
106
|
+
const handoff = {
|
|
107
|
+
handoffId,
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
fromAgentId, toAgentId, taskDescription, filesInScope, context,
|
|
110
|
+
status: 'pending',
|
|
111
|
+
};
|
|
112
|
+
await fs.ensureDir(path.join(cwd, '.rigour'));
|
|
113
|
+
await fs.appendFile(handoffPath, JSON.stringify(handoff) + '\n');
|
|
114
|
+
await logStudioEvent(cwd, { type: "handoff_initiated", requestId, handoffId, fromAgentId, toAgentId, taskDescription });
|
|
115
|
+
let text = `🤝 HANDOFF INITIATED: ${handoffId}\n\n`;
|
|
116
|
+
text += `From: ${fromAgentId} → To: ${toAgentId}\n`;
|
|
117
|
+
text += `Task: ${taskDescription}\n`;
|
|
118
|
+
if (filesInScope.length > 0)
|
|
119
|
+
text += `Files in scope: ${filesInScope.join(', ')}\n`;
|
|
120
|
+
if (context)
|
|
121
|
+
text += `Context: ${context}\n`;
|
|
122
|
+
text += `\nThe receiving agent should call rigour_agent_register to claim this scope.`;
|
|
123
|
+
return { content: [{ type: "text", text }] };
|
|
124
|
+
}
|
|
125
|
+
// ─── Agent Deregister ─────────────────────────────────────────────
|
|
126
|
+
export async function handleAgentDeregister(cwd, agentId, requestId) {
|
|
127
|
+
const sessionPath = path.join(cwd, '.rigour', 'agent-session.json');
|
|
128
|
+
if (!await fs.pathExists(sessionPath)) {
|
|
129
|
+
return { content: [{ type: "text", text: `❌ No active agent session found.` }] };
|
|
130
|
+
}
|
|
131
|
+
const session = JSON.parse(await fs.readFile(sessionPath, 'utf-8'));
|
|
132
|
+
const initialCount = session.agents.length;
|
|
133
|
+
session.agents = session.agents.filter((a) => a.agentId !== agentId);
|
|
134
|
+
if (session.agents.length === initialCount) {
|
|
135
|
+
return { content: [{ type: "text", text: `❌ Agent "${agentId}" not found in session.` }] };
|
|
136
|
+
}
|
|
137
|
+
await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));
|
|
138
|
+
await logStudioEvent(cwd, { type: "agent_deregistered", requestId, agentId, remainingAgents: session.agents.length });
|
|
139
|
+
let text = `✅ AGENT DEREGISTERED: "${agentId}" has been removed from the session.\n\n`;
|
|
140
|
+
text += `Remaining agents: ${session.agents.length}\n`;
|
|
141
|
+
if (session.agents.length > 0) {
|
|
142
|
+
text += `Active: ${session.agents.map((a) => a.agentId).join(', ')}`;
|
|
143
|
+
}
|
|
144
|
+
return { content: [{ type: "text", text }] };
|
|
145
|
+
}
|
|
146
|
+
// ─── Handoff Accept ───────────────────────────────────────────────
|
|
147
|
+
export async function handleHandoffAccept(cwd, handoffId, agentId, requestId) {
|
|
148
|
+
const handoffPath = path.join(cwd, '.rigour', 'handoffs.jsonl');
|
|
149
|
+
if (!await fs.pathExists(handoffPath)) {
|
|
150
|
+
return { content: [{ type: "text", text: `❌ No handoffs found.` }] };
|
|
151
|
+
}
|
|
152
|
+
const content = await fs.readFile(handoffPath, 'utf-8');
|
|
153
|
+
const handoffs = content.trim().split('\n').filter(l => l).map(line => JSON.parse(line));
|
|
154
|
+
const handoff = handoffs.find((h) => h.handoffId === handoffId);
|
|
155
|
+
if (!handoff) {
|
|
156
|
+
return { content: [{ type: "text", text: `❌ Handoff "${handoffId}" not found.` }] };
|
|
157
|
+
}
|
|
158
|
+
if (handoff.toAgentId !== agentId) {
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: "text", text: `❌ Agent "${agentId}" is not the intended recipient.\nHandoff is for: ${handoff.toAgentId}` }],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
handoff.status = 'accepted';
|
|
165
|
+
handoff.acceptedAt = new Date().toISOString();
|
|
166
|
+
handoff.acceptedBy = agentId;
|
|
167
|
+
const updatedContent = handoffs.map((h) => JSON.stringify(h)).join('\n') + '\n';
|
|
168
|
+
await fs.writeFile(handoffPath, updatedContent);
|
|
169
|
+
await logStudioEvent(cwd, { type: "handoff_accepted", requestId, handoffId, acceptedBy: agentId, fromAgentId: handoff.fromAgentId });
|
|
170
|
+
let text = `✅ HANDOFF ACCEPTED: ${handoffId}\n\n`;
|
|
171
|
+
text += `From: ${handoff.fromAgentId}\nTask: ${handoff.taskDescription}\n`;
|
|
172
|
+
if (handoff.filesInScope?.length > 0)
|
|
173
|
+
text += `Files in scope: ${handoff.filesInScope.join(', ')}\n`;
|
|
174
|
+
text += `\nYou should now call rigour_agent_register to formally claim the scope.`;
|
|
175
|
+
return { content: [{ type: "text", text }] };
|
|
176
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Definitions
|
|
3
|
+
*
|
|
4
|
+
* Schema definitions for all Rigour MCP tools.
|
|
5
|
+
* Each tool has a name, description, and JSON Schema for its input.
|
|
6
|
+
*
|
|
7
|
+
* @since v2.17.0 — extracted from monolithic index.ts
|
|
8
|
+
*/
|
|
9
|
+
export declare const TOOL_DEFINITIONS: ({
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: string;
|
|
14
|
+
properties: {
|
|
15
|
+
cwd: {
|
|
16
|
+
type: "string";
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
required: string[];
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: string;
|
|
27
|
+
properties: {
|
|
28
|
+
key: {
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
value: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
cwd: {
|
|
37
|
+
type: "string";
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
required: string[];
|
|
42
|
+
};
|
|
43
|
+
} | {
|
|
44
|
+
name: string;
|
|
45
|
+
description: string;
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: string;
|
|
48
|
+
properties: {
|
|
49
|
+
key: {
|
|
50
|
+
type: string;
|
|
51
|
+
description: string;
|
|
52
|
+
};
|
|
53
|
+
cwd: {
|
|
54
|
+
type: "string";
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
required: string[];
|
|
59
|
+
};
|
|
60
|
+
} | {
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: string;
|
|
65
|
+
properties: {
|
|
66
|
+
name: {
|
|
67
|
+
type: string;
|
|
68
|
+
description: string;
|
|
69
|
+
};
|
|
70
|
+
type: {
|
|
71
|
+
type: string;
|
|
72
|
+
description: string;
|
|
73
|
+
};
|
|
74
|
+
intent: {
|
|
75
|
+
type: string;
|
|
76
|
+
description: string;
|
|
77
|
+
};
|
|
78
|
+
cwd: {
|
|
79
|
+
type: "string";
|
|
80
|
+
description: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
required: string[];
|
|
84
|
+
};
|
|
85
|
+
} | {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: string;
|
|
90
|
+
properties: {
|
|
91
|
+
command: {
|
|
92
|
+
type: string;
|
|
93
|
+
description: string;
|
|
94
|
+
};
|
|
95
|
+
silent: {
|
|
96
|
+
type: string;
|
|
97
|
+
description: string;
|
|
98
|
+
};
|
|
99
|
+
cwd: {
|
|
100
|
+
type: "string";
|
|
101
|
+
description: string;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
required: string[];
|
|
105
|
+
};
|
|
106
|
+
} | {
|
|
107
|
+
name: string;
|
|
108
|
+
description: string;
|
|
109
|
+
inputSchema: {
|
|
110
|
+
type: string;
|
|
111
|
+
properties: {
|
|
112
|
+
command: {
|
|
113
|
+
type: string;
|
|
114
|
+
description: string;
|
|
115
|
+
};
|
|
116
|
+
maxRetries: {
|
|
117
|
+
type: string;
|
|
118
|
+
description: string;
|
|
119
|
+
};
|
|
120
|
+
dryRun: {
|
|
121
|
+
type: string;
|
|
122
|
+
description: string;
|
|
123
|
+
};
|
|
124
|
+
cwd: {
|
|
125
|
+
type: "string";
|
|
126
|
+
description: string;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
required: string[];
|
|
130
|
+
};
|
|
131
|
+
} | {
|
|
132
|
+
name: string;
|
|
133
|
+
description: string;
|
|
134
|
+
inputSchema: {
|
|
135
|
+
type: string;
|
|
136
|
+
properties: {
|
|
137
|
+
agentId: {
|
|
138
|
+
type: string;
|
|
139
|
+
description: string;
|
|
140
|
+
};
|
|
141
|
+
taskScope: {
|
|
142
|
+
type: string;
|
|
143
|
+
items: {
|
|
144
|
+
type: string;
|
|
145
|
+
};
|
|
146
|
+
description: string;
|
|
147
|
+
};
|
|
148
|
+
cwd: {
|
|
149
|
+
type: "string";
|
|
150
|
+
description: string;
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
required: string[];
|
|
154
|
+
};
|
|
155
|
+
} | {
|
|
156
|
+
name: string;
|
|
157
|
+
description: string;
|
|
158
|
+
inputSchema: {
|
|
159
|
+
type: string;
|
|
160
|
+
properties: {
|
|
161
|
+
progressPct: {
|
|
162
|
+
type: string;
|
|
163
|
+
description: string;
|
|
164
|
+
};
|
|
165
|
+
filesChanged: {
|
|
166
|
+
type: string;
|
|
167
|
+
items: {
|
|
168
|
+
type: string;
|
|
169
|
+
};
|
|
170
|
+
description: string;
|
|
171
|
+
};
|
|
172
|
+
summary: {
|
|
173
|
+
type: string;
|
|
174
|
+
description: string;
|
|
175
|
+
};
|
|
176
|
+
qualityScore: {
|
|
177
|
+
type: string;
|
|
178
|
+
description: string;
|
|
179
|
+
};
|
|
180
|
+
cwd: {
|
|
181
|
+
type: "string";
|
|
182
|
+
description: string;
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
required: string[];
|
|
186
|
+
};
|
|
187
|
+
} | {
|
|
188
|
+
name: string;
|
|
189
|
+
description: string;
|
|
190
|
+
inputSchema: {
|
|
191
|
+
type: string;
|
|
192
|
+
properties: {
|
|
193
|
+
fromAgentId: {
|
|
194
|
+
type: string;
|
|
195
|
+
description: string;
|
|
196
|
+
};
|
|
197
|
+
toAgentId: {
|
|
198
|
+
type: string;
|
|
199
|
+
description: string;
|
|
200
|
+
};
|
|
201
|
+
taskDescription: {
|
|
202
|
+
type: string;
|
|
203
|
+
description: string;
|
|
204
|
+
};
|
|
205
|
+
filesInScope: {
|
|
206
|
+
type: string;
|
|
207
|
+
items: {
|
|
208
|
+
type: string;
|
|
209
|
+
};
|
|
210
|
+
description: string;
|
|
211
|
+
};
|
|
212
|
+
context: {
|
|
213
|
+
type: string;
|
|
214
|
+
description: string;
|
|
215
|
+
};
|
|
216
|
+
cwd: {
|
|
217
|
+
type: "string";
|
|
218
|
+
description: string;
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
required: string[];
|
|
222
|
+
};
|
|
223
|
+
} | {
|
|
224
|
+
name: string;
|
|
225
|
+
description: string;
|
|
226
|
+
inputSchema: {
|
|
227
|
+
type: string;
|
|
228
|
+
properties: {
|
|
229
|
+
agentId: {
|
|
230
|
+
type: string;
|
|
231
|
+
description: string;
|
|
232
|
+
};
|
|
233
|
+
cwd: {
|
|
234
|
+
type: "string";
|
|
235
|
+
description: string;
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
required: string[];
|
|
239
|
+
};
|
|
240
|
+
} | {
|
|
241
|
+
name: string;
|
|
242
|
+
description: string;
|
|
243
|
+
inputSchema: {
|
|
244
|
+
type: string;
|
|
245
|
+
properties: {
|
|
246
|
+
handoffId: {
|
|
247
|
+
type: string;
|
|
248
|
+
description: string;
|
|
249
|
+
};
|
|
250
|
+
agentId: {
|
|
251
|
+
type: string;
|
|
252
|
+
description: string;
|
|
253
|
+
};
|
|
254
|
+
cwd: {
|
|
255
|
+
type: "string";
|
|
256
|
+
description: string;
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
required: string[];
|
|
260
|
+
};
|
|
261
|
+
} | {
|
|
262
|
+
name: string;
|
|
263
|
+
description: string;
|
|
264
|
+
inputSchema: {
|
|
265
|
+
type: string;
|
|
266
|
+
properties: {
|
|
267
|
+
repository: {
|
|
268
|
+
type: string;
|
|
269
|
+
description: string;
|
|
270
|
+
};
|
|
271
|
+
branch: {
|
|
272
|
+
type: string;
|
|
273
|
+
description: string;
|
|
274
|
+
};
|
|
275
|
+
diff: {
|
|
276
|
+
type: string;
|
|
277
|
+
description: string;
|
|
278
|
+
};
|
|
279
|
+
files: {
|
|
280
|
+
type: string;
|
|
281
|
+
items: {
|
|
282
|
+
type: string;
|
|
283
|
+
};
|
|
284
|
+
description: string;
|
|
285
|
+
};
|
|
286
|
+
cwd: {
|
|
287
|
+
type: "string";
|
|
288
|
+
description: string;
|
|
289
|
+
};
|
|
290
|
+
};
|
|
291
|
+
required: string[];
|
|
292
|
+
};
|
|
293
|
+
})[];
|