import { BlockStreamingCoalesceSchema, DmConfigSchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, ToolPolicySchema, requireOpenAllowFrom, } from "openclaw/plugin-sdk/nextcloud-talk"; import { z } from "zod"; import { buildSecretInputSchema } from "./secret-input.js"; export const NextcloudTalkRoomSchema = z .object({ requireMention: z.boolean().optional(), tools: ToolPolicySchema, 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: buildSecretInputSchema().optional(), botSecretFile: z.string().optional(), apiUser: z.string().optional(), apiPassword: buildSecretInputSchema().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(), ...ReplyRuntimeConfigSchemaShape, }) .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(), defaultAccount: z.string().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 "*"', }); });