import { DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, ToolPolicySchema, requireOpenAllowFrom, } from "openclaw/plugin-sdk/channel-config-schema"; import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/extension-shared"; import { z } from "openclaw/plugin-sdk/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(); const NextcloudTalkNetworkSchema = z .object({ /** Dangerous opt-in for self-hosted Nextcloud Talk on trusted private/internal hosts. */ dangerouslyAllowPrivateNetwork: z.boolean().optional(), }) .strict() .optional(); 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(), /** Network policy overrides for self-hosted Nextcloud Talk on trusted private/internal hosts. */ network: NextcloudTalkNetworkSchema, ...ReplyRuntimeConfigSchemaShape, }) .strict(); export const NextcloudTalkAccountSchema = NextcloudTalkAccountSchemaBase.superRefine( (value, ctx) => { requireChannelOpenAllowFrom({ channel: "nextcloud-talk", policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, requireOpenAllowFrom, }); }, ); export const NextcloudTalkConfigSchema = NextcloudTalkAccountSchemaBase.extend({ accounts: z.record(z.string(), NextcloudTalkAccountSchema.optional()).optional(), defaultAccount: z.string().optional(), }).superRefine((value, ctx) => { requireChannelOpenAllowFrom({ channel: "nextcloud-talk", policy: value.dmPolicy, allowFrom: value.allowFrom, ctx, requireOpenAllowFrom, }); });