mcp-server-subagent
Version:
MCP server for managing sub-agents
62 lines (61 loc) • 1.94 kB
JavaScript
// src/tools/replySubagent.ts
import { z } from "zod";
import fs from "fs/promises";
import path from "path";
// Input schema
export const replySubagentInputSchema = z.object({
runId: z.string(),
messageId: z.string(),
answer: z.string(),
});
// Output schema
export const replySubagentOutputSchema = z.object({
success: z.literal(true),
message: z.string(),
updatedMetadata: z.any(),
});
// Handler
export const replySubagentHandler = async (input, logDir) => {
const { runId, messageId, answer } = input;
const metaPath = path.join(logDir, `${runId}.meta.json`);
// Read and parse .meta.json
let metaRaw;
try {
metaRaw = await fs.readFile(metaPath, "utf8");
}
catch (err) {
throw new Error(`Could not read meta file: ${metaPath}`);
}
let metadata;
try {
metadata = JSON.parse(metaRaw);
}
catch (err) {
throw new Error(`Invalid JSON in meta file: ${metaPath}`);
}
// Ensure messages array is initialized
if (!Array.isArray(metadata.messages)) {
metadata.messages = [];
}
// Find the message
const msg = metadata.messages?.find((m) => m.messageId === messageId);
if (!msg) {
throw new Error(`Message with ID ${messageId} not found in meta file.`);
}
if (msg.messageStatus !== "pending_parent_reply") {
throw new Error(`Message status is not 'pending_parent_reply' (found '${msg.messageStatus}').`);
}
// Update message
msg.answerContent = answer;
msg.answerTimestamp = new Date().toISOString();
msg.messageStatus = "parent_replied";
// Update metadata status
metadata.status = "parent_replied";
// Write back to .meta.json
await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf8");
return {
success: true,
message: "Parent reply recorded and metadata updated.",
updatedMetadata: metadata,
};
};