UNPKG

rhombus-node-mcp

Version:
204 lines (203 loc) 8.96 kB
import { z } from "zod"; import { ISOTimestampFormatDescription } from "../utils/timestampInput.js"; import { ChatFollowUpActionEnum, ChatVisibilityEnum, FrequencyUnitEnum } from "./schema.js"; export var AutomatedPromptsRequestType; (function (AutomatedPromptsRequestType) { AutomatedPromptsRequestType["LIST"] = "list"; AutomatedPromptsRequestType["GET"] = "get"; AutomatedPromptsRequestType["CREATE"] = "create"; AutomatedPromptsRequestType["UPDATE"] = "update"; AutomatedPromptsRequestType["DELETE"] = "delete"; AutomatedPromptsRequestType["GET_HISTORY"] = "get-history"; AutomatedPromptsRequestType["SHARE_RESPONSE"] = "share-response"; AutomatedPromptsRequestType["VERIFY_SCHEDULED"] = "verify-scheduled"; })(AutomatedPromptsRequestType || (AutomatedPromptsRequestType = {})); export const TOOL_ARGS = { requestType: z .enum(AutomatedPromptsRequestType) .describe("The type of automated prompt request to make."), promptUuid: z .string() .nullable() .describe("UUID of the automated prompt. Required for 'get', 'update', 'delete', 'get-history', and 'verify-scheduled'."), chatUuid: z .string() .nullable() .describe("UUID of a chat record (an individual response generated by an automated prompt). Required for 'share-response'."), visibility: z .enum(ChatVisibilityEnum) .nullable() .describe("Visibility for a shared chat response. Required for 'share-response'. One of PUBLIC, ORG_WIDE, SELECT_USERS, PRIVATE."), prompt: z .string() .nullable() .describe("The prompt MIND will execute every time the job runs. Required for 'create', recommended for 'update'."), responseTemplate: z .string() .nullable() .describe("Optional template that guides the shape of MIND's response. Used by 'create' and 'update'."), frequencyValue: z .number() .int() .positive() .nullable() .describe("How many time units between runs (e.g. 1 for 'every 1 day'). Required for 'create' alongside frequencyUnit."), frequencyUnit: z .enum(FrequencyUnitEnum) .nullable() .describe("Unit for the recurrence (HOURS, DAYS, WEEKS, MONTHS). Required for 'create' alongside frequencyValue."), invokeAt: z.iso .datetime({ message: "Invalid datetime string. Expected ISO 8601 format.", offset: true, }) .nullable() .describe("When the automated prompt should first run. Required for 'create'. Must be at least 15 minutes in the future. " + ISOTimestampFormatDescription), permissionGroupUuid: z .string() .nullable() .describe("UUID of the permission group/role that owns the job. Users in this role (or a higher role) can view and edit the job, and MIND uses this role's permissions when running the prompt. Required for 'create'."), notifyUserUuids: z .array(z.string()) .nullable() .describe("User UUIDs to email-notify when MIND finishes a run. These users must be members of the permission group set above. Used by 'create' and 'update'. Pass an empty array to clear existing notifyees on 'update'."), lastEvaluatedKey: z .string() .nullable() .describe("Pagination cursor returned by a previous 'list' or 'get-history' call. Pass to fetch the next page."), maxPageSize: z .number() .int() .positive() .nullable() .describe("Maximum number of items per page for 'list' and 'get-history'."), }; const TOOL_ARGS_SCHEMA = z.object(TOOL_ARGS); /** * Below is the individual request types schema */ const invokeAtDatetime = z.iso.datetime({ message: "invokeAt must be a valid ISO 8601 timestamp with offset (e.g. 2026-04-22T10:57:00-07:00).", offset: true, }); export const ListRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.LIST), lastEvaluatedKey: z.string().nullish(), maxPageSize: z.number().int().positive().nullish(), }); export const GetRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.GET), promptUuid: z.string().min(1, "promptUuid is required."), }); export const CreateRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.CREATE), prompt: z.string().min(1, "prompt is required."), invokeAt: invokeAtDatetime, frequencyValue: z.number().int().positive(), frequencyUnit: z.enum(FrequencyUnitEnum), permissionGroupUuid: z.string().min(1, "permissionGroupUuid is required."), responseTemplate: z.string().nullish(), notifyUserUuids: z.array(z.string()).nullish(), }); export const UpdateRequestSchema = z .object({ requestType: z.literal(AutomatedPromptsRequestType.UPDATE), promptUuid: z.string().min(1, "promptUuid is required."), prompt: z.string().min(1).nullish(), invokeAt: invokeAtDatetime.nullish(), frequencyValue: z.number().int().positive().nullish(), frequencyUnit: z.enum(FrequencyUnitEnum).nullish(), permissionGroupUuid: z.string().min(1).nullish(), responseTemplate: z.string().nullish(), notifyUserUuids: z.array(z.string()).nullish(), }) .refine(data => (data.frequencyValue == null) === (data.frequencyUnit == null), { message: "frequencyValue and frequencyUnit must be provided together when updating recurrence.", path: ["frequencyValue"], }); export const DeleteRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.DELETE), promptUuid: z.string().min(1, "promptUuid is required."), }); export const GetHistoryRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.GET_HISTORY), promptUuid: z.string().min(1, "promptUuid is required."), lastEvaluatedKey: z.string().nullish(), maxPageSize: z.number().int().positive().nullish(), }); export const ShareResponseRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.SHARE_RESPONSE), chatUuid: z.string().min(1, "chatUuid is required."), visibility: z.enum(ChatVisibilityEnum), }); export const VerifyScheduledRequestSchema = z.object({ requestType: z.literal(AutomatedPromptsRequestType.VERIFY_SCHEDULED), promptUuid: z.string().min(1, "promptUuid is required."), }); /* More shared types */ const FrequencySchema = z .object({ frequency: z.number().optional(), unit: z.enum(FrequencyUnitEnum).optional(), }) .describe("How often the prompt runs."); const AutomatedPromptSummarySchema = z .object({ uuid: z.string().optional(), prompt: z.string().optional(), responseTemplate: z.string().optional(), frequency: FrequencySchema.optional(), invokeAt: z .string() .optional() .describe("Next run time as an ISO 8601 string with timezone offset."), permissionGroupUuid: z.string().optional(), notifyUserUuids: z.array(z.string()).optional(), scheduleUuid: z.string().optional(), orgUuid: z.string().optional(), }) .describe("Summary of an automated prompt's settings."); const ChatHistoryEntrySchema = z .object({ uuid: z.string().optional(), automatedPromptUuid: z.string().optional(), query: z.string().optional(), response: z.string().optional(), queriedAt: z .string() .optional() .describe("When the run started, as an ISO 8601 string with offset."), respondedAt: z .string() .optional() .describe("When the response was generated, as an ISO 8601 string with offset."), responseType: z.string().optional(), }) .describe("One MIND response generated by an automated prompt run."); export const OUTPUT_SCHEMA = z.object({ settings: AutomatedPromptSummarySchema.optional().describe("Returned by 'get', 'create', and 'update'."), settingsList: z.array(AutomatedPromptSummarySchema).optional().describe("Returned by 'list'."), lastEvaluatedKey: z .string() .optional() .describe("Pagination cursor for the next page; absent when no more pages."), chatHistory: z.array(ChatHistoryEntrySchema).optional().describe("Returned by 'get-history'."), verifyResult: z .object({ scheduleExpression: z.string().optional(), scheduleTimezone: z.string().optional(), }) .optional() .describe("Returned by 'verify-scheduled'. Schedule expression and timezone for the next trigger."), success: z .object({ ok: z.boolean(), action: z.string(), }) .optional() .describe("Returned by 'delete' and 'share-response'."), error: z.string().optional().describe("An error message if the request failed."), }); // Re-export for the api/tool layers so they can build ChatPrivacy follow-ups. export { ChatFollowUpActionEnum, ChatVisibilityEnum, FrequencyUnitEnum };