UNPKG

mcp-server-subagent

Version:
62 lines (61 loc) 1.94 kB
// 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, }; };