import * as v from 'valibot' import { conversationStarterSchema, latestVersionedConfigSchema, webchatIpBlocklistEntrySchema } from './webchat' export const webchatIntegrationInputSchema = v.object({ version: v.optional(v.string()), botDisplayName: v.optional(v.string()), botAvatarUrl: v.optional(v.string()), botDescription: v.optional(v.string()), descriptionPhoneNumber: v.optional( v.object({ title: v.optional(v.string()), link: v.optional(v.string()), }) ), descriptionEmailAddress: v.optional( v.object({ title: v.optional(v.string()), link: v.optional(v.string()), }) ), descriptionWebsiteUrl: v.optional( v.object({ title: v.optional(v.string()), link: v.optional(v.string()), }) ), termsConditionsUrl: v.optional( v.object({ title: v.optional(v.string()), link: v.optional(v.string()), }) ), privacyPolicyUrl: v.optional( v.object({ title: v.optional(v.string()), link: v.optional(v.string()), }) ), botComposerPlaceholder: v.optional(v.string()), showPoweredByBotpress: v.optional(v.boolean()), // additionalStylesheet: v.optional(v.string()), // TODO: Remove this in November 2025 additionalStylesheetUrl: v.optional(v.string()), allowedOrigins: v.optional(v.array(v.string())), primaryColor: v.optional(v.string()), borderRadiusScale: v.optional(v.number()), themeMode: v.optional(v.picklist(['light', 'dark'])), variant: v.optional(v.picklist(['solid', 'soft'])), headerVariant: v.optional(v.picklist(['solid', 'glass'])), feedbackEnabled: v.optional(v.boolean()), soundEnabled: v.optional(v.boolean()), fontFamily: v.optional(v.string()), showPoweredBy: v.optional(v.boolean()), allowFileUpload: v.optional(v.boolean()), adminSecret: v.optional(v.string()), // PEM public key used by the webchat backend to verify signed JWTs carrying // user attributes. Integration-config only — never written to the public // config file (same handling as allowedOrigins). jwtPublicKey: v.optional(v.string()), _debug: v.optional(v.boolean()), conversationHistory: v.optional(v.boolean()), rateLimit: v.optional( v.object({ enabled: v.optional(v.boolean()), requests: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))), windowMinutes: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))), }) ), ipBlocklist: v.optional(v.array(webchatIpBlocklistEntrySchema)), cookieDomain: v.optional(v.string()), webchatMajorVersion: v.optional(v.picklist(['v4', 'v5'])), homePageEnabled: v.optional(v.boolean()), welcomeHeading: v.optional(v.string()), welcomeSubtitle: v.optional(v.string()), mainCardEnabled: v.optional(v.boolean()), mainCardTitle: v.optional(v.string()), mainCardSubtitle: v.optional(v.string()), conversationStartersEnabled: v.optional(v.boolean()), conversationStarters: v.optional(v.array(conversationStarterSchema)), conversationStartersDisplayStyle: v.optional(v.picklist(['chips', 'cards', 'grid'])), citationsEnabled: v.optional(v.boolean()), }) export type WebchatIntegrationInput = v.InferOutput export const webchatConfigToWebchatIntegrationInput = v.pipe( latestVersionedConfigSchema, v.transform((webchatConfig) => { return { version: webchatConfig.version, botDisplayName: webchatConfig.botName, botAvatarUrl: webchatConfig.botAvatar, botDescription: webchatConfig.botDescription, fabImage: webchatConfig.fabImage, descriptionPhoneNumber: webchatConfig.phone, descriptionEmailAddress: webchatConfig.email, descriptionWebsiteUrl: webchatConfig.website, termsConditionsUrl: webchatConfig.termsOfService, privacyPolicyUrl: webchatConfig.privacyPolicy, botComposerPlaceholder: webchatConfig.composerPlaceholder, additionalStylesheet: webchatConfig.additionalStylesheet, additionalStylesheetUrl: webchatConfig.additionalStylesheetUrl, primaryColor: webchatConfig.color, borderRadiusScale: webchatConfig.radius, themeMode: webchatConfig.themeMode, variant: webchatConfig.variant, headerVariant: webchatConfig.headerVariant, feedbackEnabled: webchatConfig.feedbackEnabled, soundEnabled: webchatConfig.soundEnabled, fontFamily: webchatConfig.fontFamily, footer: webchatConfig.footer, allowFileUpload: webchatConfig.allowFileUpload, storageLocation: webchatConfig.storageLocation, embeddedChatId: webchatConfig.embeddedChatId, toggleChatId: webchatConfig.toggleChatId, adminSecret: webchatConfig.adminSecret, proactiveMessageEnabled: webchatConfig.proactiveMessageEnabled, proactiveBubbleMessage: webchatConfig.proactiveBubbleMessage, proactiveBubbleTriggerType: webchatConfig.proactiveBubbleTriggerType, proactiveBubbleDelayTime: webchatConfig.proactiveBubbleDelayTime, _debug: webchatConfig._debug, conversationHistory: webchatConfig.conversationHistory, rateLimit: webchatConfig.rateLimit, ipBlocklist: webchatConfig.ipBlocklist, cookieDomain: webchatConfig.cookieDomain, webchatMajorVersion: webchatConfig.webchatMajorVersion, homePageEnabled: webchatConfig.homePageEnabled, welcomeHeading: webchatConfig.welcomeHeading, welcomeSubtitle: webchatConfig.welcomeSubtitle, mainCardEnabled: webchatConfig.mainCardEnabled, mainCardTitle: webchatConfig.mainCardTitle, mainCardSubtitle: webchatConfig.mainCardSubtitle, conversationStartersEnabled: webchatConfig.conversationStartersEnabled, conversationStarters: webchatConfig.conversationStarters, conversationStartersDisplayStyle: webchatConfig.conversationStartersDisplayStyle, citationsEnabled: webchatConfig.citationsEnabled, } }) )