@zhixuan92/multi-model-agent-mcp 1.0.0 → 1.1.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 +34 -194
- package/dist/cli.d.ts +6 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -37
- package/dist/cli.js.map +1 -1
- package/dist/tools/audit-document.d.ts +21 -3
- package/dist/tools/audit-document.d.ts.map +1 -1
- package/dist/tools/audit-document.js +57 -11
- package/dist/tools/audit-document.js.map +1 -1
- package/dist/tools/batch-response.d.ts +21 -0
- package/dist/tools/batch-response.d.ts.map +1 -0
- package/dist/tools/batch-response.js +78 -0
- package/dist/tools/batch-response.js.map +1 -0
- package/dist/tools/debug-task.d.ts +8 -0
- package/dist/tools/debug-task.d.ts.map +1 -1
- package/dist/tools/debug-task.js +16 -11
- package/dist/tools/debug-task.js.map +1 -1
- package/dist/tools/review-code.d.ts +13 -1
- package/dist/tools/review-code.d.ts.map +1 -1
- package/dist/tools/review-code.js +45 -11
- package/dist/tools/review-code.js.map +1 -1
- package/dist/tools/shared.d.ts +31 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +72 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/verify-work.d.ts +9 -1
- package/dist/tools/verify-work.d.ts.map +1 -1
- package/dist/tools/verify-work.js +38 -13
- package/dist/tools/verify-work.js.map +1 -1
- package/package.json +3 -7
- package/dist/tools/execute-plan-task.d.ts +0 -26
- package/dist/tools/execute-plan-task.d.ts.map +0 -1
- package/dist/tools/execute-plan-task.js +0 -49
- package/dist/tools/execute-plan-task.js.map +0 -1
|
@@ -1,23 +1,69 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { runTasks } from '@zhixuan92/multi-model-agent-core/run-tasks';
|
|
3
|
+
import { commonToolFields, validateInput, resolveDispatchMode, buildMetadataBlock, buildFilePathsPrompt, buildPerFilePrompt, applyCommonFields, } from './shared.js';
|
|
4
|
+
import { buildFanOutResponse } from './batch-response.js';
|
|
3
5
|
export const auditDocumentSchema = z.object({
|
|
4
|
-
document: z.string().describe('
|
|
5
|
-
auditType: z.
|
|
6
|
+
document: z.string().optional().describe('Inline document content to audit'),
|
|
7
|
+
auditType: z.union([
|
|
8
|
+
z.enum(['security', 'performance', 'correctness', 'style', 'general']),
|
|
9
|
+
z.array(z.enum(['security', 'performance', 'correctness', 'style'])).min(1),
|
|
10
|
+
]).describe('Audit focus. Single string or array of types. "general" = all four categories.'),
|
|
11
|
+
outputFormat: z.enum(['json', 'markdown']).optional()
|
|
12
|
+
.describe('Output format. json returns structured findings array.'),
|
|
6
13
|
agentType: z.enum(['standard', 'complex']).optional(),
|
|
14
|
+
...commonToolFields,
|
|
7
15
|
});
|
|
16
|
+
function resolveAuditTypeText(auditType) {
|
|
17
|
+
if (auditType === 'general')
|
|
18
|
+
return 'security, performance, correctness, and style';
|
|
19
|
+
if (Array.isArray(auditType))
|
|
20
|
+
return auditType.join(', ');
|
|
21
|
+
return auditType;
|
|
22
|
+
}
|
|
23
|
+
function buildAuditPrompt(auditTypeText, document, filePaths, outputFormat) {
|
|
24
|
+
const parts = [`Audit for ${auditTypeText} issues.`];
|
|
25
|
+
if (outputFormat === 'json') {
|
|
26
|
+
parts.push('Return findings as a JSON array of objects with keys: severity, category, finding, recommendation.');
|
|
27
|
+
}
|
|
28
|
+
if (document)
|
|
29
|
+
parts.push(`Document:\n\n${document}`);
|
|
30
|
+
const fileSection = buildFilePathsPrompt(filePaths);
|
|
31
|
+
if (fileSection)
|
|
32
|
+
parts.push(fileSection);
|
|
33
|
+
parts.push('Provide a structured audit report with findings and severity.');
|
|
34
|
+
return parts.join('\n\n');
|
|
35
|
+
}
|
|
8
36
|
export function registerAuditDocument(server, config) {
|
|
9
|
-
server.tool('audit_document', 'Audit
|
|
37
|
+
server.tool('audit_document', 'Audit documents or files for issues. Accepts inline content or file paths \u2014 multiple files are audited in parallel, each as a separate task. Preset: complex agent, no review pipeline. Use this for any audit task. Use delegate_tasks only for custom pipeline config or tasks that don\'t match a specialized tool.', auditDocumentSchema.shape, async (params) => {
|
|
38
|
+
const validation = validateInput(params.document, params.filePaths);
|
|
39
|
+
if (!validation.valid) {
|
|
40
|
+
return { content: [{ type: 'text', text: `Error: ${validation.message}` }], isError: true };
|
|
41
|
+
}
|
|
10
42
|
const agentType = params.agentType ?? 'complex';
|
|
11
|
-
const
|
|
12
|
-
|
|
43
|
+
const auditTypeText = resolveAuditTypeText(params.auditType);
|
|
44
|
+
const baseTaskSpec = applyCommonFields({
|
|
45
|
+
agentType,
|
|
46
|
+
reviewPolicy: 'off',
|
|
47
|
+
...(params.outputFormat && { formatConstraints: { outputFormat: params.outputFormat } }),
|
|
48
|
+
}, params);
|
|
13
49
|
try {
|
|
14
|
-
const
|
|
50
|
+
const mode = resolveDispatchMode(params.document, params.filePaths);
|
|
51
|
+
if (mode === 'fan_out') {
|
|
52
|
+
const validPaths = params.filePaths.filter(p => p.trim().length > 0);
|
|
53
|
+
const promptTemplate = buildAuditPrompt(auditTypeText, undefined, undefined, params.outputFormat);
|
|
54
|
+
const tasks = validPaths.map(fp => ({
|
|
55
|
+
...baseTaskSpec,
|
|
56
|
+
prompt: buildPerFilePrompt(fp, promptTemplate),
|
|
57
|
+
}));
|
|
58
|
+
const startMs = Date.now();
|
|
59
|
+
const results = await runTasks(tasks, config);
|
|
60
|
+
return { content: [buildFanOutResponse(results, tasks, Date.now() - startMs)] };
|
|
61
|
+
}
|
|
62
|
+
// Single-task mode
|
|
63
|
+
const prompt = buildAuditPrompt(auditTypeText, params.document, params.filePaths, params.outputFormat);
|
|
64
|
+
const results = await runTasks([{ ...baseTaskSpec, prompt }], config);
|
|
15
65
|
const result = results[0];
|
|
16
|
-
return {
|
|
17
|
-
content: [
|
|
18
|
-
{ type: 'text', text: result.output },
|
|
19
|
-
],
|
|
20
|
-
};
|
|
66
|
+
return { content: [{ type: 'text', text: result.output }, buildMetadataBlock(result)] };
|
|
21
67
|
}
|
|
22
68
|
catch (err) {
|
|
23
69
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-document.js","sourceRoot":"","sources":["../../src/tools/audit-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-document.js","sourceRoot":"","sources":["../../src/tools/audit-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RunResult, TaskSpec, BatchTimings, BatchProgress, BatchAggregateCost } from '@zhixuan92/multi-model-agent-core';
|
|
2
|
+
/**
|
|
3
|
+
* Compute per-batch timing metrics.
|
|
4
|
+
*/
|
|
5
|
+
export declare function computeTimings(wallClockMs: number, results: RunResult[]): BatchTimings;
|
|
6
|
+
/**
|
|
7
|
+
* Compute per-batch progress summary.
|
|
8
|
+
*/
|
|
9
|
+
export declare function computeBatchProgress(results: RunResult[]): BatchProgress;
|
|
10
|
+
/**
|
|
11
|
+
* Compute aggregate cost across all tasks.
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeAggregateCost(results: RunResult[]): BatchAggregateCost;
|
|
14
|
+
/**
|
|
15
|
+
* Build a fan-out response for specialized tools. No batchId (not cache-backed).
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildFanOutResponse(results: RunResult[], tasks: TaskSpec[], wallClockMs: number): {
|
|
18
|
+
type: 'text';
|
|
19
|
+
text: string;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=batch-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-response.d.ts","sourceRoot":"","sources":["../../src/tools/batch-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,YAAY,CAItF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAgBxE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAiB7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAAE,EACpB,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiChC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute per-batch timing metrics.
|
|
3
|
+
*/
|
|
4
|
+
export function computeTimings(wallClockMs, results) {
|
|
5
|
+
const sumOfTaskMs = results.reduce((sum, r) => sum + (r.durationMs ?? 0), 0);
|
|
6
|
+
const estimatedParallelSavingsMs = Math.max(0, sumOfTaskMs - wallClockMs);
|
|
7
|
+
return { wallClockMs, sumOfTaskMs, estimatedParallelSavingsMs };
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Compute per-batch progress summary.
|
|
11
|
+
*/
|
|
12
|
+
export function computeBatchProgress(results) {
|
|
13
|
+
const totalTasks = results.length;
|
|
14
|
+
const completedTasks = results.filter((r) => r.status === 'ok').length;
|
|
15
|
+
const incompleteTasks = results.filter((r) => r.status === 'incomplete' || r.status === 'max_turns' || r.status === 'timeout').length;
|
|
16
|
+
const failedTasks = results.filter((r) => r.status === 'error' ||
|
|
17
|
+
r.status === 'api_aborted' ||
|
|
18
|
+
r.status === 'api_error' ||
|
|
19
|
+
r.status === 'network_error').length;
|
|
20
|
+
const successPercent = totalTasks === 0 ? 0 : Math.round((completedTasks / totalTasks) * 1000) / 10;
|
|
21
|
+
return { totalTasks, completedTasks, incompleteTasks, failedTasks, successPercent };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compute aggregate cost across all tasks.
|
|
25
|
+
*/
|
|
26
|
+
export function computeAggregateCost(results) {
|
|
27
|
+
let totalActualCostUSD = 0;
|
|
28
|
+
let totalSavedCostUSD = 0;
|
|
29
|
+
for (const r of results) {
|
|
30
|
+
if (r.usage.costUSD !== null && r.usage.costUSD !== undefined) {
|
|
31
|
+
totalActualCostUSD += r.usage.costUSD;
|
|
32
|
+
}
|
|
33
|
+
if (r.usage.savedCostUSD !== null && r.usage.savedCostUSD !== undefined) {
|
|
34
|
+
totalSavedCostUSD += r.usage.savedCostUSD;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
totalActualCostUSD,
|
|
39
|
+
totalSavedCostUSD,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a fan-out response for specialized tools. No batchId (not cache-backed).
|
|
44
|
+
*/
|
|
45
|
+
export function buildFanOutResponse(results, tasks, wallClockMs) {
|
|
46
|
+
const timings = computeTimings(wallClockMs, results);
|
|
47
|
+
const batchProgress = computeBatchProgress(results);
|
|
48
|
+
const aggregateCost = computeAggregateCost(results);
|
|
49
|
+
return {
|
|
50
|
+
type: 'text',
|
|
51
|
+
text: JSON.stringify({
|
|
52
|
+
schemaVersion: '1.0.0',
|
|
53
|
+
mode: 'fan_out',
|
|
54
|
+
timings,
|
|
55
|
+
batchProgress,
|
|
56
|
+
aggregateCost,
|
|
57
|
+
results: results.map((r, i) => ({
|
|
58
|
+
agentType: tasks[i]?.agentType ?? '(auto)',
|
|
59
|
+
status: r.status,
|
|
60
|
+
output: r.output,
|
|
61
|
+
turns: r.turns,
|
|
62
|
+
durationMs: r.durationMs,
|
|
63
|
+
filesRead: r.filesRead,
|
|
64
|
+
filesWritten: r.filesWritten,
|
|
65
|
+
directoriesListed: r.directoriesListed,
|
|
66
|
+
toolCalls: r.toolCalls,
|
|
67
|
+
escalationLog: r.escalationLog,
|
|
68
|
+
usage: r.usage,
|
|
69
|
+
workerStatus: r.workerStatus,
|
|
70
|
+
specReviewStatus: r.specReviewStatus,
|
|
71
|
+
qualityReviewStatus: r.qualityReviewStatus,
|
|
72
|
+
agents: r.agents,
|
|
73
|
+
...(r.error && { error: r.error }),
|
|
74
|
+
})),
|
|
75
|
+
}, null, 2),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=batch-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-response.js","sourceRoot":"","sources":["../../src/tools/batch-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,14 @@ import { z } from 'zod';
|
|
|
2
2
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import type { MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
|
|
4
4
|
export declare const debugTaskSchema: z.ZodObject<{
|
|
5
|
+
filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
contextBlockIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
tools: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
readonly: "readonly";
|
|
10
|
+
none: "none";
|
|
11
|
+
full: "full";
|
|
12
|
+
}>>;
|
|
5
13
|
problem: z.ZodString;
|
|
6
14
|
context: z.ZodOptional<z.ZodString>;
|
|
7
15
|
hypothesis: z.ZodOptional<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-task.d.ts","sourceRoot":"","sources":["../../src/tools/debug-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"debug-task.d.ts","sourceRoot":"","sources":["../../src/tools/debug-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,mCAAmC,CAAC;AASpF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;iBAM1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QAgC5E"}
|
package/dist/tools/debug-task.js
CHANGED
|
@@ -1,26 +1,31 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { runTasks } from '@zhixuan92/multi-model-agent-core/run-tasks';
|
|
3
|
+
import { commonToolFields, buildMetadataBlock, buildFilePathsPrompt, applyCommonFields, } from './shared.js';
|
|
3
4
|
export const debugTaskSchema = z.object({
|
|
4
5
|
problem: z.string().describe('Description of the problem to debug'),
|
|
5
6
|
context: z.string().optional().describe('Additional context about the problem'),
|
|
6
7
|
hypothesis: z.string().optional().describe('Initial hypothesis about the cause'),
|
|
7
8
|
agentType: z.enum(['standard', 'complex']).optional(),
|
|
9
|
+
...commonToolFields,
|
|
8
10
|
});
|
|
9
11
|
export function registerDebugTask(server, config) {
|
|
10
|
-
server.tool('debug_task', 'Debug a problem using hypothesis-driven
|
|
12
|
+
server.tool('debug_task', 'Debug a problem using hypothesis-driven investigation. Always single-task \u2014 file paths provide context for the investigation. Preset: complex agent, 1 review round. Use delegate_tasks only for custom pipeline config.', debugTaskSchema.shape, async (params) => {
|
|
11
13
|
const agentType = params.agentType ?? 'complex';
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
(
|
|
15
|
-
|
|
14
|
+
const parts = [`Debug this problem:\n\n${params.problem}`];
|
|
15
|
+
if (params.context)
|
|
16
|
+
parts.push(`Context: ${params.context}`);
|
|
17
|
+
if (params.hypothesis)
|
|
18
|
+
parts.push(`Initial hypothesis: ${params.hypothesis}`);
|
|
19
|
+
const fileSection = buildFilePathsPrompt(params.filePaths);
|
|
20
|
+
if (fileSection)
|
|
21
|
+
parts.push(fileSection);
|
|
22
|
+
parts.push('Use hypothesis-driven debugging: identify root cause, propose fix, verify.');
|
|
23
|
+
const prompt = parts.join('\n\n');
|
|
24
|
+
const taskSpec = applyCommonFields({ agentType, reviewPolicy: 'full', maxReviewRounds: 1 }, params);
|
|
16
25
|
try {
|
|
17
|
-
const results = await runTasks([{
|
|
26
|
+
const results = await runTasks([{ ...taskSpec, prompt }], config);
|
|
18
27
|
const result = results[0];
|
|
19
|
-
return {
|
|
20
|
-
content: [
|
|
21
|
-
{ type: 'text', text: result.output },
|
|
22
|
-
],
|
|
23
|
-
};
|
|
28
|
+
return { content: [{ type: 'text', text: result.output }, buildMetadataBlock(result)] };
|
|
24
29
|
}
|
|
25
30
|
catch (err) {
|
|
26
31
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-task.js","sourceRoot":"","sources":["../../src/tools/debug-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"debug-task.js","sourceRoot":"","sources":["../../src/tools/debug-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC/E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAChF,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,GAAG,gBAAgB;CACpB,CAAC,CAAC;AAIH,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAwB;IAC3E,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,+NAA+N,EAC/N,eAAe,CAAC,KAAK,EACrB,KAAK,EAAE,MAAuB,EAAE,EAAE;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;QAChD,MAAM,KAAK,GAAa,CAAC,0BAA0B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAsB,iBAAiB,CACnD,EAAE,SAAS,EAAE,YAAY,EAAE,MAAe,EAAE,eAAe,EAAE,CAAC,EAAE,EAChE,MAAM,CACP,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACxG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,13 +2,25 @@ import { z } from 'zod';
|
|
|
2
2
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import type { MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
|
|
4
4
|
export declare const reviewCodeSchema: z.ZodObject<{
|
|
5
|
-
|
|
5
|
+
filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
contextBlockIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
tools: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
readonly: "readonly";
|
|
10
|
+
none: "none";
|
|
11
|
+
full: "full";
|
|
12
|
+
}>>;
|
|
13
|
+
code: z.ZodOptional<z.ZodString>;
|
|
6
14
|
focus: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
7
15
|
security: "security";
|
|
8
16
|
performance: "performance";
|
|
9
17
|
correctness: "correctness";
|
|
10
18
|
style: "style";
|
|
11
19
|
}>>>;
|
|
20
|
+
outputFormat: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
json: "json";
|
|
22
|
+
markdown: "markdown";
|
|
23
|
+
}>>;
|
|
12
24
|
agentType: z.ZodOptional<z.ZodEnum<{
|
|
13
25
|
standard: "standard";
|
|
14
26
|
complex: "complex";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-code.d.ts","sourceRoot":"","sources":["../../src/tools/review-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"review-code.d.ts","sourceRoot":"","sources":["../../src/tools/review-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,mCAAmC,CAAC;AAapF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBAM3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAoBhE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QAiD7E"}
|
|
@@ -1,24 +1,58 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { runTasks } from '@zhixuan92/multi-model-agent-core/run-tasks';
|
|
3
|
+
import { commonToolFields, validateInput, resolveDispatchMode, buildMetadataBlock, buildFilePathsPrompt, buildPerFilePrompt, applyCommonFields, } from './shared.js';
|
|
4
|
+
import { buildFanOutResponse } from './batch-response.js';
|
|
3
5
|
export const reviewCodeSchema = z.object({
|
|
4
|
-
code: z.string().describe('
|
|
6
|
+
code: z.string().optional().describe('Inline code to review'),
|
|
5
7
|
focus: z.array(z.enum(['security', 'performance', 'correctness', 'style'])).optional(),
|
|
8
|
+
outputFormat: z.enum(['json', 'markdown']).optional(),
|
|
6
9
|
agentType: z.enum(['standard', 'complex']).optional(),
|
|
10
|
+
...commonToolFields,
|
|
7
11
|
});
|
|
12
|
+
function buildReviewPrompt(code, filePaths, focus, outputFormat) {
|
|
13
|
+
const parts = ['Review this code:'];
|
|
14
|
+
if (code)
|
|
15
|
+
parts.push(`\`\`\`\n${code}\n\`\`\``);
|
|
16
|
+
const fileSection = buildFilePathsPrompt(filePaths);
|
|
17
|
+
if (fileSection)
|
|
18
|
+
parts.push(fileSection);
|
|
19
|
+
if (focus && focus.length > 0)
|
|
20
|
+
parts.push(`Focus areas: ${focus.join(', ')}.`);
|
|
21
|
+
if (outputFormat === 'json') {
|
|
22
|
+
parts.push('Return findings as a JSON array of objects with keys: severity, category, file, line, finding, recommendation.');
|
|
23
|
+
}
|
|
24
|
+
parts.push('Provide a structured review with findings and recommendations.');
|
|
25
|
+
return parts.join('\n\n');
|
|
26
|
+
}
|
|
8
27
|
export function registerReviewCode(server, config) {
|
|
9
|
-
server.tool('review_code', 'Review code
|
|
28
|
+
server.tool('review_code', 'Review code with the full quality pipeline (spec review + quality review). Accepts inline code or file paths \u2014 multiple files are reviewed in parallel. Preset: complex agent, full review. Use this when code needs thorough review. Use delegate_tasks only for custom pipeline config.', reviewCodeSchema.shape, async (params) => {
|
|
29
|
+
const validation = validateInput(params.code, params.filePaths);
|
|
30
|
+
if (!validation.valid) {
|
|
31
|
+
return { content: [{ type: 'text', text: `Error: ${validation.message}` }], isError: true };
|
|
32
|
+
}
|
|
10
33
|
const agentType = params.agentType ?? 'complex';
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
34
|
+
const baseTaskSpec = applyCommonFields({
|
|
35
|
+
agentType,
|
|
36
|
+
reviewPolicy: 'full',
|
|
37
|
+
...(params.outputFormat && { formatConstraints: { outputFormat: params.outputFormat } }),
|
|
38
|
+
}, params);
|
|
14
39
|
try {
|
|
15
|
-
const
|
|
40
|
+
const mode = resolveDispatchMode(params.code, params.filePaths);
|
|
41
|
+
if (mode === 'fan_out') {
|
|
42
|
+
const validPaths = params.filePaths.filter(p => p.trim().length > 0);
|
|
43
|
+
const promptTemplate = buildReviewPrompt(undefined, undefined, params.focus, params.outputFormat);
|
|
44
|
+
const tasks = validPaths.map(fp => ({
|
|
45
|
+
...baseTaskSpec,
|
|
46
|
+
prompt: buildPerFilePrompt(fp, promptTemplate),
|
|
47
|
+
}));
|
|
48
|
+
const startMs = Date.now();
|
|
49
|
+
const results = await runTasks(tasks, config);
|
|
50
|
+
return { content: [buildFanOutResponse(results, tasks, Date.now() - startMs)] };
|
|
51
|
+
}
|
|
52
|
+
const prompt = buildReviewPrompt(params.code, params.filePaths, params.focus, params.outputFormat);
|
|
53
|
+
const results = await runTasks([{ ...baseTaskSpec, prompt }], config);
|
|
16
54
|
const result = results[0];
|
|
17
|
-
return {
|
|
18
|
-
content: [
|
|
19
|
-
{ type: 'text', text: result.output },
|
|
20
|
-
],
|
|
21
|
-
};
|
|
55
|
+
return { content: [{ type: 'text', text: result.output }, buildMetadataBlock(result)] };
|
|
22
56
|
}
|
|
23
57
|
catch (err) {
|
|
24
58
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-code.js","sourceRoot":"","sources":["../../src/tools/review-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"review-code.js","sourceRoot":"","sources":["../../src/tools/review-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC7D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtF,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,GAAG,gBAAgB;CACpB,CAAC,CAAC;AAIH,SAAS,iBAAiB,CACxB,IAAwB,EACxB,SAA+B,EAC/B,KAA2B,EAC3B,YAAgC;IAEhC,MAAM,KAAK,GAAa,CAAC,mBAAmB,CAAC,CAAC;IAC9C,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,gHAAgH,CAAC,CAAC;IAC/H,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAwB;IAC5E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gSAAgS,EAChS,gBAAgB,CAAC,KAAK,EACtB,KAAK,EAAE,MAAwB,EAAE,EAAE;QACjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvG,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;QAChD,MAAM,YAAY,GAAsB,iBAAiB,CACvD;YACE,SAAS;YACT,YAAY,EAAE,MAAe;YAC7B,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,iBAAiB,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;SACzF,EACD,MAAM,CACP,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAEhE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,MAAM,CAAC,SAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtE,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClG,MAAM,KAAK,GAAe,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC9C,GAAG,YAAY;oBACf,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,cAAc,CAAC;iBAClC,CAAA,CAAC,CAAC;gBAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;YAClF,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACnG,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACxG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { TaskSpec, ToolMode, RunResult } from '@zhixuan92/multi-model-agent-core';
|
|
3
|
+
export declare const commonToolFields: {
|
|
4
|
+
filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
5
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
6
|
+
contextBlockIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
|
+
tools: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
readonly: "readonly";
|
|
9
|
+
none: "none";
|
|
10
|
+
full: "full";
|
|
11
|
+
}>>;
|
|
12
|
+
};
|
|
13
|
+
export declare function validateInput(inlineContent: string | undefined, filePaths: string[] | undefined): {
|
|
14
|
+
valid: true;
|
|
15
|
+
} | {
|
|
16
|
+
valid: false;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveDispatchMode(inlineContent: string | undefined, filePaths: string[] | undefined): 'single' | 'fan_out';
|
|
20
|
+
export declare function buildMetadataBlock(result: RunResult): {
|
|
21
|
+
type: 'text';
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function buildFilePathsPrompt(filePaths?: string[]): string;
|
|
25
|
+
export declare function buildPerFilePrompt(filePath: string, promptTemplate: string): string;
|
|
26
|
+
export declare function applyCommonFields(taskSpec: Partial<TaskSpec>, params: {
|
|
27
|
+
cwd?: string;
|
|
28
|
+
contextBlockIds?: string[];
|
|
29
|
+
tools?: ToolMode;
|
|
30
|
+
}): Partial<TaskSpec>;
|
|
31
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAEvF,eAAO,MAAM,gBAAgB;;;;;;;;;CAS5B,CAAC;AAUF,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAC9B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAKrD;AAED,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAC9B,QAAQ,GAAG,SAAS,CAKtB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBpF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAGjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC3B,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,GACrE,OAAO,CAAC,QAAQ,CAAC,CAMnB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const commonToolFields = {
|
|
3
|
+
filePaths: z.array(z.string()).optional()
|
|
4
|
+
.describe('File paths for the agent to work with. When provided without inline content, each file becomes a separate parallel task.'),
|
|
5
|
+
cwd: z.string().optional()
|
|
6
|
+
.describe('Working directory for file access. Defaults to server process.cwd().'),
|
|
7
|
+
contextBlockIds: z.array(z.string()).optional()
|
|
8
|
+
.describe('IDs of registered context blocks to prepend to prompt.'),
|
|
9
|
+
tools: z.enum(['none', 'readonly', 'full']).optional()
|
|
10
|
+
.describe('Tool access level for the sub-agent. Defaults to full.'),
|
|
11
|
+
};
|
|
12
|
+
function hasContent(value) {
|
|
13
|
+
return value !== undefined && value.trim().length > 0;
|
|
14
|
+
}
|
|
15
|
+
function hasValidPaths(paths) {
|
|
16
|
+
return Array.isArray(paths) && paths.some(p => p.trim().length > 0);
|
|
17
|
+
}
|
|
18
|
+
export function validateInput(inlineContent, filePaths) {
|
|
19
|
+
if (hasContent(inlineContent) || hasValidPaths(filePaths)) {
|
|
20
|
+
return { valid: true };
|
|
21
|
+
}
|
|
22
|
+
return { valid: false, message: 'Provide content or filePaths (or both)' };
|
|
23
|
+
}
|
|
24
|
+
export function resolveDispatchMode(inlineContent, filePaths) {
|
|
25
|
+
if (hasContent(inlineContent))
|
|
26
|
+
return 'single';
|
|
27
|
+
const validPaths = (filePaths ?? []).filter(p => p.trim().length > 0);
|
|
28
|
+
if (validPaths.length >= 2)
|
|
29
|
+
return 'fan_out';
|
|
30
|
+
return 'single';
|
|
31
|
+
}
|
|
32
|
+
export function buildMetadataBlock(result) {
|
|
33
|
+
return {
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: JSON.stringify({
|
|
36
|
+
status: result.status,
|
|
37
|
+
workerStatus: result.workerStatus,
|
|
38
|
+
specReviewStatus: result.specReviewStatus,
|
|
39
|
+
qualityReviewStatus: result.qualityReviewStatus,
|
|
40
|
+
usage: {
|
|
41
|
+
inputTokens: result.usage.inputTokens,
|
|
42
|
+
outputTokens: result.usage.outputTokens,
|
|
43
|
+
costUSD: result.usage.costUSD,
|
|
44
|
+
},
|
|
45
|
+
turns: result.turns,
|
|
46
|
+
durationMs: result.durationMs,
|
|
47
|
+
filesRead: result.filesRead,
|
|
48
|
+
filesWritten: result.filesWritten,
|
|
49
|
+
directoriesListed: result.directoriesListed ?? [],
|
|
50
|
+
toolCalls: result.toolCalls,
|
|
51
|
+
}, null, 2),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function buildFilePathsPrompt(filePaths) {
|
|
55
|
+
if (!filePaths || filePaths.length === 0)
|
|
56
|
+
return '';
|
|
57
|
+
return `Read and analyze these files:\n${filePaths.map(p => `- ${p}`).join('\n')}`;
|
|
58
|
+
}
|
|
59
|
+
export function buildPerFilePrompt(filePath, promptTemplate) {
|
|
60
|
+
return `${promptTemplate}\n\nRead and analyze this file:\n- ${filePath}`;
|
|
61
|
+
}
|
|
62
|
+
export function applyCommonFields(taskSpec, params) {
|
|
63
|
+
const result = { ...taskSpec };
|
|
64
|
+
if (params.cwd !== undefined)
|
|
65
|
+
result.cwd = params.cwd;
|
|
66
|
+
if (params.contextBlockIds !== undefined)
|
|
67
|
+
result.contextBlockIds = params.contextBlockIds;
|
|
68
|
+
if (params.tools !== undefined)
|
|
69
|
+
result.tools = params.tools;
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,15 @@ import { z } from 'zod';
|
|
|
2
2
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import type { MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
|
|
4
4
|
export declare const verifyWorkSchema: z.ZodObject<{
|
|
5
|
-
|
|
5
|
+
filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
contextBlockIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
tools: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
readonly: "readonly";
|
|
10
|
+
none: "none";
|
|
11
|
+
full: "full";
|
|
12
|
+
}>>;
|
|
13
|
+
work: z.ZodOptional<z.ZodString>;
|
|
6
14
|
checklist: z.ZodArray<z.ZodString>;
|
|
7
15
|
agentType: z.ZodOptional<z.ZodEnum<{
|
|
8
16
|
standard: "standard";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-work.d.ts","sourceRoot":"","sources":["../../src/tools/verify-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"verify-work.d.ts","sourceRoot":"","sources":["../../src/tools/verify-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,mCAAmC,CAAC;AAapF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;iBAK3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAiBhE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QA6C7E"}
|
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { runTasks } from '@zhixuan92/multi-model-agent-core/run-tasks';
|
|
3
|
+
import { commonToolFields, validateInput, resolveDispatchMode, buildMetadataBlock, buildFilePathsPrompt, buildPerFilePrompt, applyCommonFields, } from './shared.js';
|
|
4
|
+
import { buildFanOutResponse } from './batch-response.js';
|
|
3
5
|
export const verifyWorkSchema = z.object({
|
|
4
|
-
work: z.string().describe('
|
|
5
|
-
checklist: z.array(z.string()).describe('Verification checklist items'),
|
|
6
|
+
work: z.string().optional().describe('Inline work product to verify'),
|
|
7
|
+
checklist: z.array(z.string()).min(1).describe('Verification checklist items (at least 1)'),
|
|
6
8
|
agentType: z.enum(['standard', 'complex']).optional(),
|
|
9
|
+
...commonToolFields,
|
|
7
10
|
});
|
|
11
|
+
function buildVerifyPrompt(work, filePaths, checklist) {
|
|
12
|
+
const parts = ['Verify this work:'];
|
|
13
|
+
if (work)
|
|
14
|
+
parts.push(work);
|
|
15
|
+
const fileSection = buildFilePathsPrompt(filePaths);
|
|
16
|
+
if (fileSection)
|
|
17
|
+
parts.push(fileSection);
|
|
18
|
+
const checklistText = checklist.map((item, i) => `${i + 1}. ${item}`).join('\n');
|
|
19
|
+
parts.push(`Checklist:\n${checklistText}`);
|
|
20
|
+
parts.push('For each checklist item, indicate pass/fail and provide evidence.');
|
|
21
|
+
return parts.join('\n\n');
|
|
22
|
+
}
|
|
8
23
|
export function registerVerifyWork(server, config) {
|
|
9
|
-
server.tool('verify_work', 'Verify work
|
|
24
|
+
server.tool('verify_work', 'Verify completed work against a checklist with pass/fail evidence. Accepts inline description or file paths \u2014 multiple files are verified in parallel, each against the same checklist. Preset: standard agent, spec review only. Use delegate_tasks only for custom pipeline config.', verifyWorkSchema.shape, async (params) => {
|
|
25
|
+
const validation = validateInput(params.work, params.filePaths);
|
|
26
|
+
if (!validation.valid) {
|
|
27
|
+
return { content: [{ type: 'text', text: `Error: ${validation.message}` }], isError: true };
|
|
28
|
+
}
|
|
10
29
|
const agentType = params.agentType ?? 'standard';
|
|
11
|
-
const
|
|
12
|
-
const prompt = `Verify this work:\n\n${params.work}\n\n` +
|
|
13
|
-
`Checklist:\n${checklistText}\n\n` +
|
|
14
|
-
`For each checklist item, indicate pass/fail and provide evidence.`;
|
|
30
|
+
const baseTaskSpec = applyCommonFields({ agentType, reviewPolicy: 'spec_only' }, params);
|
|
15
31
|
try {
|
|
16
|
-
const
|
|
32
|
+
const mode = resolveDispatchMode(params.work, params.filePaths);
|
|
33
|
+
if (mode === 'fan_out') {
|
|
34
|
+
const validPaths = params.filePaths.filter(p => p.trim().length > 0);
|
|
35
|
+
const promptTemplate = buildVerifyPrompt(undefined, undefined, params.checklist);
|
|
36
|
+
const tasks = validPaths.map(fp => ({
|
|
37
|
+
...baseTaskSpec,
|
|
38
|
+
prompt: buildPerFilePrompt(fp, promptTemplate),
|
|
39
|
+
}));
|
|
40
|
+
const startMs = Date.now();
|
|
41
|
+
const results = await runTasks(tasks, config);
|
|
42
|
+
return { content: [buildFanOutResponse(results, tasks, Date.now() - startMs)] };
|
|
43
|
+
}
|
|
44
|
+
const prompt = buildVerifyPrompt(params.work, params.filePaths, params.checklist);
|
|
45
|
+
const results = await runTasks([{ ...baseTaskSpec, prompt }], config);
|
|
17
46
|
const result = results[0];
|
|
18
|
-
return {
|
|
19
|
-
content: [
|
|
20
|
-
{ type: 'text', text: result.output },
|
|
21
|
-
],
|
|
22
|
-
};
|
|
47
|
+
return { content: [{ type: 'text', text: result.output }, buildMetadataBlock(result)] };
|
|
23
48
|
}
|
|
24
49
|
catch (err) {
|
|
25
50
|
return {
|