// Simple config schema for Qiaoqiao import { Type } from "@sinclair/typebox"; import { z } from "zod"; // Account config first to avoid circular reference export const QiaoqiaoAccountConfigSchema = Type.Object({ enabled: Type.Optional(Type.Boolean()), name: Type.Optional(Type.String()), appId: Type.Optional(Type.String()), appSecret: Type.Optional(Type.String()), apiBase: Type.Optional(Type.String()), backendWsUrl: Type.Optional(Type.String()), replyTimeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), domain: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), webhookPort: Type.Optional(Type.Integer()), webhookPath: Type.Optional(Type.String()), connectionMode: Type.Optional(Type.Union([Type.Literal("websocket"), Type.Literal("webhook")])), tools: Type.Optional( Type.Object({ message: Type.Optional(Type.Boolean()), feed: Type.Optional(Type.Boolean()), post: Type.Optional(Type.Boolean()), comment: Type.Optional(Type.Boolean()), dashboard: Type.Optional(Type.Boolean()), memory: Type.Optional(Type.Boolean()), dm: Type.Optional(Type.Boolean()), }), ), }); export const QiaoqiaoConfigSchema = Type.Object({ enabled: Type.Optional(Type.Boolean()), appId: Type.Optional(Type.String()), appSecret: Type.Optional(Type.String()), apiBase: Type.Optional(Type.String()), backendWsUrl: Type.Optional(Type.String()), replyTimeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), domain: Type.Optional(Type.String()), accounts: Type.Optional(Type.Record(Type.String(), QiaoqiaoAccountConfigSchema)), allowFrom: Type.Optional(Type.Array(Type.String())), groupPolicy: Type.Optional(Type.String()), webhookPort: Type.Optional(Type.Integer()), webhookPath: Type.Optional(Type.String()), connectionMode: Type.Optional(Type.Union([Type.Literal("websocket"), Type.Literal("webhook")])), maxMessageAgeMs: Type.Optional(Type.Integer()), historyLimit: Type.Optional(Type.Integer()), dmPolicy: Type.Optional(Type.String()), dynamicAgentCreation: Type.Optional(Type.Any()), groupAllowFrom: Type.Optional(Type.Array(Type.String())), topicSessionMode: Type.Optional(Type.String()), mediaMaxMb: Type.Optional(Type.Integer()), tools: Type.Optional( Type.Object({ message: Type.Optional(Type.Boolean()), feed: Type.Optional(Type.Boolean()), post: Type.Optional(Type.Boolean()), comment: Type.Optional(Type.Boolean()), dashboard: Type.Optional(Type.Boolean()), memory: Type.Optional(Type.Boolean()), dm: Type.Optional(Type.Boolean()), }), ), }); export const QiaoqiaoGroupSchema = Type.Object({}); export type QiaoqiaoConfigSchema = typeof QiaoqiaoConfigSchema.static; export type QiaoqiaoGroupSchema = typeof QiaoqiaoGroupSchema.static; export type QiaoqiaoAccountConfigSchema = typeof QiaoqiaoAccountConfigSchema.static; // Re-export z for types.ts export { z };