import { BlockStreamingCoalesceSchema, DmConfigSchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, requireOpenAllowFrom, } from "clawdbot/plugin-sdk"; import { z } from "zod"; export const NextcloudTalkRoomSchema = z .object({ requireMention: z.boolean().optional(), skills: z.array(z.string()).optional(), enabled: z.boolean().optional(), allowFrom: z.array(z.string()).optional(), systemPrompt: z.string().optional(), }) .strict(); export const NextcloudTalkAccountSchemaBase = z .object({ name: z.string().optional(), enabled: z.boolean().optional(), markdown: MarkdownConfigSchema, baseUrl: z.string().optional(), botSecret: z.string().optional(), botSecretFile: z.string().optional(), apiUser: z.string().optional(), apiPassword: z.string().optional(), apiPasswordFile: z.string().optional(), dmPolicy: DmPolicySchema.optional().default("pairing"), webhookPort: z.number().int().positive().optional(), webhookHost: z.string().optional(), webhookPath: z.string().optional(), webhookPublicUrl: z.string().optional(), allowFrom: z.array(z.string()).optional(), groupAllowFrom: z.array(z.string()).optional(), groupPolicy: GroupPolicySchema.optional().default("allowlist"), rooms: z.record(z.string(), NextcloudTalkRoomSchema.optional()).optional(), historyLimit: z.number().int().min(0).optional(), dmHistoryLimit: z.number().int().min(0).optional(), dms: z.record(z.string(), DmConfigSchema.optional()).optional(), textChunkLimit: z.number().int().positive().optional(), blockStreaming: z.boolean().optional(), blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(), mediaMaxMb: z.number().positive().optional(), }) .strict(); export const NextcloudTalkAccountSchema = NextcloudTalkAccountSchemaBase.superRefine( (value, ctx) => { requireOpenAllowFrom({ policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, path: ["allowFrom"], message: 'channels.nextcloud-talk.dmPolicy="open" requires channels.nextcloud-talk.allowFrom to include "*"', }); }, ); export const NextcloudTalkConfigSchema = NextcloudTalkAccountSchemaBase.extend({ accounts: z.record(z.string(), NextcloudTalkAccountSchema.optional()).optional(), }).superRefine((value, ctx) => { requireOpenAllowFrom({ policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, path: ["allowFrom"], message: 'channels.nextcloud-talk.dmPolicy="open" requires channels.nextcloud-talk.allowFrom to include "*"', }); });