import { BlockStreamingCoalesceSchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, requireOpenAllowFrom, } from "@hanzo/bot/plugin-sdk/mattermost"; import { z } from "zod"; import { buildSecretInputSchema } from "./secret-input.js"; const MattermostSlashCommandsSchema = z .object({ /** Enable native slash commands. "auto" resolves to false (opt-in). */ native: z.union([z.boolean(), z.literal("auto")]).optional(), /** Also register skill-based commands. */ nativeSkills: z.union([z.boolean(), z.literal("auto")]).optional(), /** Path for the callback endpoint on the gateway HTTP server. */ callbackPath: z.string().optional(), /** Explicit callback URL (e.g. behind reverse proxy). */ callbackUrl: z.string().optional(), }) .strict() .optional(); const MattermostAccountSchemaBase = z .object({ name: z.string().optional(), capabilities: z.array(z.string()).optional(), dangerouslyAllowNameMatching: z.boolean().optional(), markdown: MarkdownConfigSchema, enabled: z.boolean().optional(), configWrites: z.boolean().optional(), botToken: buildSecretInputSchema().optional(), baseUrl: z.string().optional(), chatmode: z.enum(["oncall", "onmessage", "onchar"]).optional(), oncharPrefixes: z.array(z.string()).optional(), requireMention: z.boolean().optional(), dmPolicy: DmPolicySchema.optional().default("pairing"), allowFrom: z.array(z.union([z.string(), z.number()])).optional(), groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(), groupPolicy: GroupPolicySchema.optional().default("allowlist"), textChunkLimit: z.number().int().positive().optional(), chunkMode: z.enum(["length", "newline"]).optional(), blockStreaming: z.boolean().optional(), blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(), responsePrefix: z.string().optional(), actions: z .object({ reactions: z.boolean().optional(), }) .optional(), commands: MattermostSlashCommandsSchema, interactions: z .object({ callbackBaseUrl: z.string().optional(), }) .optional(), }) .strict(); const MattermostAccountSchema = MattermostAccountSchemaBase.superRefine((value, ctx) => { requireOpenAllowFrom({ policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, path: ["allowFrom"], message: 'channels.mattermost.dmPolicy="open" requires channels.mattermost.allowFrom to include "*"', }); }); export const MattermostConfigSchema = MattermostAccountSchemaBase.extend({ accounts: z.record(z.string(), MattermostAccountSchema.optional()).optional(), defaultAccount: z.string().optional(), }).superRefine((value, ctx) => { requireOpenAllowFrom({ policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, path: ["allowFrom"], message: 'channels.mattermost.dmPolicy="open" requires channels.mattermost.allowFrom to include "*"', }); });