mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-18 13:30:48 +00:00
72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
import { MarkdownConfigSchema, ToolPolicySchema } from "openclaw/plugin-sdk/bluebubbles";
|
|
import {
|
|
AllowFromListSchema,
|
|
buildCatchallMultiAccountChannelSchema,
|
|
DmPolicySchema,
|
|
GroupPolicySchema,
|
|
} from "openclaw/plugin-sdk/compat";
|
|
import { z } from "zod";
|
|
import { buildSecretInputSchema, hasConfiguredSecretInput } from "./secret-input.js";
|
|
|
|
const bluebubblesActionSchema = z
|
|
.object({
|
|
reactions: z.boolean().default(true),
|
|
edit: z.boolean().default(true),
|
|
unsend: z.boolean().default(true),
|
|
reply: z.boolean().default(true),
|
|
sendWithEffect: z.boolean().default(true),
|
|
renameGroup: z.boolean().default(true),
|
|
setGroupIcon: z.boolean().default(true),
|
|
addParticipant: z.boolean().default(true),
|
|
removeParticipant: z.boolean().default(true),
|
|
leaveGroup: z.boolean().default(true),
|
|
sendAttachment: z.boolean().default(true),
|
|
})
|
|
.optional();
|
|
|
|
const bluebubblesGroupConfigSchema = z.object({
|
|
requireMention: z.boolean().optional(),
|
|
tools: ToolPolicySchema,
|
|
});
|
|
|
|
const bluebubblesAccountSchema = z
|
|
.object({
|
|
name: z.string().optional(),
|
|
enabled: z.boolean().optional(),
|
|
markdown: MarkdownConfigSchema,
|
|
serverUrl: z.string().optional(),
|
|
password: buildSecretInputSchema().optional(),
|
|
webhookPath: z.string().optional(),
|
|
dmPolicy: DmPolicySchema.optional(),
|
|
allowFrom: AllowFromListSchema,
|
|
groupAllowFrom: AllowFromListSchema,
|
|
groupPolicy: GroupPolicySchema.optional(),
|
|
historyLimit: z.number().int().min(0).optional(),
|
|
dmHistoryLimit: z.number().int().min(0).optional(),
|
|
textChunkLimit: z.number().int().positive().optional(),
|
|
chunkMode: z.enum(["length", "newline"]).optional(),
|
|
mediaMaxMb: z.number().int().positive().optional(),
|
|
mediaLocalRoots: z.array(z.string()).optional(),
|
|
sendReadReceipts: z.boolean().optional(),
|
|
allowPrivateNetwork: z.boolean().optional(),
|
|
blockStreaming: z.boolean().optional(),
|
|
groups: z.object({}).catchall(bluebubblesGroupConfigSchema).optional(),
|
|
})
|
|
.superRefine((value, ctx) => {
|
|
const serverUrl = value.serverUrl?.trim() ?? "";
|
|
const passwordConfigured = hasConfiguredSecretInput(value.password);
|
|
if (serverUrl && !passwordConfigured) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["password"],
|
|
message: "password is required when serverUrl is configured",
|
|
});
|
|
}
|
|
});
|
|
|
|
export const BlueBubblesConfigSchema = buildCatchallMultiAccountChannelSchema(
|
|
bluebubblesAccountSchema,
|
|
).extend({
|
|
actions: bluebubblesActionSchema,
|
|
});
|