mcp-server-subagent
Version:
MCP server for managing sub-agents
63 lines (62 loc) • 2.33 kB
JavaScript
import { promises as fs } from "fs";
import { join } from "path";
import { z } from "zod";
export const CheckMessageStatusArgumentsSchema = z.object({
runId: z.string().uuid("Run ID must be a valid UUID"),
messageId: z.string().min(1, "Message ID cannot be empty"),
});
export const CheckMessageStatusOutputSchema = z.object({
messageId: z.string(),
questionContent: z.string(),
questionTimestamp: z.string(),
answerContent: z.string().optional(),
answerTimestamp: z.string().optional(),
messageStatus: z.string(),
});
export async function checkMessageStatusHandler(input, logDir) {
const { runId, messageId } = input;
const metaPath = join(logDir, `${runId}.meta.json`);
// Read meta file
let metaRaw;
try {
metaRaw = await fs.readFile(metaPath, "utf-8");
}
catch (err) {
throw new Error(`Could not read meta file for runId ${runId}: ${err}`);
}
let metadata;
try {
metadata = JSON.parse(metaRaw);
}
catch (err) {
throw new Error(`Meta file for runId ${runId} is not valid JSON: ${err}`);
}
// Find the message
if (!Array.isArray(metadata.messages)) {
throw new Error(`No messages found for runId ${runId}`);
}
const messageIndex = metadata.messages.findIndex((msg) => msg.messageId === messageId);
if (messageIndex === -1) {
throw new Error(`Message with ID ${messageId} not found`);
}
const message = metadata.messages[messageIndex];
// Prepare the output
const output = {
messageId: message.messageId,
questionContent: message.questionContent,
questionTimestamp: message.questionTimestamp,
answerContent: message.answerContent,
answerTimestamp: message.answerTimestamp,
messageStatus: message.messageStatus,
};
// If the message status is "parent_replied", acknowledge it and update status
if (message.messageStatus === "parent_replied") {
// Update message status to acknowledged
metadata.messages[messageIndex].messageStatus = "acknowledged_by_subagent";
// Update overall status back to running
metadata.status = "running";
// Write back the updated metadata
await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2));
}
return output;
}