mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-22 23:38:08 +00:00
61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
export type McpCodeModeMentions = Record<
|
|
"apiCall" | "apiFileList" | "apiFileRead" | "mcpNamespace" | "mcpTool" | "toolSearchPollution",
|
|
number
|
|
>;
|
|
|
|
function assert(condition: unknown, message: string): asserts condition {
|
|
if (!condition) {
|
|
throw new Error(message);
|
|
}
|
|
}
|
|
|
|
export function outputText(response: unknown): string {
|
|
const output = (response as { output?: Array<{ type?: unknown; content?: unknown }> }).output;
|
|
if (!Array.isArray(output)) {
|
|
return "";
|
|
}
|
|
return output
|
|
.flatMap((item) => {
|
|
if (item.type !== "message" || !Array.isArray(item.content)) {
|
|
return [];
|
|
}
|
|
return item.content.flatMap((piece) => {
|
|
if (!piece || typeof piece !== "object") {
|
|
return [];
|
|
}
|
|
const record = piece as { text?: unknown };
|
|
return typeof record.text === "string" ? [record.text] : [];
|
|
});
|
|
})
|
|
.join("\n");
|
|
}
|
|
|
|
export function validateMcpCodeModeResult(
|
|
response: unknown,
|
|
mentions: McpCodeModeMentions,
|
|
options: { plannedTools?: string[]; requireExec?: boolean } = {},
|
|
): string {
|
|
const finalText = outputText(response);
|
|
assert(
|
|
finalText.includes("MCP_CODE_MODE_FILE_OK"),
|
|
`agent did not complete MCP API file check: ${finalText}`,
|
|
);
|
|
assert(
|
|
finalText.includes("fixture-note-alpha"),
|
|
`agent did not return fixture note from MCP call: ${finalText}`,
|
|
);
|
|
assert(
|
|
!/MCP\s+(?:was\s+)?not\s+defined|failed|error/i.test(finalText),
|
|
`agent reported MCP failure instead of a successful call: ${finalText}`,
|
|
);
|
|
if (options.requireExec) {
|
|
assert(options.plannedTools?.includes("exec"), "agent did not call code-mode exec");
|
|
}
|
|
assert(mentions.apiFileRead > 0, "session log lacks API.read usage");
|
|
assert(mentions.mcpNamespace > 0, "session log lacks MCP.fixture usage");
|
|
assert(mentions.mcpTool > 0, "session log lacks fixture__lookup_note call");
|
|
assert(mentions.apiCall === 0, "agent should not call MCP.$api when API files are available");
|
|
assert(mentions.toolSearchPollution === 0, "agent should not use tools.search for MCP lookup");
|
|
return finalText;
|
|
}
|