@ringg/core 0.0.1-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/config.ts","../src/adapters/event-bus.ts","../src/api/client.ts","../src/state/widget-state.ts","../src/theme/gradient-utils.ts","../src/theme/theme-engine.ts","../src/helpers/component-helpers.ts","../src/rpc/rpc-formatter.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Widget configuration types.\n * These define the public API surface for consumers initializing the widget.\n */\n\nimport type { WidgetTheme } from \"./theme\";\nimport type { SlashCommand } from \"./slash-commands\";\n\nexport type MediaType = \"audio\" | \"text\";\n\nexport type EnvironmentMode = \"dev\" | \"stage\" | \"prod\";\n\nexport type TriggerPlacement = \"fixed\" | \"absolute\";\n\nexport type TriggerAlignment = \"center\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport type WidgetAlignment = \"bottom-right\" | \"bottom-center\" | \"bottom-left\";\n\nexport interface WidgetPositionConfig {\n triggerPlacement?: TriggerPlacement;\n triggerAlignment?: TriggerAlignment;\n hideTriggerOnExpand?: boolean;\n widgetAlignment?: WidgetAlignment;\n}\n\nexport interface LegalDisclaimerConfig {\n text: string;\n links?: Record<string, string>;\n}\n\n/** Styles that are safe to pass cross-platform (subset of CSS properties that map to RN) */\nexport interface PortableStyles {\n height?: string | number;\n width?: string | number;\n backgroundColor?: string;\n padding?: string | number;\n borderRadius?: string | number;\n}\n\nexport interface ButtonIconConfig {\n size?: string | number;\n url?: string;\n}\n\nexport interface ButtonsConfig {\n mic?: { styles?: PortableStyles };\n modalTrigger?: {\n styles?: PortableStyles;\n icon?: ButtonIconConfig;\n };\n text?: { textBeforeCall?: string; textDuringCall?: string; styles?: PortableStyles };\n call?: { textBeforeCall?: string; textDuringCall?: string; styles?: PortableStyles };\n}\n\nexport interface FeedbackScreenConfig {\n title?: string;\n description?: string;\n starsCount?: number;\n starsStyles?: { filledColor?: string; emptyColor?: string };\n placeholder?: string;\n submitBtnCTA?: string;\n submitBtnStyles?: PortableStyles;\n}\n\nexport interface InnerWindowConfig {\n width?: string | number;\n height?: string | number;\n borderRadius?: string | number;\n}\n\n/**\n * The main configuration object consumers pass to initialize the widget.\n * Used by both web (loadAgent) and React Native (<RinggWidget />) entry points.\n */\nexport interface RinggWidgetConfig {\n /** Agent identifier — required */\n agentId: string;\n\n /** API key for authentication — required */\n xApiKey: string;\n\n /** Custom variables passed to the agent (e.g., user name, role) */\n variables: Record<string, string>;\n\n /** Environment mode — determines backend/LiveKit URLs */\n mode?: EnvironmentMode;\n\n /** Widget title displayed in the header */\n title?: string;\n\n /** Widget description displayed in the header */\n description?: string;\n\n /** Default communication tab */\n defaultTab?: MediaType;\n\n /** Whether to hide the audio/text tab selector */\n hideTabSelector?: boolean;\n\n /** Custom logo URL for the widget header */\n logoUrl?: string;\n\n /** Styles for the logo element */\n logoStyles?: PortableStyles;\n\n /** Slash commands available from config (merged with runtime ones) */\n enabledSlashCommands?: SlashCommand[];\n\n /** App-wide theming */\n theme?: WidgetTheme;\n\n /** Widget positioning (web-only, ignored on RN) */\n widgetPosition?: WidgetPositionConfig;\n\n /** Legal disclaimer shown before call start */\n legalDisclaimer?: LegalDisclaimerConfig;\n\n /** Button customizations */\n buttons?: ButtonsConfig;\n\n /** Post-call feedback screen customizations */\n feedbackScreen?: FeedbackScreenConfig;\n\n /** Widget window dimensions (web-only) */\n innerWindowProps?: InnerWindowConfig;\n\n /** URL for the notification sound */\n notificationTuneUrl?: string;\n}\n\n/** Default values for optional config fields */\nexport const DEFAULT_CONFIG = {\n mode: \"prod\" as const,\n title: \"Ringg AI Support\",\n description: \"Ringg AI offers 24/7 voice support to handle your business calls efficiently and professionally\",\n defaultTab: \"audio\" as MediaType,\n hideTabSelector: false,\n notificationTuneUrl: \"https://assets.ringg.ai/audios/misc/widget_notification.mp3\",\n} as const;\n","/**\n * Event bus interface — abstraction over platform-specific event dispatch.\n *\n * Web: uses `window.dispatchEvent(new CustomEvent(...))` / `window.addEventListener`\n * React Native: uses callback props or an EventEmitter\n *\n * This enables the host application to listen to widget lifecycle events\n * without coupling to a specific event mechanism.\n */\n\nimport type { WidgetEventMap, WidgetEventName } from \"../types/events\";\n\nexport interface EventBus {\n /**\n * Emit a typed event to the host application.\n */\n emit<K extends WidgetEventName>(event: K, payload: WidgetEventMap[K]): void;\n\n /**\n * Subscribe to a typed event. Returns an unsubscribe function.\n */\n on<K extends WidgetEventName>(event: K, handler: (payload: WidgetEventMap[K]) => void): () => void;\n\n /**\n * Remove all listeners for a specific event, or all events if no name is provided.\n */\n off(event?: WidgetEventName): void;\n}\n\n/**\n * Web implementation — dispatches/listens via DOM CustomEvents on `window`.\n * This is the default for web-based widget usage.\n */\nexport class DomEventBus implements EventBus {\n private listeners = new Map<string, Set<(payload: unknown) => void>>();\n\n emit<K extends WidgetEventName>(event: K, payload: WidgetEventMap[K]): void {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(event, { detail: payload }));\n }\n }\n\n on<K extends WidgetEventName>(event: K, handler: (payload: WidgetEventMap[K]) => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const wrappedHandler = ((e: CustomEvent) => handler(e.detail)) as EventListener;\n\n // Track for bulk removal\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(wrappedHandler as unknown as (payload: unknown) => void);\n\n window.addEventListener(event, wrappedHandler);\n\n return () => {\n window.removeEventListener(event, wrappedHandler);\n this.listeners.get(event)?.delete(wrappedHandler as unknown as (payload: unknown) => void);\n };\n }\n\n off(event?: WidgetEventName): void {\n if (event) {\n this.listeners.get(event)?.forEach((handler) => {\n window.removeEventListener(event, handler as unknown as EventListener);\n });\n this.listeners.delete(event);\n } else {\n this.listeners.forEach((handlers, eventName) => {\n handlers.forEach((handler) => {\n window.removeEventListener(eventName, handler as unknown as EventListener);\n });\n });\n this.listeners.clear();\n }\n }\n}\n\n/**\n * In-memory event bus — for React Native or testing.\n * Events are dispatched to registered JS callbacks, not DOM events.\n */\nexport class CallbackEventBus implements EventBus {\n private listeners = new Map<string, Set<(payload: unknown) => void>>();\n\n emit<K extends WidgetEventName>(event: K, payload: WidgetEventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => handler(payload));\n }\n }\n\n on<K extends WidgetEventName>(event: K, handler: (payload: WidgetEventMap[K]) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const typedHandler = handler as (payload: unknown) => void;\n this.listeners.get(event)!.add(typedHandler);\n\n return () => {\n this.listeners.get(event)?.delete(typedHandler);\n };\n }\n\n off(event?: WidgetEventName): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n}\n","/**\n * API client for the Ringg backend.\n * Pure fetch-based — works in any JS runtime (browser, Node, React Native).\n */\n\nimport type { EnvironmentMode } from \"../types/config\";\nimport type { ComponentActionResponse } from \"../types/components\";\nimport type { SlashCommand } from \"../types/slash-commands\";\n\n// ─── URL Resolution ──────────────────────────────────────────────────────────\n\nexport interface EnvironmentUrls {\n backendUrl: string;\n livekitUrl: string;\n}\n\n/**\n * Resolve backend and LiveKit URLs for a given environment mode.\n * Consumers must provide these URLs — the core doesn't embed them.\n */\nexport interface UrlResolver {\n resolve(mode: EnvironmentMode): EnvironmentUrls;\n}\n\n/**\n * Static URL resolver — URLs are provided directly.\n */\nexport class StaticUrlResolver implements UrlResolver {\n constructor(private urls: Record<EnvironmentMode, EnvironmentUrls>) {}\n\n resolve(mode: EnvironmentMode): EnvironmentUrls {\n return this.urls[mode];\n }\n}\n\n// ─── API Client ──────────────────────────────────────────────────────────────\n\nexport interface WebcallResponse {\n call_id: string;\n user_token: string;\n enabled_slash_commands?: SlashCommand[];\n}\n\nexport interface FeedbackPayload {\n rating: number;\n comment: string;\n}\n\nexport interface ApiClientConfig {\n urlResolver: UrlResolver;\n mode: EnvironmentMode;\n xApiKey: string;\n}\n\nexport class RinggApiClient {\n private backendUrl: string;\n private xApiKey: string;\n\n constructor(config: ApiClientConfig) {\n const { backendUrl } = config.urlResolver.resolve(config.mode);\n this.backendUrl = backendUrl;\n this.xApiKey = config.xApiKey;\n }\n\n /** Common headers for all API requests. Includes Origin for CORS. */\n private get headers(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.xApiKey,\n Origin: \"http://localhost:3000\",\n };\n }\n\n /**\n * Initiate a webcall — returns the LiveKit token and call ID.\n */\n async startWebcall(params: { agentId: string; variables: Record<string, string>; mediaType: \"audio\" | \"text\" }): Promise<WebcallResponse> {\n const response = await fetch(`${this.backendUrl}/calling/webcall`, {\n method: \"POST\",\n body: JSON.stringify({\n agent_id: params.agentId,\n custom_args_values: params.variables,\n media_type: params.mediaType,\n }),\n headers: this.headers,\n });\n\n // Read body as text first, then parse as JSON — avoids consuming the stream twice\n const responseText = await response.text();\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(responseText);\n } catch {\n // Server returned non-JSON (HTML error page, plain text, etc.)\n throw new Error(responseText.slice(0, 200) || `Request failed with status ${response.status}`);\n }\n if (!response.ok) {\n throw new Error((data?.message as string) || \"Failed to make call\");\n }\n\n return {\n call_id: data.call_id as string,\n user_token: data.user_token as string,\n enabled_slash_commands: data.enabled_slash_commands as SlashCommand[] | undefined,\n };\n }\n\n /**\n * Submit post-call feedback.\n */\n async submitFeedback(callId: string, feedback: FeedbackPayload): Promise<void> {\n await fetch(`${this.backendUrl}/calling/${callId}/feedback`, {\n method: \"POST\",\n body: JSON.stringify(feedback),\n headers: this.headers,\n });\n }\n\n /**\n * Call a component API endpoint (for interactive flows).\n */\n async callComponentApi(method: \"POST\" | \"GET\", endpoint: string, payload: Record<string, string>): Promise<ComponentActionResponse> {\n const url = endpoint.startsWith(\"http\") ? endpoint : `${this.backendUrl}${endpoint}`;\n\n const response = await fetch(url, {\n method,\n body: JSON.stringify(payload),\n headers: this.headers,\n });\n\n return response.json();\n }\n}\n","/**\n * Widget state machine — framework-agnostic state management.\n *\n * This is the pure logic layer for widget open/close/feedback lifecycle.\n * Framework-specific wrappers (React hooks, RN state) wrap this controller.\n *\n * The controller emits events via the EventBus so the host app can react.\n */\n\nimport type { EventBus } from \"../adapters/event-bus\";\nimport type { MediaType } from \"../types/config\";\n\nexport type WidgetViewState = \"closed\" | \"open\" | \"feedback\";\n\nexport interface WidgetStateSnapshot {\n viewState: WidgetViewState;\n currentCallId: string | null;\n callMode: MediaType;\n}\n\nexport type WidgetStateListener = (snapshot: WidgetStateSnapshot) => void;\n\nexport class WidgetStateController {\n private viewState: WidgetViewState = \"closed\";\n private currentCallId: string | null = null;\n private callMode: MediaType;\n private listeners = new Set<WidgetStateListener>();\n private conversationEndDispatched = false;\n\n constructor(\n private eventBus: EventBus,\n initialCallMode: MediaType = \"audio\",\n ) {\n this.callMode = initialCallMode;\n }\n\n // ─── Getters ─────────────────────────────────────────────────────────────\n\n getSnapshot(): WidgetStateSnapshot {\n return {\n viewState: this.viewState,\n currentCallId: this.currentCallId,\n callMode: this.callMode,\n };\n }\n\n get isOpen(): boolean {\n return this.viewState === \"open\" || this.viewState === \"feedback\";\n }\n\n get isShowingFeedback(): boolean {\n return this.viewState === \"feedback\";\n }\n\n // ─── Mutations ───────────────────────────────────────────────────────────\n\n open(): void {\n if (this.viewState === \"open\") return;\n this.viewState = \"open\";\n this.eventBus.emit(\"ringg:widget_status\", { status: \"maximised\", mode: this.callMode });\n this.notify();\n }\n\n minimize(): void {\n if (this.viewState === \"closed\") return;\n this.viewState = \"closed\";\n this.eventBus.emit(\"ringg:widget_status\", { status: \"minimised\", mode: this.callMode });\n this.notify();\n }\n\n close(): void {\n this.viewState = \"closed\";\n this.currentCallId = null;\n this.eventBus.emit(\"ringg:widget_status\", { status: \"minimised\", mode: this.callMode });\n this.notify();\n }\n\n toggle(): void {\n if (this.isOpen) {\n this.minimize();\n } else {\n this.open();\n }\n }\n\n showFeedback(): void {\n this.viewState = \"feedback\";\n this.notify();\n }\n\n setCallMode(mode: MediaType): void {\n this.callMode = mode;\n this.notify();\n }\n\n setCurrentCallId(callId: string): void {\n this.currentCallId = callId;\n this.notify();\n }\n\n // ─── Conversation lifecycle helpers ──────────────────────────────────────\n\n dispatchConversationStart(mode: MediaType, callId: string): void {\n this.conversationEndDispatched = false;\n this.eventBus.emit(\"ringg:conversation_status\", { status: \"started\", mode, callId });\n }\n\n dispatchConversationEnd(mode: MediaType, callId: string): void {\n if (!this.conversationEndDispatched) {\n this.conversationEndDispatched = true;\n this.eventBus.emit(\"ringg:conversation_status\", { status: \"ended\", mode, callId });\n }\n }\n\n // ─── Subscription ────────────────────────────────────────────────────────\n\n subscribe(listener: WidgetStateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n const snapshot = this.getSnapshot();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n\n // ─── Cleanup ─────────────────────────────────────────────────────────────\n\n dispose(): void {\n this.listeners.clear();\n }\n}\n","/**\n * Gradient-aware style utilities for the widget theme system.\n *\n * CSS `backgroundColor` does not support gradient values — only the `background`\n * shorthand does. These helpers detect whether a color value is a solid hex/rgb\n * or a CSS gradient string, then return the correct CSS property.\n *\n * These utilities are platform-agnostic (no DOM dependency).\n * Platform renderers consume the output to apply styles appropriately.\n */\n\nconst GRADIENT_REGEX = /^(linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient|repeating-conic-gradient)\\s*\\(/i;\nconst HEX_COLOR_REGEX = /#([0-9a-fA-F]{3,8})\\b/g;\nconst RGB_COLOR_REGEX = /rgba?\\(\\s*[\\d.]+[\\s,]+[\\d.]+[\\s,]+[\\d.]+(?:[\\s,/]+[\\d.%]+)?\\s*\\)/g;\n\n/** Detect whether a CSS color value is a gradient string. */\nexport function isGradient(color: string): boolean {\n return GRADIENT_REGEX.test(color.trim());\n}\n\n/** Extract all hex and rgb/rgba color values from a gradient string. */\nexport function extractColorsFromGradient(gradient: string): string[] {\n const colors: string[] = [];\n\n const hexMatches = gradient.match(HEX_COLOR_REGEX);\n if (hexMatches) colors.push(...hexMatches);\n\n const rgbMatches = gradient.match(RGB_COLOR_REGEX);\n if (rgbMatches) colors.push(...rgbMatches);\n\n return colors;\n}\n\n/**\n * Return the dominant (first) color from a gradient, or the color as-is for solid values.\n * Falls back to the original string if no colors can be extracted.\n */\nexport function getDominantColor(color: string): string {\n if (!isGradient(color)) return color;\n\n const colors = extractColorsFromGradient(color);\n return colors.length > 0 ? colors[0] : color;\n}\n\n/**\n * Determine the correct CSS properties for a background color.\n *\n * Returns `{ backgroundColor }` for solid colors, `{ background }` for gradients.\n *\n * On web, spread this directly into a style object.\n * On React Native, gradients aren't natively supported — use `getDominantColor()`\n * to fall back to a solid color.\n */\nexport function colorToBackground(color: string): { backgroundColor?: string; background?: string } {\n if (isGradient(color)) {\n return { background: color };\n }\n return { backgroundColor: color };\n}\n\n/**\n * Always return a solid hex/rgb color string.\n * Extracts the dominant color from gradients, or returns the color as-is.\n * Use for properties that don't support gradients: border, box-shadow, accent-color.\n */\nexport function colorToSolid(color: string): string {\n return getDominantColor(color);\n}\n\n/**\n * Return the correct CSS properties for a border color.\n * Solid colors -> `{ borderColor }`, Gradients -> `{ borderImage, borderStyle: \"solid\" }`.\n */\nexport function colorToBorder(color: string): Record<string, string> {\n if (isGradient(color)) {\n return {\n borderImage: `${color} 1`,\n borderStyle: \"solid\",\n };\n }\n return { borderColor: color };\n}\n","/**\n * Theme engine — resolves, merges, and provides theme values.\n * Pure functions with no framework dependency.\n */\n\nimport type { WidgetTheme, ResolvedWidgetTheme, ComponentTheme, ButtonStyle } from \"../types/theme\";\nimport { getDominantColor } from \"./gradient-utils\";\n\n// ─── Default Theme ───────────────────────────────────────────────────────────\n\nexport const DEFAULT_WIDGET_THEME: ResolvedWidgetTheme = {\n primaryColor: \"#313335\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fafafa\",\n surfaceColor: \"#F3F3F5\",\n textColor: \"#212121\",\n mutedTextColor: \"#11111180\",\n borderColor: \"#e5e5e5\",\n errorColor: \"#ef4444\",\n successColor: \"#10b981\",\n buttonStyle: \"rounded\",\n borderRadius: \"20px\",\n fontFamily: \"inherit\",\n};\n\n// ─── Theme Merging ───────────────────────────────────────────────────────────\n\n/** Merge a partial user theme with the defaults. Returns a fully resolved theme. */\nexport function mergeWidgetTheme(theme?: WidgetTheme): ResolvedWidgetTheme {\n return { ...DEFAULT_WIDGET_THEME, ...theme };\n}\n\n/** Merge a component-level theme with the widget theme as fallback. */\nexport function mergeComponentTheme(componentTheme?: ComponentTheme, widgetTheme?: ResolvedWidgetTheme): ComponentTheme {\n const base = widgetTheme ?? DEFAULT_WIDGET_THEME;\n return {\n primaryColor: base.primaryColor,\n primaryTextColor: base.primaryTextColor,\n backgroundColor: base.backgroundColor,\n surfaceColor: base.surfaceColor,\n textColor: base.textColor,\n mutedTextColor: base.mutedTextColor,\n borderColor: base.borderColor,\n errorColor: base.errorColor,\n successColor: base.successColor,\n fontFamily: base.fontFamily,\n borderRadius: base.borderRadius,\n buttonStyle: base.buttonStyle,\n ...componentTheme,\n };\n}\n\n// ─── Button Radius ───────────────────────────────────────────────────────────\n\n/** Get button border radius based on style */\nexport function getButtonRadius(style?: ButtonStyle): string {\n switch (style) {\n case \"pill\":\n return \"9999px\";\n case \"square\":\n return \"6px\";\n case \"rounded\":\n default:\n return \"12px\";\n }\n}\n\n// ─── Color Contrast ──────────────────────────────────────────────────────────\n\n/**\n * Calculate relative luminance of a color.\n * Handles both solid hex colors and gradient strings (uses dominant color).\n */\nfunction getLuminance(hexColor: string): number {\n const solid = getDominantColor(hexColor);\n const hex = solid.replace(\"#\", \"\");\n const r = parseInt(hex.substr(0, 2), 16) / 255;\n const g = parseInt(hex.substr(2, 2), 16) / 255;\n const b = parseInt(hex.substr(4, 2), 16) / 255;\n\n const toLinear = (c: number) => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** Check if a color is considered \"light\" (for auto-contrast) */\nexport function isLightColor(hexColor: string): boolean {\n try {\n return getLuminance(hexColor) > 0.5;\n } catch {\n return true; // Default to light if parsing fails\n }\n}\n\n/** Get a contrasting text color (black or white) for a given background */\nexport function getContrastingTextColor(bgColor: string): string {\n return isLightColor(bgColor) ? \"#212121\" : \"#ffffff\";\n}\n\n// ─── Preset Themes ───────────────────────────────────────────────────────────\n\nexport const WIDGET_PRESET_THEMES: Record<string, WidgetTheme> = {\n light: {\n primaryColor: \"#18181b\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#ffffff\",\n surfaceColor: \"#f4f4f5\",\n textColor: \"#18181b\",\n mutedTextColor: \"#71717a\",\n borderColor: \"#e4e4e7\",\n },\n warm: {\n primaryColor: \"#57534e\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fefefe\",\n surfaceColor: \"#fafaf9\",\n textColor: \"#1c1917\",\n mutedTextColor: \"#78716c\",\n borderColor: \"#e7e5e4\",\n },\n blue: {\n primaryColor: \"#2563eb\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fafcff\",\n surfaceColor: \"#f0f7ff\",\n textColor: \"#1e3a8a\",\n mutedTextColor: \"#64748b\",\n borderColor: \"#dbeafe\",\n },\n indigo: {\n primaryColor: \"#6366f1\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fbfbff\",\n surfaceColor: \"#f5f5ff\",\n textColor: \"#312e81\",\n mutedTextColor: \"#6b7280\",\n borderColor: \"#e0e7ff\",\n },\n green: {\n primaryColor: \"#16a34a\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fbfefb\",\n surfaceColor: \"#f0fdf4\",\n textColor: \"#14532d\",\n mutedTextColor: \"#6b7280\",\n borderColor: \"#dcfce7\",\n },\n orange: {\n primaryColor: \"#ea580c\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fffdfb\",\n surfaceColor: \"#fff7ed\",\n textColor: \"#7c2d12\",\n mutedTextColor: \"#78716c\",\n borderColor: \"#ffedd5\",\n },\n dark: {\n primaryColor: \"#fafafa\",\n primaryTextColor: \"#18181b\",\n backgroundColor: \"#18181b\",\n surfaceColor: \"#27272a\",\n textColor: \"#fafafa\",\n mutedTextColor: \"#a1a1aa\",\n borderColor: \"#3f3f46\",\n },\n sunset: {\n primaryColor: \"linear-gradient(135deg, #f97316, #ef4444)\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#fffbf7\",\n surfaceColor: \"#fff3e8\",\n textColor: \"#7c2d12\",\n mutedTextColor: \"#9a3412\",\n borderColor: \"#fed7aa\",\n },\n ocean: {\n primaryColor: \"linear-gradient(135deg, #667eea, #764ba2)\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#faf9ff\",\n surfaceColor: \"#f0edff\",\n textColor: \"#312e81\",\n mutedTextColor: \"#6366f1\",\n borderColor: \"#ddd6fe\",\n },\n emerald: {\n primaryColor: \"linear-gradient(135deg, #10b981, #0ea5e9)\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#f7fdfb\",\n surfaceColor: \"#ecfdf5\",\n textColor: \"#064e3b\",\n mutedTextColor: \"#047857\",\n borderColor: \"#a7f3d0\",\n },\n midnight: {\n primaryColor: \"linear-gradient(135deg, #6366f1, #8b5cf6)\",\n primaryTextColor: \"#ffffff\",\n backgroundColor: \"#18181b\",\n surfaceColor: \"#27272a\",\n textColor: \"#fafafa\",\n mutedTextColor: \"#a1a1aa\",\n borderColor: \"#3f3f46\",\n },\n};\n","/**\n * Component data helpers — pure functions for working with interactive component data.\n * Shared across web and React Native.\n */\n\nimport type { CalendarSlot, GroupedSlots, ComponentPayload, CalendarBookingPayload, FormPayload, ButtonsPayload, ConfirmationPayload, InteractiveFlowPayload } from \"../types/components\";\n\n// ─── Calendar Helpers ────────────────────────────────────────────────────────\n\n/** Group calendar slots by date for display */\nexport function groupSlotsByDate(slots: CalendarSlot[]): GroupedSlots[] {\n const grouped = new Map<string, CalendarSlot[]>();\n\n slots.forEach((slot) => {\n const date = new Date(slot.datetime);\n const dateKey = date.toISOString().split(\"T\")[0];\n\n if (!grouped.has(dateKey)) {\n grouped.set(dateKey, []);\n }\n grouped.get(dateKey)!.push(slot);\n });\n\n return Array.from(grouped.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([dateKey, dateSlots]) => {\n const date = new Date(dateKey);\n return {\n date: dateKey,\n dateLabel: date.toLocaleDateString(\"en-US\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n }),\n slots: dateSlots.sort((a, b) => new Date(a.datetime).getTime() - new Date(b.datetime).getTime()),\n };\n });\n}\n\n/** Format a slot time for display */\nexport function formatSlotTime(datetime: string, timezone?: string): string {\n const date = new Date(datetime);\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timezone,\n });\n}\n\n/** Format a slot date for display */\nexport function formatSlotDate(datetime: string, timezone?: string): string {\n const date = new Date(datetime);\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n timeZone: timezone,\n });\n}\n\n// ─── Payload Helpers ─────────────────────────────────────────────────────────\n\n/** Replace placeholders in a payload template with actual values */\nexport function buildPayload(template: Record<string, string>, values: Record<string, string>): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(template)) {\n if (typeof value === \"string\" && value.startsWith(\"{\") && value.endsWith(\"}\")) {\n const placeholder = value.slice(1, -1);\n result[key] = values[placeholder] ?? value;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n// ─── Type Guards ─────────────────────────────────────────────────────────────\n\nexport function isCalendarBooking(payload: ComponentPayload): payload is CalendarBookingPayload {\n return payload.component_type === \"calendar_booking\";\n}\n\nexport function isForm(payload: ComponentPayload): payload is FormPayload {\n return payload.component_type === \"form\";\n}\n\nexport function isButtons(payload: ComponentPayload): payload is ButtonsPayload {\n return payload.component_type === \"buttons\";\n}\n\nexport function isConfirmation(payload: ComponentPayload): payload is ConfirmationPayload {\n return payload.component_type === \"confirmation\";\n}\n\nexport function isInteractiveFlow(payload: ComponentPayload): payload is InteractiveFlowPayload {\n return payload.component_type === \"interactive_flow\";\n}\n\n// ─── Slash Command Helpers ───────────────────────────────────────────────────\n\nimport type { SlashCommand } from \"../types/slash-commands\";\n\n/** Filter slash commands by query (must start with \"/\") */\nexport function filterSlashCommands(commands: SlashCommand[], query: string): SlashCommand[] {\n if (!query.startsWith(\"/\")) return [];\n const search = query.slice(1).toLowerCase();\n if (!search) return commands;\n return commands.filter((cmd) => cmd.command.slice(1).toLowerCase().includes(search) || cmd.display_name.toLowerCase().includes(search));\n}\n\n// ─── Widget Domain Helpers ───────────────────────────────────────────────────\n\nimport type { DiseaseOption } from \"../types/widget\";\n\nexport function hasSubQuestions(disease: DiseaseOption): boolean {\n return disease.sub_questions.length > 0;\n}\n\nexport function getDiseasesWithSubQuestions(selected: DiseaseOption[]): DiseaseOption[] {\n return selected.filter(hasSubQuestions);\n}\n\n// ─── Timestamp Helpers ───────────────────────────────────────────────────────\n\nexport function formatTimestamp(dateString: string | number, mode: \"fromnow\" | \"formatted\" = \"fromnow\"): string {\n const date = new Date(dateString);\n const now = new Date();\n\n if (mode === \"fromnow\") {\n const diffSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (diffSeconds < 60) return \"Just now\";\n if (diffSeconds < 3600) {\n const minutes = Math.floor(diffSeconds / 60);\n return `${minutes} min ago`;\n }\n if (diffSeconds < 86400) {\n const hours = Math.floor(diffSeconds / 3600);\n return `${hours} hour${hours !== 1 ? \"s\" : \"\"} ago`;\n }\n const days = Math.floor(diffSeconds / 86400);\n return `${days} day${days !== 1 ? \"s\" : \"\"} ago`;\n }\n\n return date.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n });\n}\n\n/** Detect if a participant identity is an agent */\nexport function isAgentIdentity(identity: string): boolean {\n return identity.includes(\"agent\") || identity.includes(\"Agent\");\n}\n","/**\n * RPC message formatting — transforms between backend RPC format and internal component format.\n *\n * The backend sends `send_dynamic_data` RPCs with a format like:\n * { component_type: \"render_component_calendar\", component_config: { ... } }\n *\n * The widget needs them in an internal format like:\n * { component_type: \"calendar_booking\", component_id: \"calendar_1234\", data: { ... } }\n *\n * This module handles both directions of transformation.\n */\n\nimport type { SimpleComponentPayload, InteractiveFlowPayload, FormField, FormFieldType } from \"../types/components\";\n\n// ─── Backend -> Widget Transform ─────────────────────────────────────────────\n\n/**\n * Transform a backend RPC payload into the internal component format.\n * Returns null if the component type is unknown.\n */\nexport function transformRpcToComponent(componentName: string, rpcPayload: Record<string, unknown>): SimpleComponentPayload | InteractiveFlowPayload | null {\n const componentId = `${componentName}_${Date.now()}`;\n const config = rpcPayload.component_config;\n\n if (componentName === \"calendar\") {\n return transformCalendar(componentId, config, rpcPayload);\n }\n\n if (componentName === \"form\") {\n return transformForm(componentId, config);\n }\n\n if (componentName === \"buttons\") {\n return transformButtons(componentId, config, rpcPayload);\n }\n\n if (componentName === \"confirmation\") {\n return transformConfirmation(componentId, rpcPayload);\n }\n\n // If already in the correct format, return as-is\n if (rpcPayload.component_type && rpcPayload.component_id) {\n return rpcPayload as unknown as SimpleComponentPayload | InteractiveFlowPayload;\n }\n\n return null;\n}\n\nfunction transformCalendar(componentId: string, config: unknown, rpcPayload: Record<string, unknown>): SimpleComponentPayload {\n const configObj = config as { timezone?: string; slots?: Array<{ id: string; datetime: string }> };\n const slots = configObj?.slots || [];\n const timezone = configObj?.timezone || \"UTC\";\n\n return {\n component_type: \"calendar_booking\",\n component_id: componentId,\n data: {\n available_slots: slots.map((slot) => ({ id: slot.id, datetime: slot.datetime })),\n timezone,\n title: (rpcPayload.title as string) || \"Select a time slot\",\n },\n };\n}\n\nfunction transformForm(componentId: string, config: unknown): SimpleComponentPayload {\n const configObj = config as {\n title?: string;\n description?: string;\n cta?: string;\n submit_label?: string;\n fields?: Array<{\n key?: string;\n name?: string;\n type: string;\n description?: string;\n label?: string;\n required?: boolean;\n placeholder?: string;\n options?: string[] | Array<{ label: string; value: string }>;\n }>;\n };\n\n const transformedFields: FormField[] = (configObj?.fields || []).map((field) => ({\n name: field.key || field.name || \"\",\n type: mapFieldType(field.type),\n label: field.description || field.label || field.key || field.name || \"\",\n required: field.required,\n placeholder: field.placeholder,\n options: field.options,\n }));\n\n return {\n component_type: \"form\",\n component_id: componentId,\n data: {\n title: configObj?.title || \"Form\",\n description: configObj?.description,\n fields: transformedFields,\n submit_label: configObj?.cta || configObj?.submit_label || \"Submit\",\n },\n };\n}\n\nfunction transformButtons(componentId: string, config: unknown, rpcPayload: Record<string, unknown>): SimpleComponentPayload {\n return {\n component_type: \"buttons\",\n component_id: componentId,\n data: {\n title: rpcPayload.title as string,\n buttons: Array.isArray(config) ? config : [],\n },\n };\n}\n\nfunction transformConfirmation(componentId: string, rpcPayload: Record<string, unknown>): SimpleComponentPayload {\n return {\n component_type: \"confirmation\",\n component_id: componentId,\n data: {\n title: (rpcPayload.title as string) || \"Confirmed\",\n message: (rpcPayload.message as string) || \"\",\n icon: (rpcPayload.icon as \"success\" | \"info\" | \"warning\" | \"error\") || \"success\",\n details: rpcPayload.details as Array<{ label: string; value: string }>,\n },\n };\n}\n\n/** Map backend field type strings to internal FormFieldType */\nfunction mapFieldType(backendType: string): FormFieldType {\n const typeMap: Record<string, FormFieldType> = {\n text: \"text\",\n string: \"text\",\n number: \"number\",\n email: \"email\",\n phone_number: \"tel\",\n single_select: \"select\",\n multiselect: \"multiselect\",\n checkbox: \"boolean\",\n date: \"date\",\n textarea: \"textarea\",\n };\n return typeMap[backendType] || \"text\";\n}\n\n// ─── Widget -> Backend Transform ─────────────────────────────────────────────\n\n/**\n * Format a component response payload for sending back to the backend via RPC.\n * Used when the user interacts with a component (e.g., selects a calendar slot, submits a form).\n */\nexport function formatComponentResponse(componentName: string, componentId: string, responseData: Record<string, unknown>, originalConfig: unknown): { method: string; payload: string } {\n const rpcMethod = \"receive_dynamic_data\";\n\n let componentData: unknown;\n\n if (componentName === \"calendar\") {\n const slotId = responseData.step_data && (responseData.step_data as Record<string, string>).slot_id;\n const configObj = originalConfig as { timezone?: string; slots?: Array<{ id: string; datetime: string }> };\n const slots = configObj?.slots || [];\n const timezone = configObj?.timezone || \"UTC\";\n const selectedSlot = slots.find((slot) => slot.id === slotId);\n\n componentData = {\n id: selectedSlot?.id || slotId,\n datetime: selectedSlot?.datetime || (responseData.step_data as Record<string, string>)?.slot_datetime,\n timezone,\n };\n } else if (componentName === \"form\") {\n componentData = responseData.step_data || responseData.all_data;\n } else if (componentName === \"buttons\") {\n const buttonId = responseData.step_data && (responseData.step_data as Record<string, string>).selected_button;\n const buttons = Array.isArray(originalConfig) ? originalConfig : [];\n const selectedButton = buttons.find((btn: { id: string }) => btn.id === buttonId);\n componentData = selectedButton || { id: buttonId };\n } else {\n componentData = responseData;\n }\n\n const toolId = (originalConfig as { tool_id?: string })?.tool_id;\n\n const payload = JSON.stringify({\n component_type: `receive_component_${componentName}`,\n component_id: componentId,\n component_data: componentData,\n ...(toolId && { tool_id: toolId }),\n });\n\n return { method: rpcMethod, payload };\n}\n\n/**\n * Format a disease widget submission for sending via RPC.\n */\nexport function formatDiseaseSubmission(componentId: string, selections: Array<{ disease_name: string; sub_questions: Array<{ question_id: string; answer: string }> }>): { method: string; payload: string } {\n return {\n method: \"receive_dynamic_data\",\n payload: JSON.stringify({\n component_type: \"receive_component_disease_plans\",\n component_id: componentId,\n selections,\n }),\n };\n}\n\n/**\n * Format a disease search query for sending via RPC.\n */\nexport function formatDiseaseSearch(query: string): { method: string; payload: string } {\n return {\n method: \"receive_dynamic_data\",\n payload: JSON.stringify({\n component_type: \"receive_component_disease_search\",\n query,\n }),\n };\n}\n\n/**\n * Format a slash command for sending via RPC.\n */\nexport function formatSlashCommand(command: string): { method: string; payload: string } {\n return {\n method: \"receive_dynamic_data\",\n payload: JSON.stringify({\n component_type: \"receive_component_slash_command\",\n command: command.replace(/^\\//, \"\"),\n }),\n };\n}\n"]}