flowgrid-sdk 1.0.0 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"flowgrid.min.js","mappings":"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","sources":["webpack://flowgrid/webpack/universalModuleDefinition","webpack://flowgrid/webpack/bootstrap","webpack://flowgrid/webpack/runtime/define property getters","webpack://flowgrid/webpack/runtime/hasOwnProperty shorthand","webpack://flowgrid/webpack/runtime/make namespace object","webpack://flowgrid/./src/lib/client/ftrpc.ts","webpack://flowgrid/./src/lib/features/core/activation.ts","webpack://flowgrid/./src/lib/features/core/track-feature.ts","webpack://flowgrid/./src/lib/features/core/experiment.ts","webpack://flowgrid/./src/lib/features/core/feature-flag.ts","webpack://flowgrid/./src/lib/features/analytics/page-views.ts","webpack://flowgrid/./src/lib/features/analytics/sessions.ts","webpack://flowgrid/./src/lib/features/analytics/events.ts","webpack://flowgrid/./src/lib/features/analytics/identify.ts","webpack://flowgrid/./src/lib/features/ecommerce/products.ts","webpack://flowgrid/./src/lib/features/ecommerce/cart.ts","webpack://flowgrid/./src/lib/features/ecommerce/checkout.ts","webpack://flowgrid/./src/lib/features/ecommerce/purchases.ts","webpack://flowgrid/./src/browser.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"flowgrid\"] = factory();\n\telse\n\t\troot[\"flowgrid\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","type Config = {\n eventName: string,\n type: \n // generic\n | \"query\"\n // Core types\n | \"activation\" \n | \"feature_usage\" \n | \"prompt\" \n | \"experiment\" \n | \"feature_flag_evaluation\"\n | \"feature_flag_definition\"\n | \"feature_flag_status\"\n | \"feature_flag_rollout\"\n // Analytics types\n | \"page_view\"\n | \"session\"\n | \"custom_event\"\n | \"batch_events\"\n | \"click_event\"\n | \"form_event\"\n | \"search_event\"\n | \"error_event\"\n | \"identify\"\n | \"funnel\"\n | \"retention\"\n | \"attribution\"\n | \"heatmap\"\n | \"performance\"\n // Ecommerce types\n | \"product\"\n | \"cart\"\n | \"checkout\"\n | \"purchase\"\n | \"refund\"\n | \"promotion\"\n | \"wishlist\"\n | \"ltv\"\n | \"search\"\n | \"inventory\"\n | \"subscription\"\n // Enterprise types\n | \"engagement\"\n | \"cohorts\"\n | \"churn\"\n | \"monetization\"\n | \"multi_path_funnels\"\n | \"support\"\n | \"acquisition\"\n | \"paths\"\n | \"alerts\"\n | \"security\"\n | \"forecasting\",\n properties: Record<string, any>\n}\n\n/**\n * Base SDK Class\n * - Flowgrid TypeScript Remote Procedure Call\n * - Handles common logic for sending events to the API.\n *\n * PRIVACY NOTICE:\n * This SDK collects event data for analytics purposes. Ensure compliance with\n * applicable privacy laws (GDPR, CCPA, etc.) when collecting user data.\n * Do not send personally identifiable information without proper consent.\n *\n * ```typescript\n * await this.init('eventName', { key: 'value' });\n * ```\n */\nexport class FTRPC {\n /**\n * Web ID for the specific site or application.\n * Used to identify the event source.\n */\n protected webId: string;\n\n /**\n * API endpoint for sending events.\n * Example: \"https://api.flowgrid.com\"\n */\n protected endpoint: string;\n\n /**\n * API Key for authenticating requests.\n */\n private apiKey: string;\n\n constructor(webId: string, endpoint: string, apiKey: string) {\n if (!webId || !endpoint || webId.length === 0 || endpoint.length === 0) {\n throw new Error(\"SDK init failed: webId and endpoint are required.\");\n }\n this.webId = webId;\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n /**\n * Sends an event to the API.\n * Used internally by subclasses to track events.\n *\n * @param eventName - Name of the event to track.\n * @param properties - Additional properties to send with the event.\n */\n protected async init<T>(eventName: string, properties: Record<string, any> = {}, request: \"GET\" | \"POST\" | \"PATCH\" = \"POST\"): Promise<T> {\n \n this.validateInput(eventName, properties);\n\n const url = `https://${this.endpoint}/sdk/functions?call=${properties.type || \"event\"}`;\n const body = JSON.stringify({\n web_id: this.webId,\n event_name: eventName,\n properties,\n });\n \n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n try {\n const res = await fetch(url, {\n method: request,\n headers: { \n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${this.apiKey}`\n },\n body: request === \"POST\" || request === \"PATCH\" ? body : undefined,\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!res.ok) {\n const statusText = res.statusText || 'Unknown error';\n throw new Error(`Failed to track event: ${res.status} ${statusText}`);\n }\n\n return await res.json();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timed out');\n }\n throw error;\n }\n }\n\n /**\n * Validates input parameters for security and correctness.\n */\n private validateInput(eventName: string, properties: Record<string, any>) {\n \n if (!eventName || typeof eventName !== 'string' || eventName.trim().length === 0) {\n throw new Error('Event name must be a non-empty string');\n }\n\n if (eventName.length > 100) {\n throw new Error('Event name must be less than 100 characters');\n }\n\n // Check for potentially sensitive keys\n const sensitiveKeys = ['password', 'token', 'secret', 'key', 'apikey', 'authorization'];\n const propertiesStr = JSON.stringify(properties).toLowerCase();\n \n for (const key of sensitiveKeys) {\n if (propertiesStr.includes(key)) {\n console.warn(`Warning: Properties may contain sensitive data (${key}). Please ensure this is intended.`);\n }\n }\n\n // Limit payload size (rough estimate)\n const payloadSize = JSON.stringify({ web_id: this.webId, event_name: eventName, properties }).length;\n if (payloadSize > 10000) { // 10KB limit\n throw new Error('Event payload too large (max 10KB)');\n }\n }\n}","/**\n * @fileoverview Core - User Activation Tracking\n * @module features/core/activation\n * \n * @description\n * Track user activation events including onboarding steps,\n * signup completions, and first-time actions.\n * \n * @useCases\n * - Track onboarding step completions\n * - Monitor signup funnel\n * - Measure time to first value\n * - Identify activation bottlenecks\n * - A/B test onboarding flows\n * \n * @metrics\n * - Activation rate\n * - Onboarding completion rate\n * - Time to activate\n * - Drop-off by step\n * - Activation by source\n * \n * @chartData\n * - Funnel chart: Onboarding steps\n * - Line chart: Activation rate over time\n * - Bar chart: Activation by cohort/source\n * - KPI: Time to first value\n * \n * @example\n * ```typescript\n * const activation = new Activation(webId, endpoint, apiKey);\n * \n * // Track activation event\n * await activation.create({\n * eventName: 'onboarding_completed',\n * properties: { userId: 'user_123', step: 'profile_setup' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base configuration for activation events.\n */\nexport interface ActivationConfig {\n /** Event name */\n eventName: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Onboarding step configuration.\n */\nexport interface OnboardingStepConfig {\n /** User ID */\n userId: string;\n /** Step identifier */\n stepId: string;\n /** Step name */\n stepName: string;\n /** Step order/number */\n stepOrder: number;\n /** Total steps in flow */\n totalSteps: number;\n /** Time spent on step (ms) */\n timeSpent?: number;\n /** Whether step was skipped */\n skipped?: boolean;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * First action configuration.\n */\nexport interface FirstActionConfig {\n /** User ID */\n userId: string;\n /** Action name */\n actionName: string;\n /** Time since signup (ms) */\n timeSinceSignup: number;\n /** Source/referrer */\n source?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Activation response from API.\n */\nexport interface ActivationResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n activationId?: string;\n isFirstActivation?: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Activation analytics data.\n */\nexport interface ActivationAnalyticsData {\n /** Summary metrics */\n summary: {\n totalSignups: number;\n activatedUsers: number;\n activationRate: number;\n avgTimeToActivate: number;\n onboardingCompletionRate: number;\n };\n /** Activation by step */\n byStep: Array<{\n stepId: string;\n stepName: string;\n started: number;\n completed: number;\n dropOff: number;\n avgTimeSpent: number;\n }>;\n /** Activation by source */\n bySource: Array<{\n source: string;\n signups: number;\n activated: number;\n activationRate: number;\n }>;\n /** Activation trends */\n trends: TimeSeriesData;\n /** Cohort activation */\n byCohort: Array<{\n cohort: string;\n users: number;\n activated: number;\n activationRate: number;\n avgTimeToActivate: number;\n }>;\n}\n\n// ============================================================================\n// ACTIVATION CLASS\n// ============================================================================\n\n/**\n * Activation - Track user activation events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides activation tracking including:\n * - Generic activation events\n * - Onboarding step tracking\n * - First action tracking\n * - Signup completion\n * - Activation analytics\n * \n * @example\n * ```typescript\n * const activation = new Activation(webId, endpoint, apiKey);\n * \n * // Track onboarding step\n * await activation.trackOnboardingStep({\n * userId: 'user_123',\n * stepId: 'profile_setup',\n * stepName: 'Set Up Profile',\n * stepOrder: 2,\n * totalSteps: 5\n * });\n * \n * // Track first value action\n * await activation.trackFirstAction({\n * userId: 'user_123',\n * actionName: 'created_first_project',\n * timeSinceSignup: 3600000 // 1 hour\n * });\n * ```\n */\nexport class Activation extends FTRPC {\n /**\n * Creates and tracks an activation event.\n * \n * @param config - Activation configuration\n * @returns Promise resolving to activation response\n */\n async create(config: ActivationConfig): Promise<ActivationResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"activation\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks an onboarding step completion.\n * \n * @param config - Onboarding step configuration\n * @returns Promise resolving to activation response\n */\n async trackOnboardingStep(config: OnboardingStepConfig): Promise<ActivationResponse> {\n return await this.init(\"onboarding_step\", {\n type: \"activation\",\n subtype: \"onboarding_step\",\n userId: config.userId,\n stepId: config.stepId,\n stepName: config.stepName,\n stepOrder: config.stepOrder,\n totalSteps: config.totalSteps,\n progress: Math.round((config.stepOrder / config.totalSteps) * 100),\n timeSpent: config.timeSpent,\n skipped: config.skipped || false,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks onboarding completion.\n * \n * @param userId - User ID\n * @param totalTimeSpent - Total time in onboarding (ms)\n * @param stepsCompleted - Number of steps completed\n * @param stepsSkipped - Number of steps skipped\n * @returns Promise resolving to activation response\n */\n async completeOnboarding(\n userId: string,\n totalTimeSpent: number,\n stepsCompleted: number,\n stepsSkipped: number\n ): Promise<ActivationResponse> {\n return await this.init(\"onboarding_completed\", {\n type: \"activation\",\n subtype: \"onboarding_complete\",\n userId,\n totalTimeSpent,\n stepsCompleted,\n stepsSkipped,\n completionRate: Math.round((stepsCompleted / (stepsCompleted + stepsSkipped)) * 100),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks user's first meaningful action (activation moment).\n * \n * @param config - First action configuration\n * @returns Promise resolving to activation response\n */\n async trackFirstAction(config: FirstActionConfig): Promise<ActivationResponse> {\n return await this.init(\"first_action\", {\n type: \"activation\",\n subtype: \"first_action\",\n userId: config.userId,\n actionName: config.actionName,\n timeSinceSignup: config.timeSinceSignup,\n source: config.source,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks signup completion.\n * \n * @param userId - User ID\n * @param method - Signup method (email, google, etc.)\n * @param source - Traffic source\n * @param properties - Additional properties\n * @returns Promise resolving to activation response\n */\n async trackSignup(\n userId: string,\n method: 'email' | 'google' | 'github' | 'apple' | 'sso' | string,\n source?: string,\n properties?: Record<string, unknown>\n ): Promise<ActivationResponse> {\n return await this.init(\"signup_completed\", {\n type: \"activation\",\n subtype: \"signup\",\n userId,\n method,\n source,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets activation analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to activation analytics\n * \n * @example\n * ```typescript\n * const analytics = await activation.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Funnel chart - onboarding steps\n * const funnel = analytics.byStep.map(s => ({\n * name: s.stepName,\n * value: s.completed\n * }));\n * \n * // KPI - activation rate\n * const activationRate = analytics.summary.activationRate;\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<ActivationAnalyticsData> {\n return await this.init(\"get_activation_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Activation;\n","/**\n * @fileoverview Core - Feature Usage Tracking\n * @module features/core/track-feature\n * \n * @description\n * Track feature usage events to understand how users\n * interact with different parts of your product.\n * \n * @useCases\n * - Track feature adoption rates\n * - Measure feature engagement\n * - Identify power users\n * - Prioritize feature development\n * - Detect underused features\n * \n * @metrics\n * - Feature adoption rate\n * - Feature usage frequency\n * - Users per feature\n * - Feature stickiness\n * - Time spent per feature\n * \n * @chartData\n * - Bar chart: Most used features\n * - Heatmap: Feature usage by user segment\n * - Line chart: Feature adoption over time\n * - Table: Feature engagement metrics\n * \n * @example\n * ```typescript\n * const trackFeature = new TrackFeature(webId, endpoint, apiKey);\n * \n * await trackFeature.create({\n * eventName: 'export_report',\n * properties: { format: 'csv', rowCount: 1000 }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base configuration for feature tracking.\n */\nexport interface FeatureConfig {\n /** Event/feature name */\n eventName: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Detailed feature usage configuration.\n */\nexport interface FeatureUsageConfig {\n /** Feature identifier */\n featureId: string;\n /** Feature name */\n featureName: string;\n /** User ID */\n userId?: string;\n /** Usage action */\n action: 'viewed' | 'used' | 'completed' | 'abandoned';\n /** Time spent (ms) */\n duration?: number;\n /** Success/failure */\n success?: boolean;\n /** Feature category */\n category?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Feature discovery configuration.\n */\nexport interface FeatureDiscoveryConfig {\n /** Feature identifier */\n featureId: string;\n /** User ID */\n userId: string;\n /** How feature was discovered */\n discoveryMethod: 'organic' | 'tooltip' | 'announcement' | 'search' | 'onboarding' | 'recommendation';\n /** Whether user engaged with feature */\n engaged: boolean;\n}\n\n/**\n * Feature tracking response.\n */\nexport interface FeatureResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n featureId?: string;\n isFirstUse?: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Feature analytics data.\n */\nexport interface FeatureAnalyticsData {\n /** Summary metrics */\n summary: {\n totalFeatures: number;\n totalUsage: number;\n uniqueUsers: number;\n avgUsagePerUser: number;\n mostUsedFeature: string;\n leastUsedFeature: string;\n };\n /** Usage by feature */\n byFeature: Array<{\n featureId: string;\n featureName: string;\n category: string;\n usageCount: number;\n uniqueUsers: number;\n adoptionRate: number;\n avgDuration: number;\n successRate: number;\n }>;\n /** Usage by user segment */\n bySegment: Array<{\n segment: string;\n topFeatures: string[];\n avgFeaturesUsed: number;\n }>;\n /** Feature trends */\n trends: TimeSeriesData;\n /** Feature correlations */\n correlations: Array<{\n featureA: string;\n featureB: string;\n correlation: number;\n }>;\n}\n\n// ============================================================================\n// TRACK FEATURE CLASS\n// ============================================================================\n\n/**\n * TrackFeature - Track feature usage events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides feature tracking including:\n * - Generic feature events\n * - Detailed usage tracking\n * - Feature discovery tracking\n * - Adoption analytics\n * - Engagement metrics\n * \n * @example\n * ```typescript\n * const trackFeature = new TrackFeature(webId, endpoint, apiKey);\n * \n * // Simple feature tracking\n * await trackFeature.create({\n * eventName: 'dark_mode_enabled',\n * properties: { userId: 'user_123' }\n * });\n * \n * // Detailed feature usage\n * await trackFeature.trackUsage({\n * featureId: 'export',\n * featureName: 'Data Export',\n * userId: 'user_123',\n * action: 'completed',\n * duration: 5000,\n * success: true,\n * properties: { format: 'csv' }\n * });\n * ```\n */\nexport class TrackFeature extends FTRPC {\n /**\n * Records a feature usage event.\n * \n * @param config - Feature configuration\n * @returns Promise resolving to feature response\n */\n async create(config: FeatureConfig): Promise<FeatureResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"feature_usage\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks detailed feature usage.\n * \n * @param config - Feature usage configuration\n * @returns Promise resolving to feature response\n */\n async trackUsage(config: FeatureUsageConfig): Promise<FeatureResponse> {\n return await this.init(\"feature_usage\", {\n type: \"feature_usage\",\n subtype: config.action,\n featureId: config.featureId,\n featureName: config.featureName,\n userId: config.userId,\n action: config.action,\n duration: config.duration,\n success: config.success,\n category: config.category,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks feature discovery.\n * \n * @param config - Feature discovery configuration\n * @returns Promise resolving to feature response\n */\n async trackDiscovery(config: FeatureDiscoveryConfig): Promise<FeatureResponse> {\n return await this.init(\"feature_discovery\", {\n type: \"feature_usage\",\n subtype: \"discovery\",\n featureId: config.featureId,\n userId: config.userId,\n discoveryMethod: config.discoveryMethod,\n engaged: config.engaged,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks feature adoption (first-time use).\n * \n * @param featureId - Feature identifier\n * @param userId - User ID\n * @param source - How user found feature\n * @returns Promise resolving to feature response\n */\n async trackAdoption(\n featureId: string,\n userId: string,\n source?: string\n ): Promise<FeatureResponse> {\n return await this.init(\"feature_adopted\", {\n type: \"feature_usage\",\n subtype: \"adoption\",\n featureId,\n userId,\n source,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks feature abandonment.\n * \n * @param featureId - Feature identifier\n * @param userId - User ID\n * @param reason - Abandonment reason\n * @param timeSpent - Time spent before abandoning (ms)\n * @returns Promise resolving to feature response\n */\n async trackAbandonment(\n featureId: string,\n userId: string,\n reason?: string,\n timeSpent?: number\n ): Promise<FeatureResponse> {\n return await this.init(\"feature_abandoned\", {\n type: \"feature_usage\",\n subtype: \"abandonment\",\n featureId,\n userId,\n reason,\n timeSpent,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets feature analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to feature analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<FeatureAnalyticsData> {\n return await this.init(\"get_feature_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default TrackFeature;\n","/**\n * @fileoverview Core - A/B Testing & Experiments\n * @module features/core/experiment\n * \n * @description\n * Track A/B tests, experiments, and variant assignments\n * to measure impact and optimize product decisions.\n * \n * @useCases\n * - Run A/B tests on features\n * - Track variant assignments\n * - Measure experiment impact\n * - Statistical significance analysis\n * - Multi-variant testing\n * \n * @metrics\n * - Conversion by variant\n * - Statistical significance\n * - Sample size per variant\n * - Experiment duration\n * - Impact on key metrics\n * \n * @chartData\n * - Bar chart: Conversion by variant\n * - Line chart: Metric trends by variant\n * - Table: Experiment results summary\n * - Confidence interval visualization\n * \n * @example\n * ```typescript\n * const experiment = new Experiment(webId, endpoint, apiKey);\n * \n * await experiment.track({\n * eventName: 'checkout_flow_test',\n * variant: 'simplified_v2',\n * properties: { userId: 'user_123' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base experiment configuration.\n */\nexport interface ExperimentConfig {\n /** Experiment/event name */\n eventName: string;\n /** Assigned variant */\n variant: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Experiment definition.\n */\nexport interface ExperimentDefinition {\n /** Experiment ID */\n experimentId: string;\n /** Experiment name */\n name: string;\n /** Description */\n description?: string;\n /** Variants */\n variants: Array<{\n variantId: string;\n name: string;\n weight: number;\n }>;\n /** Target audience (optional) */\n audience?: {\n percentage: number;\n filters?: Record<string, unknown>;\n };\n /** Primary metric */\n primaryMetric: string;\n /** Secondary metrics */\n secondaryMetrics?: string[];\n /** Start date */\n startDate?: string;\n /** End date */\n endDate?: string;\n}\n\n/**\n * Experiment assignment configuration.\n */\nexport interface ExperimentAssignmentConfig {\n /** Experiment ID */\n experimentId: string;\n /** User ID */\n userId: string;\n /** Assigned variant ID */\n variantId: string;\n /** Assignment source */\n source?: 'random' | 'targeted' | 'override';\n}\n\n/**\n * Experiment conversion configuration.\n */\nexport interface ExperimentConversionConfig {\n /** Experiment ID */\n experimentId: string;\n /** User ID */\n userId: string;\n /** Variant ID */\n variantId: string;\n /** Metric name */\n metricName: string;\n /** Metric value */\n value: number;\n}\n\n/**\n * Experiment tracking response.\n */\nexport interface ExperimentResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n experimentId?: string;\n variantId?: string;\n };\n timestamp: string;\n}\n\n/**\n * Experiment results data.\n */\nexport interface ExperimentResultsData {\n /** Experiment info */\n experiment: {\n experimentId: string;\n name: string;\n status: 'running' | 'paused' | 'completed';\n startDate: string;\n duration: number;\n };\n /** Results by variant */\n variants: Array<{\n variantId: string;\n name: string;\n participants: number;\n conversions: number;\n conversionRate: number;\n improvement: number;\n confidence: number;\n isWinner: boolean;\n isStatisticallySignificant: boolean;\n }>;\n /** Metric trends */\n trends: Record<string, TimeSeriesData>;\n /** Recommendation */\n recommendation: {\n action: 'ship_winner' | 'continue' | 'stop' | 'needs_more_data';\n winningVariant?: string;\n confidence: number;\n reason: string;\n };\n}\n\n/**\n * All experiments analytics.\n */\nexport interface ExperimentAnalyticsData {\n /** Summary */\n summary: {\n totalExperiments: number;\n activeExperiments: number;\n completedExperiments: number;\n avgExperimentDuration: number;\n winRate: number;\n };\n /** Active experiments */\n active: Array<{\n experimentId: string;\n name: string;\n participants: number;\n daysSinceStart: number;\n leadingVariant: string;\n confidence: number;\n }>;\n /** Recent results */\n recentResults: Array<{\n experimentId: string;\n name: string;\n winner: string;\n improvement: number;\n completedDate: string;\n }>;\n}\n\n// ============================================================================\n// EXPERIMENT CLASS\n// ============================================================================\n\n/**\n * Experiment - Track A/B tests and experiments.\n * \n * @extends FTRPC\n * \n * @description\n * Provides experiment tracking including:\n * - Experiment definition\n * - Variant assignment\n * - Conversion tracking\n * - Results analysis\n * - Statistical significance\n * \n * @example\n * ```typescript\n * const experiment = new Experiment(webId, endpoint, apiKey);\n * \n * // Define experiment\n * await experiment.define({\n * experimentId: 'checkout_v2',\n * name: 'Simplified Checkout',\n * variants: [\n * { variantId: 'control', name: 'Current', weight: 50 },\n * { variantId: 'treatment', name: 'Simplified', weight: 50 }\n * ],\n * primaryMetric: 'checkout_completed'\n * });\n * \n * // Assign user to variant\n * await experiment.assign({\n * experimentId: 'checkout_v2',\n * userId: 'user_123',\n * variantId: 'treatment'\n * });\n * \n * // Track conversion\n * await experiment.trackConversion({\n * experimentId: 'checkout_v2',\n * userId: 'user_123',\n * variantId: 'treatment',\n * metricName: 'checkout_completed',\n * value: 1\n * });\n * ```\n */\nexport class Experiment extends FTRPC {\n /**\n * Tracks an experiment event.\n * \n * @param config - Experiment configuration\n * @returns Promise resolving to experiment response\n */\n async track(config: ExperimentConfig): Promise<ExperimentResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"experiment\",\n variant: config.variant,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Defines a new experiment.\n * \n * @param definition - Experiment definition\n * @returns Promise resolving to experiment response\n */\n async define(definition: ExperimentDefinition): Promise<ExperimentResponse> {\n return await this.init(\"experiment_defined\", {\n type: \"experiment\",\n subtype: \"definition\",\n ...definition,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Assigns a user to an experiment variant.\n * \n * @param config - Assignment configuration\n * @returns Promise resolving to experiment response\n */\n async assign(config: ExperimentAssignmentConfig): Promise<ExperimentResponse> {\n return await this.init(\"experiment_assigned\", {\n type: \"experiment\",\n subtype: \"assignment\",\n experimentId: config.experimentId,\n userId: config.userId,\n variantId: config.variantId,\n source: config.source || \"random\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a conversion for an experiment.\n * \n * @param config - Conversion configuration\n * @returns Promise resolving to experiment response\n */\n async trackConversion(config: ExperimentConversionConfig): Promise<ExperimentResponse> {\n return await this.init(\"experiment_conversion\", {\n type: \"experiment\",\n subtype: \"conversion\",\n experimentId: config.experimentId,\n userId: config.userId,\n variantId: config.variantId,\n metricName: config.metricName,\n value: config.value,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks user exposure to an experiment.\n * \n * @param experimentId - Experiment ID\n * @param userId - User ID\n * @param variantId - Variant ID\n * @returns Promise resolving to experiment response\n */\n async trackExposure(\n experimentId: string,\n userId: string,\n variantId: string\n ): Promise<ExperimentResponse> {\n return await this.init(\"experiment_exposure\", {\n type: \"experiment\",\n subtype: \"exposure\",\n experimentId,\n userId,\n variantId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets results for a specific experiment.\n * \n * @param experimentId - Experiment ID\n * @returns Promise resolving to experiment results\n */\n async getResults(experimentId: string): Promise<ExperimentResultsData> {\n return await this.init(\"get_experiment_results\", {\n type: \"query\",\n experimentId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets experiment analytics overview.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to experiment analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<ExperimentAnalyticsData> {\n return await this.init(\"get_experiment_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Experiment;\n","/**\n * @fileoverview Core - Feature Flags\n * @module features/core/feature-flag\n * \n * @description\n * Track feature flag evaluations and usage to understand\n * rollout progress and flag performance.\n * \n * @useCases\n * - Track flag evaluations\n * - Monitor rollout progress\n * - Analyze flag impact\n * - Debug flag configurations\n * - Measure gradual rollouts\n * \n * @metrics\n * - Evaluations per flag\n * - Unique users per variant\n * - Rollout percentage\n * - Error rate\n * - Flag age\n * \n * @chartData\n * - Pie chart: Users by variant\n * - Line chart: Evaluations over time\n * - Table: Active flags summary\n * - Bar chart: Top evaluated flags\n * \n * @example\n * ```typescript\n * const featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n * \n * await featureFlag.evaluate({\n * eventName: 'new_dashboard',\n * properties: { userId: 'user_123', result: true }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base feature flag configuration.\n */\nexport interface FlagConfig {\n /** Flag name/event */\n eventName: string;\n /** Evaluation properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Feature flag definition.\n */\nexport interface FlagDefinition {\n /** Flag key */\n flagKey: string;\n /** Flag name */\n name: string;\n /** Description */\n description?: string;\n /** Flag type */\n type: 'boolean' | 'string' | 'number' | 'json';\n /** Default value */\n defaultValue: boolean | string | number | Record<string, unknown>;\n /** Variants (for multivariate flags) */\n variants?: Array<{\n key: string;\n value: boolean | string | number | Record<string, unknown>;\n weight?: number;\n }>;\n /** Targeting rules */\n targeting?: {\n rules: Array<{\n attribute: string;\n operator: 'equals' | 'contains' | 'in' | 'gt' | 'lt';\n value: unknown;\n variant: string;\n }>;\n };\n /** Rollout percentage (0-100) */\n rolloutPercentage?: number;\n}\n\n/**\n * Flag evaluation configuration.\n */\nexport interface FlagEvaluationConfig {\n /** Flag key */\n flagKey: string;\n /** User ID */\n userId?: string;\n /** Evaluation context */\n context?: Record<string, unknown>;\n /** Evaluated variant/value */\n result: boolean | string | number | Record<string, unknown>;\n /** Reason for evaluation result */\n reason?: 'default' | 'targeting' | 'rollout' | 'override' | 'error';\n /** Evaluation duration (ms) */\n duration?: number;\n}\n\n/**\n * Feature flag response.\n */\nexport interface FlagResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n flagKey?: string;\n };\n timestamp: string;\n}\n\n/**\n * Single flag analytics.\n */\nexport interface FlagAnalyticsData {\n /** Flag info */\n flag: {\n flagKey: string;\n name: string;\n type: string;\n status: 'active' | 'inactive' | 'archived';\n createdAt: string;\n lastModified: string;\n };\n /** Evaluation stats */\n evaluations: {\n total: number;\n uniqueUsers: number;\n avgDuration: number;\n errorRate: number;\n };\n /** Results by variant */\n byVariant: Array<{\n variant: string;\n evaluations: number;\n uniqueUsers: number;\n percentage: number;\n }>;\n /** Results by reason */\n byReason: Record<string, number>;\n /** Trends */\n trends: TimeSeriesData;\n}\n\n/**\n * All flags analytics.\n */\nexport interface AllFlagsAnalyticsData {\n /** Summary */\n summary: {\n totalFlags: number;\n activeFlags: number;\n totalEvaluations: number;\n uniqueUsers: number;\n avgEvaluationsPerUser: number;\n };\n /** Top flags by evaluations */\n topFlags: Array<{\n flagKey: string;\n name: string;\n evaluations: number;\n uniqueUsers: number;\n rolloutPercentage: number;\n }>;\n /** Stale flags (not evaluated recently) */\n staleFlags: Array<{\n flagKey: string;\n name: string;\n lastEvaluated: string;\n daysSinceEvaluation: number;\n }>;\n /** Flags by status */\n byStatus: {\n active: number;\n inactive: number;\n archived: number;\n };\n}\n\n// ============================================================================\n// FEATURE FLAG CLASS\n// ============================================================================\n\n/**\n * FeatureFlag - Track feature flag evaluations.\n * \n * @extends FTRPC\n * \n * @description\n * Provides feature flag tracking including:\n * - Flag evaluations\n * - Rollout monitoring\n * - Flag definitions\n * - Usage analytics\n * - Stale flag detection\n * \n * @example\n * ```typescript\n * const featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n * \n * // Track evaluation\n * await featureFlag.trackEvaluation({\n * flagKey: 'new_checkout',\n * userId: 'user_123',\n * result: true,\n * reason: 'rollout'\n * });\n * \n * // Get flag analytics\n * const analytics = await featureFlag.getFlagAnalytics('new_checkout');\n * console.log(`${analytics.evaluations.total} evaluations`);\n * ```\n */\nexport class FeatureFlag extends FTRPC {\n /**\n * Evaluates and tracks a feature flag.\n * \n * @param config - Flag configuration\n * @returns Promise resolving to flag response\n */\n async evaluate(config: FlagConfig): Promise<FlagResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"feature_flag_evaluation\",\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Tracks a flag evaluation with details.\n * \n * @param config - Flag evaluation configuration\n * @returns Promise resolving to flag response\n */\n async trackEvaluation(config: FlagEvaluationConfig): Promise<FlagResponse> {\n return await this.init(\"flag_evaluated\", {\n type: \"feature_flag_evaluation\",\n flagKey: config.flagKey,\n userId: config.userId,\n context: config.context,\n result: config.result,\n reason: config.reason || \"default\",\n duration: config.duration,\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Defines/updates a feature flag.\n * \n * @param definition - Flag definition\n * @returns Promise resolving to flag response\n */\n async define(definition: FlagDefinition): Promise<FlagResponse> {\n return await this.init(\"flag_defined\", {\n ...definition,\n type: \"feature_flag_definition\",\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Tracks flag status change (enable/disable).\n * \n * @param flagKey - Flag key\n * @param enabled - Whether flag is enabled\n * @param changedBy - User who made the change\n * @returns Promise resolving to flag response\n */\n async trackStatusChange(\n flagKey: string,\n enabled: boolean,\n changedBy?: string\n ): Promise<FlagResponse> {\n return await this.init(\"flag_status_changed\", {\n type: \"feature_flag_status\",\n flagKey,\n enabled,\n changedBy,\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Tracks rollout percentage change.\n * \n * @param flagKey - Flag key\n * @param previousPercentage - Previous rollout %\n * @param newPercentage - New rollout %\n * @param changedBy - User who made the change\n * @returns Promise resolving to flag response\n */\n async trackRolloutChange(\n flagKey: string,\n previousPercentage: number,\n newPercentage: number,\n changedBy?: string\n ): Promise<FlagResponse> {\n return await this.init(\"flag_rollout_changed\", {\n type: \"feature_flag_rollout\",\n flagKey,\n previousPercentage,\n newPercentage,\n changedBy,\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Gets analytics for a specific flag.\n * \n * @param flagKey - Flag key\n * @param filter - Date range filter\n * @returns Promise resolving to flag analytics\n */\n async getFlagAnalytics(\n flagKey: string,\n filter?: DateRangeFilter\n ): Promise<FlagAnalyticsData> {\n return await this.init(\"get_flag_analytics\", {\n type: \"query\",\n flagKey,\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n\n /**\n * Gets analytics for all flags.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to all flags analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<AllFlagsAnalyticsData> {\n return await this.init(\"get_all_flags_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n }, \"GET\");\n }\n}\n\nexport default FeatureFlag;\n","/**\n * @fileoverview Product Analytics - Page View Tracking\n * @module features/analytics/page-views\n * \n * @description\n * Track page views with rich context including scroll depth, time on page,\n * referrer information, and user engagement signals.\n * \n * @useCases\n * - Track which pages users visit most frequently\n * - Measure time spent on content pages\n * - Identify high bounce rate pages\n * - Analyze user navigation patterns\n * - Monitor landing page performance\n * \n * @metrics\n * - Total page views\n * - Unique page views \n * - Average time on page\n * - Bounce rate by page\n * - Scroll depth distribution\n * - Entry/exit page analysis\n * \n * @chartData\n * - Line chart: Page views over time\n * - Bar chart: Top pages by views\n * - Heatmap: Scroll depth by page\n * - Funnel: Page flow analysis\n * \n * @example\n * ```typescript\n * const pageViews = new PageViews(webId, endpoint, apiKey);\n * \n * // Track a page view\n * await pageViews.track({\n * url: window.location.href,\n * path: window.location.pathname,\n * title: document.title,\n * referrer: document.referrer\n * });\n * \n * // Track with scroll depth\n * await pageViews.trackScrollDepth({\n * path: '/blog/article-1',\n * scrollDepth: 75\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n PageView, \n TrafficMetrics, \n TimeSeriesData, \n ChartDataPoint,\n DateRangeFilter,\n PaginationParams \n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a page view.\n */\nexport interface PageViewConfig {\n /** Full page URL */\n url: string;\n /** Page path (without domain) */\n path: string;\n /** Page title */\n title?: string;\n /** Referrer URL */\n referrer?: string;\n /** User ID (if authenticated) */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking scroll depth.\n */\nexport interface ScrollDepthConfig {\n /** Page path */\n path: string;\n /** Scroll depth percentage (0-100) */\n scrollDepth: number;\n /** Time at this depth (seconds) */\n timeAtDepth?: number;\n}\n\n/**\n * Configuration for tracking time on page.\n */\nexport interface TimeOnPageConfig {\n /** Page path */\n path: string;\n /** Time spent in seconds */\n duration: number;\n /** Whether user engaged (scrolled, clicked, etc.) */\n engaged?: boolean;\n}\n\n/**\n * Page view response from API.\n */\nexport interface PageViewResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n pageViewId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Page analytics data for charts.\n */\nexport interface PageAnalyticsData {\n /** Top pages */\n topPages: Array<{\n path: string;\n title: string;\n views: number;\n uniqueViews: number;\n avgTimeOnPage: number;\n bounceRate: number;\n }>;\n /** Page views time series */\n timeSeries: TimeSeriesData;\n /** Summary metrics */\n summary: {\n totalPageViews: number;\n uniquePageViews: number;\n avgTimeOnPage: number;\n avgScrollDepth: number;\n bounceRate: number;\n };\n}\n\n// ============================================================================\n// PAGE VIEWS CLASS\n// ============================================================================\n\n/**\n * PageViews - Track and analyze page view events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides comprehensive page view tracking with support for:\n * - Basic page view events\n * - Scroll depth tracking\n * - Time on page measurement\n * - Exit intent detection\n * - Page engagement scoring\n * \n * @example\n * ```typescript\n * const pageViews = new PageViews(webId, endpoint, apiKey);\n * \n * // Basic page view\n * await pageViews.track({\n * url: 'https://example.com/products',\n * path: '/products',\n * title: 'Our Products'\n * });\n * \n * // Pull analytics data for charts\n * const analytics = await pageViews.getAnalytics({\n * range: 'last30days'\n * });\n * \n * // Data ready for charting\n * const chartData = analytics.timeSeries.data.map(d => ({\n * x: d.label,\n * y: d.value\n * }));\n * ```\n */\nexport class PageViews extends FTRPC {\n /**\n * Tracks a page view event.\n * \n * @param config - Page view configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * await pageViews.track({\n * url: window.location.href,\n * path: window.location.pathname,\n * title: document.title\n * });\n * ```\n */\n async track(config: PageViewConfig): Promise<PageViewResponse> {\n return await this.init(\"page_view\", {\n type: \"page_view\",\n url: config.url,\n path: config.path,\n title: config.title || \"\",\n referrer: config.referrer || \"\",\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks scroll depth on a page.\n * \n * @param config - Scroll depth configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * // Track when user scrolls to 50%\n * await pageViews.trackScrollDepth({\n * path: '/article/how-to-guide',\n * scrollDepth: 50\n * });\n * ```\n */\n async trackScrollDepth(config: ScrollDepthConfig): Promise<PageViewResponse> {\n return await this.init(\"scroll_depth\", {\n type: \"scroll_depth\",\n path: config.path,\n scrollDepth: Math.min(100, Math.max(0, config.scrollDepth)),\n timeAtDepth: config.timeAtDepth,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks time spent on a page.\n * \n * @param config - Time on page configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * // Track on page unload\n * window.addEventListener('beforeunload', () => {\n * pageViews.trackTimeOnPage({\n * path: '/pricing',\n * duration: 45,\n * engaged: true\n * });\n * });\n * ```\n */\n async trackTimeOnPage(config: TimeOnPageConfig): Promise<PageViewResponse> {\n return await this.init(\"time_on_page\", {\n type: \"time_on_page\",\n path: config.path,\n duration: config.duration,\n engaged: config.engaged ?? false,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a page exit event.\n * \n * @param path - Page path being exited\n * @param duration - Time spent on page\n * @param scrollDepth - Final scroll depth\n * @returns Promise resolving to the API response\n */\n async trackExit(\n path: string, \n duration: number, \n scrollDepth: number\n ): Promise<PageViewResponse> {\n return await this.init(\"page_exit\", {\n type: \"page_exit\",\n path,\n duration,\n scrollDepth,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves page analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to analytics data\n * \n * @example\n * ```typescript\n * const analytics = await pageViews.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // Use for line chart\n * const lineData = analytics.timeSeries.data;\n * \n * // Use for bar chart\n * const barData = analytics.topPages.map(p => ({\n * label: p.path,\n * value: p.views\n * }));\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<PageAnalyticsData> {\n return await this.init(\"get_page_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default PageViews;\n","/**\n * @fileoverview Product Analytics - Session Tracking\n * @module features/analytics/sessions\n * \n * @description\n * Track user sessions with comprehensive context including device info,\n * geographic location, traffic source, and engagement metrics.\n * \n * @useCases\n * - Monitor active user sessions in real-time\n * - Analyze session duration and depth\n * - Track user journey across pages\n * - Identify traffic sources and campaigns\n * - Segment users by device and location\n * \n * @metrics\n * - Total sessions\n * - Unique visitors\n * - Average session duration\n * - Pages per session\n * - Bounce rate\n * - New vs returning visitors\n * \n * @chartData\n * - Line chart: Sessions over time\n * - Pie chart: Traffic source breakdown\n * - Bar chart: Sessions by device type\n * - Geo map: Sessions by country\n * \n * @example\n * ```typescript\n * const sessions = new Sessions(webId, endpoint, apiKey);\n * \n * // Start a new session\n * const session = await sessions.start({\n * userId: 'user_123',\n * device: { type: 'desktop', browser: 'Chrome' },\n * source: 'google',\n * medium: 'organic'\n * });\n * \n * // End session\n * await sessions.end(session.sessionId);\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Session,\n DeviceInfo, \n GeoLocation, \n UTMParams,\n TrafficMetrics,\n TimeSeriesData,\n DateRangeFilter,\n PaginationParams,\n UserIdentity\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for starting a new session.\n */\nexport interface SessionStartConfig {\n /** User identity */\n user?: UserIdentity;\n /** Device information */\n device?: DeviceInfo;\n /** Geographic location */\n location?: GeoLocation;\n /** Traffic source */\n source?: string;\n /** Traffic medium */\n medium?: string;\n /** Campaign name */\n campaign?: string;\n /** UTM parameters */\n utm?: UTMParams;\n /** Landing page URL */\n landingPage?: string;\n /** Referrer URL */\n referrer?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Session response from API.\n */\nexport interface SessionResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n sessionId: string;\n started: boolean;\n isNewVisitor: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Session end response.\n */\nexport interface SessionEndResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n sessionId: string;\n duration: number;\n pageViews: number;\n eventCount: number;\n };\n timestamp: string;\n}\n\n/**\n * Session analytics data for charts.\n */\nexport interface SessionAnalyticsData {\n /** Summary metrics */\n summary: {\n totalSessions: number;\n uniqueVisitors: number;\n newVisitors: number;\n returningVisitors: number;\n avgSessionDuration: number;\n avgPagesPerSession: number;\n bounceRate: number;\n };\n /** Sessions time series */\n timeSeries: TimeSeriesData;\n /** Sessions by source */\n bySource: Array<{\n source: string;\n sessions: number;\n percentage: number;\n }>;\n /** Sessions by device */\n byDevice: Array<{\n device: string;\n sessions: number;\n percentage: number;\n }>;\n /** Sessions by country */\n byCountry: Array<{\n country: string;\n countryCode: string;\n sessions: number;\n }>;\n}\n\n/**\n * Real-time session data.\n */\nexport interface RealTimeSessionData {\n /** Currently active sessions */\n activeSessions: number;\n /** Active users in last 5 minutes */\n activeUsers5min: number;\n /** Active users in last 30 minutes */\n activeUsers30min: number;\n /** Sessions by page (real-time) */\n sessionsByPage: Array<{ path: string; count: number }>;\n /** Sessions by country (real-time) */\n sessionsByCountry: Array<{ country: string; count: number }>;\n}\n\n// ============================================================================\n// SESSIONS CLASS\n// ============================================================================\n\n/**\n * Sessions - Track and analyze user sessions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides comprehensive session tracking including:\n * - Session lifecycle (start, update, end)\n * - Device and location tracking\n * - Traffic source attribution\n * - Real-time session monitoring\n * - Session replay triggers\n * \n * @example\n * ```typescript\n * const sessions = new Sessions(webId, endpoint, apiKey);\n * \n * // Start session on page load\n * const session = await sessions.start({\n * user: { userId: 'user_123' },\n * device: { type: 'mobile', os: 'iOS' },\n * source: 'email',\n * campaign: 'summer_sale'\n * });\n * \n * // Get real-time data\n * const realTime = await sessions.getRealTime();\n * console.log(`${realTime.activeSessions} users online`);\n * ```\n */\nexport class Sessions extends FTRPC {\n /**\n * Starts a new user session.\n * \n * @param config - Session configuration\n * @returns Promise resolving to session response with sessionId\n * \n * @example\n * ```typescript\n * const session = await sessions.start({\n * user: { userId: 'user_123' },\n * source: 'google',\n * medium: 'cpc',\n * campaign: 'brand_terms'\n * });\n * localStorage.setItem('sessionId', session.response.sessionId);\n * ```\n */\n async start(config: SessionStartConfig = {}): Promise<SessionResponse> {\n return await this.init(\"session_start\", {\n type: \"session_start\",\n user: config.user,\n device: config.device,\n location: config.location,\n source: config.source || config.utm?.utmSource,\n medium: config.medium || config.utm?.utmMedium,\n campaign: config.campaign || config.utm?.utmCampaign,\n utm: config.utm,\n landingPage: config.landingPage || (typeof window !== 'undefined' ? window.location.href : ''),\n referrer: config.referrer || (typeof document !== 'undefined' ? document.referrer : ''),\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates an existing session with new data.\n * \n * @param sessionId - Session identifier\n * @param properties - Properties to update\n * @returns Promise resolving to update response\n */\n async update(\n sessionId: string, \n properties: Record<string, unknown>\n ): Promise<SessionResponse> {\n return await this.init(\"session_update\", {\n type: \"session_update\",\n sessionId,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Ends a user session.\n * \n * @param sessionId - Session identifier to end\n * @returns Promise resolving to session end response with metrics\n * \n * @example\n * ```typescript\n * window.addEventListener('beforeunload', async () => {\n * const sessionId = localStorage.getItem('sessionId');\n * if (sessionId) {\n * await sessions.end(sessionId);\n * }\n * });\n * ```\n */\n async end(sessionId: string): Promise<SessionEndResponse> {\n return await this.init(\"session_end\", {\n type: \"session_end\",\n sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a heartbeat to keep session alive.\n * \n * @param sessionId - Session identifier\n * @returns Promise resolving to heartbeat response\n */\n async heartbeat(sessionId: string): Promise<SessionResponse> {\n return await this.init(\"session_heartbeat\", {\n type: \"session_heartbeat\",\n sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves session analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to session analytics\n * \n * @example\n * ```typescript\n * const analytics = await sessions.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // For pie chart - traffic sources\n * const sourceData = analytics.bySource.map(s => ({\n * name: s.source,\n * value: s.sessions\n * }));\n * \n * // For line chart - sessions over time\n * const trendData = analytics.timeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<SessionAnalyticsData> {\n return await this.init(\"get_session_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets real-time session data for live dashboards.\n * \n * @returns Promise resolving to real-time session data\n * \n * @example\n * ```typescript\n * // Poll for real-time updates\n * setInterval(async () => {\n * const realTime = await sessions.getRealTime();\n * updateDashboard(realTime.activeSessions);\n * }, 10000);\n * ```\n */\n async getRealTime(): Promise<RealTimeSessionData> {\n return await this.init(\"get_realtime_sessions\", {\n type: \"query\",\n realtime: true,\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Sessions;\n","/**\n * @fileoverview Product Analytics - Custom Event Tracking\n * @module features/analytics/events\n * \n * @description\n * Track custom events with flexible properties for any user action\n * or system event. Supports categorization, value tracking, and batching.\n * \n * @useCases\n * - Track button clicks and CTA interactions\n * - Monitor feature usage and engagement\n * - Capture form submissions and errors\n * - Log search queries and results\n * - Record video/audio playback events\n * \n * @metrics\n * - Event counts by type\n * - Event trends over time\n * - Unique users per event\n * - Event value aggregations\n * - Event-to-conversion correlation\n * \n * @chartData\n * - Bar chart: Top events by count\n * - Line chart: Event trends over time\n * - Heatmap: Events by hour/day\n * - Sankey: Event flow paths\n * \n * @example\n * ```typescript\n * const events = new Events(webId, endpoint, apiKey);\n * \n * // Track a button click\n * await events.track({\n * eventName: 'cta_clicked',\n * category: 'engagement',\n * action: 'click',\n * label: 'signup_hero'\n * });\n * \n * // Track with value\n * await events.track({\n * eventName: 'video_watched',\n * value: 120, // seconds\n * properties: { videoId: 'intro-video' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n CustomEvent,\n ClickEvent,\n FormEvent,\n SearchEvent,\n ErrorEvent,\n TimeSeriesData,\n DateRangeFilter,\n PaginationParams,\n ChartDataPoint\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a custom event.\n */\nexport interface EventTrackConfig {\n /** Event name (required) */\n eventName: string;\n /** Event category for grouping */\n category?: string;\n /** Event action */\n action?: string;\n /** Event label for sub-categorization */\n label?: string;\n /** Numeric value associated with event */\n value?: number;\n /** Non-interactive event (won't affect bounce rate) */\n nonInteraction?: boolean;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Batch event tracking configuration.\n */\nexport interface BatchEventConfig {\n /** Array of events to track */\n events: EventTrackConfig[];\n}\n\n/**\n * Event response from API.\n */\nexport interface EventResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n eventId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Batch event response.\n */\nexport interface BatchEventResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: number;\n failed: number;\n eventIds: string[];\n };\n timestamp: string;\n}\n\n/**\n * Event analytics data for charts.\n */\nexport interface EventAnalyticsData {\n /** Top events by count */\n topEvents: Array<{\n eventName: string;\n category: string;\n count: number;\n uniqueUsers: number;\n totalValue: number;\n }>;\n /** Events time series */\n timeSeries: TimeSeriesData;\n /** Events by category */\n byCategory: Array<{\n category: string;\n count: number;\n percentage: number;\n }>;\n /** Summary metrics */\n summary: {\n totalEvents: number;\n uniqueEventTypes: number;\n eventsPerUser: number;\n totalValue: number;\n };\n}\n\n// ============================================================================\n// EVENTS CLASS\n// ============================================================================\n\n/**\n * Events - Track and analyze custom events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides flexible custom event tracking including:\n * - Standard event tracking with categories\n * - Click and interaction tracking\n * - Form submission tracking\n * - Search event tracking\n * - Error and exception logging\n * - Batch event submission\n * \n * @example\n * ```typescript\n * const events = new Events(webId, endpoint, apiKey);\n * \n * // Track feature usage\n * await events.track({\n * eventName: 'feature_used',\n * category: 'features',\n * action: 'use',\n * label: 'export_pdf',\n * properties: { format: 'A4', pages: 5 }\n * });\n * \n * // Get event analytics\n * const analytics = await events.getAnalytics({ range: 'last7days' });\n * ```\n */\nexport class Events extends FTRPC {\n /**\n * Tracks a custom event.\n * \n * @param config - Event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * await events.track({\n * eventName: 'upgrade_clicked',\n * category: 'monetization',\n * action: 'click',\n * label: 'pricing_page',\n * value: 99.99\n * });\n * ```\n */\n async track(config: EventTrackConfig): Promise<EventResponse> {\n return await this.init(\"custom_event\", {\n type: \"custom_event\",\n eventName: config.eventName,\n category: config.category || \"general\",\n action: config.action,\n label: config.label,\n value: config.value,\n nonInteraction: config.nonInteraction || false,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks multiple events in a single request.\n * \n * @param config - Batch configuration with events array\n * @returns Promise resolving to batch response\n * \n * @example\n * ```typescript\n * await events.trackBatch({\n * events: [\n * { eventName: 'step_1_complete', category: 'onboarding' },\n * { eventName: 'step_2_complete', category: 'onboarding' },\n * { eventName: 'step_3_complete', category: 'onboarding' }\n * ]\n * });\n * ```\n */\n async trackBatch(config: BatchEventConfig): Promise<BatchEventResponse> {\n const events = config.events.map(e => ({\n ...e,\n timestamp: new Date().toISOString()\n }));\n\n return await this.init(\"batch_events\", {\n type: \"batch_events\",\n events,\n count: events.length,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a click/interaction event.\n * \n * @param config - Click event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * document.addEventListener('click', (e) => {\n * if (e.target.dataset.track) {\n * events.trackClick({\n * elementId: e.target.id,\n * elementText: e.target.textContent,\n * targetUrl: e.target.href\n * });\n * }\n * });\n * ```\n */\n async trackClick(config: ClickEvent): Promise<EventResponse> {\n return await this.init(\"click_event\", {\n type: \"click_event\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a form submission event.\n * \n * @param config - Form event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * form.addEventListener('submit', async (e) => {\n * await events.trackForm({\n * formId: 'contact-form',\n * formName: 'Contact Us',\n * success: true,\n * fields: ['name', 'email', 'message'],\n * completionTime: 45\n * });\n * });\n * ```\n */\n async trackForm(config: FormEvent): Promise<EventResponse> {\n return await this.init(\"form_event\", {\n type: \"form_event\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a search event.\n * \n * @param config - Search event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * await events.trackSearch({\n * query: 'wireless headphones',\n * category: 'products',\n * resultsCount: 42,\n * filters: { brand: 'Sony', priceRange: '100-200' }\n * });\n * ```\n */\n async trackSearch(config: SearchEvent): Promise<EventResponse> {\n return await this.init(\"search_event\", {\n type: \"search_event\",\n query: config.query,\n category: config.category,\n resultsCount: config.resultsCount,\n resultClicked: config.resultClicked,\n clickedPosition: config.clickedPosition,\n filters: config.filters,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks an error or exception.\n * \n * @param config - Error event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * window.onerror = (message, source, line, col, error) => {\n * events.trackError({\n * message: message.toString(),\n * stack: error?.stack,\n * type: error?.name,\n * fatal: false,\n * context: source\n * });\n * };\n * ```\n */\n async trackError(config: ErrorEvent): Promise<EventResponse> {\n return await this.init(\"error_event\", {\n type: \"error_event\",\n message: config.message,\n stack: config.stack,\n errorType: config.type,\n fatal: config.fatal || false,\n context: config.context,\n userAction: config.userAction,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves event analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to event analytics\n * \n * @example\n * ```typescript\n * const analytics = await events.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // Bar chart data - top events\n * const barData = analytics.topEvents.map(e => ({\n * x: e.eventName,\n * y: e.count\n * }));\n * \n * // Line chart - events over time\n * const lineData = analytics.timeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<EventAnalyticsData> {\n return await this.init(\"get_event_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 50 },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Events;\n","/**\n * @fileoverview Product Analytics - User Identification & Traits\n * @module features/analytics/identify\n * \n * @description\n * Identify users and track their traits for personalization,\n * segmentation, and cohort analysis.\n * \n * @useCases\n * - Link anonymous sessions to authenticated users\n * - Store user profile data for segmentation\n * - Track user lifecycle changes (signup, upgrade, churn)\n * - Enable personalized experiences\n * - Build user cohorts for analysis\n * \n * @metrics\n * - Total identified users\n * - Anonymous to identified conversion rate\n * - Users by plan/segment\n * - User lifetime value distribution\n * - Trait distribution\n * \n * @chartData\n * - Pie chart: Users by plan\n * - Bar chart: Users by trait value\n * - Line chart: New identifications over time\n * - Table: User segments\n * \n * @example\n * ```typescript\n * const identify = new Identify(webId, endpoint, apiKey);\n * \n * // Identify user on login\n * await identify.user({\n * userId: 'user_123',\n * traits: {\n * email: 'user@example.com',\n * name: 'John Doe',\n * plan: 'premium',\n * createdAt: '2025-01-15'\n * }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n UserIdentity,\n UserTraits,\n MoneyValue,\n DateRangeFilter,\n PaginationParams,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for identifying a user.\n */\nexport interface IdentifyConfig {\n /** Unique user identifier */\n userId: string;\n /** Anonymous ID to link (optional) */\n anonymousId?: string;\n /** User traits/properties */\n traits?: UserTraits;\n}\n\n/**\n * Configuration for aliasing user IDs.\n */\nexport interface AliasConfig {\n /** Previous user ID */\n previousId: string;\n /** New user ID */\n userId: string;\n}\n\n/**\n * Configuration for grouping users.\n */\nexport interface GroupConfig {\n /** User ID */\n userId: string;\n /** Group/company ID */\n groupId: string;\n /** Group traits */\n traits?: {\n name?: string;\n industry?: string;\n employees?: number;\n plan?: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Identify response from API.\n */\nexport interface IdentifyResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n userId: string;\n identified: boolean;\n isNewUser: boolean;\n linkedAnonymousId?: string;\n };\n timestamp: string;\n}\n\n/**\n * User analytics data for charts.\n */\nexport interface UserAnalyticsData {\n /** Summary metrics */\n summary: {\n totalUsers: number;\n identifiedUsers: number;\n anonymousUsers: number;\n newUsersThisPeriod: number;\n identificationRate: number;\n };\n /** Users by plan/segment */\n byPlan: Array<{\n plan: string;\n count: number;\n percentage: number;\n mrr?: MoneyValue;\n }>;\n /** New users time series */\n newUsersTimeSeries: TimeSeriesData;\n /** User lifecycle distribution */\n byLifecycleStage: Array<{\n stage: string;\n count: number;\n percentage: number;\n }>;\n}\n\n// ============================================================================\n// IDENTIFY CLASS\n// ============================================================================\n\n/**\n * Identify - User identification and trait management.\n * \n * @extends FTRPC\n * \n * @description\n * Provides user identification capabilities including:\n * - User identification on login/signup\n * - Anonymous to identified user linking\n * - User trait/property storage\n * - User aliasing for ID changes\n * - Group/company association\n * \n * @example\n * ```typescript\n * const identify = new Identify(webId, endpoint, apiKey);\n * \n * // On user signup\n * await identify.user({\n * userId: 'user_123',\n * anonymousId: getAnonymousId(),\n * traits: {\n * email: 'user@example.com',\n * name: 'Jane Smith',\n * plan: 'starter',\n * createdAt: new Date().toISOString()\n * }\n * });\n * \n * // Associate user with company\n * await identify.group({\n * userId: 'user_123',\n * groupId: 'company_456',\n * traits: { name: 'Acme Inc', employees: 50 }\n * });\n * ```\n */\nexport class Identify extends FTRPC {\n /**\n * Identifies a user with traits.\n * \n * @param config - Identification configuration\n * @returns Promise resolving to identify response\n * \n * @example\n * ```typescript\n * // Basic identification\n * await identify.user({\n * userId: 'user_123',\n * traits: { email: 'user@example.com' }\n * });\n * \n * // With anonymous ID linking\n * await identify.user({\n * userId: 'user_123',\n * anonymousId: localStorage.getItem('anonId'),\n * traits: {\n * name: 'John Doe',\n * plan: 'premium',\n * ltv: { amount: 29900, currency: 'USD' }\n * }\n * });\n * ```\n */\n async user(config: IdentifyConfig): Promise<IdentifyResponse> {\n return await this.init(\"identify_user\", {\n type: \"identify\",\n userId: config.userId,\n anonymousId: config.anonymousId,\n traits: config.traits || {},\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates traits for an existing user.\n * \n * @param userId - User identifier\n * @param traits - Traits to update/add\n * @returns Promise resolving to identify response\n * \n * @example\n * ```typescript\n * // Update user plan after upgrade\n * await identify.updateTraits('user_123', {\n * plan: 'enterprise',\n * ltv: { amount: 99900, currency: 'USD' }\n * });\n * ```\n */\n async updateTraits(userId: string, traits: UserTraits): Promise<IdentifyResponse> {\n return await this.init(\"update_traits\", {\n type: \"update_traits\",\n userId,\n traits,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Creates an alias between two user IDs.\n * \n * @param config - Alias configuration\n * @returns Promise resolving to alias response\n * \n * @example\n * ```typescript\n * // When user ID changes (e.g., after migration)\n * await identify.alias({\n * previousId: 'old_user_id',\n * userId: 'new_user_id'\n * });\n * ```\n */\n async alias(config: AliasConfig): Promise<IdentifyResponse> {\n return await this.init(\"alias_user\", {\n type: \"alias\",\n previousId: config.previousId,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Associates a user with a group/company.\n * \n * @param config - Group configuration\n * @returns Promise resolving to group response\n * \n * @example\n * ```typescript\n * await identify.group({\n * userId: 'user_123',\n * groupId: 'company_456',\n * traits: {\n * name: 'Acme Corporation',\n * industry: 'Technology',\n * employees: 500,\n * plan: 'enterprise'\n * }\n * });\n * ```\n */\n async group(config: GroupConfig): Promise<IdentifyResponse> {\n return await this.init(\"group_user\", {\n type: \"group\",\n userId: config.userId,\n groupId: config.groupId,\n traits: config.traits || {},\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Resets user identity (logout).\n * \n * @param userId - User ID to reset\n * @returns Promise resolving to reset response\n */\n async reset(userId: string): Promise<IdentifyResponse> {\n return await this.init(\"reset_identity\", {\n type: \"reset\",\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves user analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to user analytics\n * \n * @example\n * ```typescript\n * const analytics = await identify.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Pie chart - users by plan\n * const planData = analytics.byPlan.map(p => ({\n * name: p.plan,\n * value: p.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<UserAnalyticsData> {\n return await this.init(\"get_user_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Identify;\n","/**\n * @fileoverview Ecommerce - Product Tracking\n * @module features/ecommerce/products\n * \n * @description\n * Track product interactions including views, impressions, clicks,\n * and product list interactions.\n * \n * @useCases\n * - Track product page views\n * - Measure product list/search impressions\n * - Analyze product click-through rates\n * - Monitor product detail engagement\n * - Compare product performance\n * \n * @metrics\n * - Product views\n * - Product impressions\n * - Click-through rate\n * - View-to-cart rate\n * - Revenue per product\n * \n * @chartData\n * - Bar chart: Top products by views\n * - Line chart: Product views over time\n * - Table: Product performance comparison\n * - Scatter: Price vs conversion rate\n * \n * @example\n * ```typescript\n * const products = new Products(webId, endpoint, apiKey);\n * \n * // Track product view\n * await products.view({\n * productId: 'SKU-123',\n * name: 'Premium Headphones',\n * price: 299.99,\n * currency: 'USD',\n * category: 'Electronics/Audio'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Product,\n ProductList,\n ProductPerformance,\n DateRangeFilter,\n PaginationParams,\n TimeSeriesData,\n CurrencyCode\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a product view.\n */\nexport interface ProductViewConfig extends Product {\n /** User ID (if authenticated) */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** How user arrived at product (search, category, recommendation) */\n source?: 'search' | 'category' | 'recommendation' | 'direct' | 'ad';\n /** Search query if from search */\n searchQuery?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking product impressions.\n */\nexport interface ProductImpressionConfig {\n /** List information */\n list: ProductList;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n}\n\n/**\n * Configuration for tracking product clicks.\n */\nexport interface ProductClickConfig {\n /** Product clicked */\n product: Product;\n /** List where product was clicked */\n listId?: string;\n /** Position in list */\n position?: number;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Product event response from API.\n */\nexport interface ProductResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n productId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Product analytics data for charts.\n */\nexport interface ProductAnalyticsData {\n /** Top products by various metrics */\n topProducts: {\n byViews: ProductPerformance[];\n byRevenue: ProductPerformance[];\n byConversion: ProductPerformance[];\n };\n /** Product views time series */\n viewsTimeSeries: TimeSeriesData;\n /** Summary metrics */\n summary: {\n totalProductViews: number;\n uniqueProductsViewed: number;\n avgViewsPerProduct: number;\n topCategory: string;\n topBrand: string;\n };\n /** Performance by category */\n byCategory: Array<{\n category: string;\n views: number;\n revenue: number;\n conversionRate: number;\n }>;\n}\n\n// ============================================================================\n// PRODUCTS CLASS\n// ============================================================================\n\n/**\n * Products - Track product interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides product tracking capabilities including:\n * - Product page views\n * - Product list impressions\n * - Product clicks from lists\n * - Product detail interactions\n * - Quick view tracking\n * \n * @example\n * ```typescript\n * const products = new Products(webId, endpoint, apiKey);\n * \n * // Track product page view\n * await products.view({\n * productId: 'PROD-001',\n * name: 'Wireless Earbuds',\n * price: 79.99,\n * currency: 'USD',\n * category: 'Electronics/Audio',\n * brand: 'AudioTech'\n * });\n * \n * // Track list impressions\n * await products.impression({\n * list: {\n * listId: 'search-results',\n * listName: 'Search Results',\n * products: searchResults\n * }\n * });\n * ```\n */\nexport class Products extends FTRPC {\n /**\n * Tracks a product page view.\n * \n * @param config - Product view configuration\n * @returns Promise resolving to product response\n * \n * @example\n * ```typescript\n * await products.view({\n * productId: 'SKU-12345',\n * name: 'Premium Widget',\n * price: 49.99,\n * currency: 'USD',\n * category: 'Widgets/Premium',\n * brand: 'WidgetCo',\n * source: 'search',\n * searchQuery: 'premium widget'\n * });\n * ```\n */\n async view(config: ProductViewConfig): Promise<ProductResponse> {\n return await this.init(\"product_view\", {\n type: \"product_view\",\n product: {\n productId: config.productId,\n name: config.name,\n brand: config.brand,\n category: config.category,\n variant: config.variant,\n price: config.price,\n currency: config.currency,\n url: config.url,\n imageUrl: config.imageUrl,\n rating: config.rating,\n reviewCount: config.reviewCount,\n stockStatus: config.stockStatus,\n attributes: config.attributes\n },\n source: config.source,\n searchQuery: config.searchQuery,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks product list impressions.\n * \n * @param config - Impression configuration\n * @returns Promise resolving to impression response\n * \n * @example\n * ```typescript\n * // Track products shown in search results\n * await products.impression({\n * list: {\n * listId: 'search-results',\n * listName: 'Search Results',\n * products: products.map((p, i) => ({ ...p, position: i + 1 }))\n * }\n * });\n * ```\n */\n async impression(config: ProductImpressionConfig): Promise<ProductResponse> {\n return await this.init(\"product_impression\", {\n type: \"product_impression\",\n list: config.list,\n productCount: config.list.products.length,\n userId: config.userId,\n sessionId: config.sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a product click from a list.\n * \n * @param config - Click configuration\n * @returns Promise resolving to click response\n * \n * @example\n * ```typescript\n * await products.click({\n * product: selectedProduct,\n * listId: 'homepage-featured',\n * position: 3\n * });\n * ```\n */\n async click(config: ProductClickConfig): Promise<ProductResponse> {\n return await this.init(\"product_click\", {\n type: \"product_click\",\n product: config.product,\n listId: config.listId,\n position: config.position,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a quick view interaction (modal product view).\n * \n * @param product - Product being quick-viewed\n * @param listId - List where quick view was triggered\n * @returns Promise resolving to quick view response\n */\n async quickView(product: Product, listId?: string): Promise<ProductResponse> {\n return await this.init(\"product_quick_view\", {\n type: \"product_quick_view\",\n product,\n listId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks product detail interaction (zoom, read reviews, etc.).\n * \n * @param productId - Product identifier\n * @param action - Interaction type\n * @param properties - Additional properties\n * @returns Promise resolving to interaction response\n */\n async interaction(\n productId: string,\n action: 'zoom' | 'read_reviews' | 'size_guide' | 'compare' | 'share' | 'notify_stock',\n properties?: Record<string, unknown>\n ): Promise<ProductResponse> {\n return await this.init(\"product_interaction\", {\n type: \"product_interaction\",\n productId,\n action,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves product analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to product analytics\n * \n * @example\n * ```typescript\n * const analytics = await products.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Bar chart - top products by views\n * const topByViews = analytics.topProducts.byViews.map(p => ({\n * name: p.product.name,\n * value: p.views\n * }));\n * \n * // Line chart - views over time\n * const viewsTrend = analytics.viewsTimeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<ProductAnalyticsData> {\n return await this.init(\"get_product_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets performance data for a specific product.\n * \n * @param productId - Product identifier\n * @param filter - Date range filter\n * @returns Promise resolving to product performance\n */\n async getProductPerformance(\n productId: string,\n filter?: DateRangeFilter\n ): Promise<ProductPerformance> {\n return await this.init(\"get_product_performance\", {\n type: \"query\",\n productId,\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Products;\n","/**\n * @fileoverview Ecommerce - Cart Tracking\n * @module features/ecommerce/cart\n * \n * @description\n * Track shopping cart interactions including add/remove items,\n * cart views, and cart abandonment.\n * \n * @useCases\n * - Track add to cart events\n * - Monitor cart modifications\n * - Detect cart abandonment\n * - Analyze popular cart items\n * - Measure cart value trends\n * \n * @metrics\n * - Add to cart rate\n * - Average cart value\n * - Cart abandonment rate\n * - Items per cart\n * - Cart-to-checkout rate\n * \n * @chartData\n * - Line chart: Cart value over time\n * - Bar chart: Top added products\n * - Pie chart: Abandonment reasons\n * - Funnel: Cart to checkout flow\n * \n * @example\n * ```typescript\n * const cart = new CartTracking(webId, endpoint, apiKey);\n * \n * // Track add to cart\n * await cart.addItem({\n * product: { productId: 'SKU-123', name: 'Widget', price: 29.99, currency: 'USD' },\n * quantity: 2,\n * cartId: 'cart_abc'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Product,\n Cart,\n CartItem,\n CartAnalytics,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for adding item to cart.\n */\nexport interface AddToCartConfig {\n /** Product being added */\n product: Product;\n /** Quantity to add */\n quantity: number;\n /** Cart identifier */\n cartId?: string;\n /** User ID */\n userId?: string;\n /** Source of add (product page, quick add, etc.) */\n source?: 'product_page' | 'quick_add' | 'wishlist' | 'recommendation' | 'reorder';\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for removing item from cart.\n */\nexport interface RemoveFromCartConfig {\n /** Product being removed */\n product: Product;\n /** Quantity to remove */\n quantity: number;\n /** Cart identifier */\n cartId?: string;\n /** User ID */\n userId?: string;\n /** Reason for removal */\n reason?: 'user_action' | 'out_of_stock' | 'price_change' | 'auto_expired';\n}\n\n/**\n * Configuration for updating cart item.\n */\nexport interface UpdateCartItemConfig {\n /** Product being updated */\n product: Product;\n /** Previous quantity */\n previousQuantity: number;\n /** New quantity */\n newQuantity: number;\n /** Cart identifier */\n cartId?: string;\n}\n\n/**\n * Configuration for cart view.\n */\nexport interface ViewCartConfig {\n /** Current cart state */\n cart: Cart;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Cart event response from API.\n */\nexport interface CartResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n cartId: string;\n tracked: boolean;\n cartValue: number;\n itemCount: number;\n };\n timestamp: string;\n}\n\n/**\n * Cart analytics data for charts.\n */\nexport interface CartAnalyticsData {\n /** Cart metrics summary */\n summary: {\n totalAddToCarts: number;\n totalRemoveFromCarts: number;\n averageCartValue: number;\n averageItemsPerCart: number;\n abandonmentRate: number;\n cartToCheckoutRate: number;\n };\n /** Add to cart trends */\n addToCartTimeSeries: TimeSeriesData;\n /** Top products added to cart */\n topAddedProducts: Array<{\n product: Pick<Product, 'productId' | 'name' | 'category'>;\n addCount: number;\n removeCount: number;\n netAdds: number;\n }>;\n /** Abandonment analysis */\n abandonment: {\n rate: number;\n avgAbandonedValue: number;\n topAbandonedProducts: Array<{\n product: Pick<Product, 'productId' | 'name'>;\n abandonCount: number;\n }>;\n };\n}\n\n// ============================================================================\n// CART TRACKING CLASS\n// ============================================================================\n\n/**\n * CartTracking - Track shopping cart interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides cart tracking capabilities including:\n * - Add to cart events\n * - Remove from cart events\n * - Cart quantity updates\n * - Cart view tracking\n * - Cart abandonment detection\n * \n * @example\n * ```typescript\n * const cart = new CartTracking(webId, endpoint, apiKey);\n * \n * // Track add to cart\n * await cart.addItem({\n * product: {\n * productId: 'PROD-001',\n * name: 'Widget Pro',\n * price: 99.99,\n * currency: 'USD'\n * },\n * quantity: 1,\n * source: 'product_page'\n * });\n * \n * // Track cart view\n * await cart.view({\n * cart: currentCart\n * });\n * ```\n */\nexport class CartTracking extends FTRPC {\n /**\n * Tracks adding an item to cart.\n * \n * @param config - Add to cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.addItem({\n * product: {\n * productId: 'SKU-123',\n * name: 'Premium Widget',\n * price: 49.99,\n * currency: 'USD',\n * category: 'Widgets'\n * },\n * quantity: 2,\n * source: 'product_page'\n * });\n * ```\n */\n async addItem(config: AddToCartConfig): Promise<CartResponse> {\n const lineTotal = config.product.price * config.quantity - (config.product.discount || 0);\n \n return await this.init(\"add_to_cart\", {\n type: \"add_to_cart\",\n product: config.product,\n quantity: config.quantity,\n lineTotal,\n cartId: config.cartId,\n userId: config.userId,\n source: config.source,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks removing an item from cart.\n * \n * @param config - Remove from cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.removeItem({\n * product: productToRemove,\n * quantity: 1,\n * cartId: 'cart_123',\n * reason: 'user_action'\n * });\n * ```\n */\n async removeItem(config: RemoveFromCartConfig): Promise<CartResponse> {\n return await this.init(\"remove_from_cart\", {\n type: \"remove_from_cart\",\n product: config.product,\n quantity: config.quantity,\n cartId: config.cartId,\n userId: config.userId,\n reason: config.reason || \"user_action\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks cart item quantity update.\n * \n * @param config - Update configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.updateItem({\n * product: item.product,\n * previousQuantity: 1,\n * newQuantity: 3,\n * cartId: 'cart_123'\n * });\n * ```\n */\n async updateItem(config: UpdateCartItemConfig): Promise<CartResponse> {\n return await this.init(\"update_cart_item\", {\n type: \"update_cart_item\",\n product: config.product,\n previousQuantity: config.previousQuantity,\n newQuantity: config.newQuantity,\n quantityChange: config.newQuantity - config.previousQuantity,\n cartId: config.cartId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a cart view event.\n * \n * @param config - View cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.view({\n * cart: {\n * cartId: 'cart_123',\n * items: cartItems,\n * subtotal: 149.97,\n * total: 164.97,\n * currency: 'USD',\n * itemCount: 3\n * }\n * });\n * ```\n */\n async view(config: ViewCartConfig): Promise<CartResponse> {\n return await this.init(\"view_cart\", {\n type: \"view_cart\",\n cart: config.cart,\n cartValue: config.cart.total,\n itemCount: config.cart.itemCount,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks cart abandonment.\n * \n * @param cart - Abandoned cart state\n * @param reason - Abandonment reason (if known)\n * @returns Promise resolving to cart response\n */\n async abandon(\n cart: Cart,\n reason?: 'exit' | 'timeout' | 'price_too_high' | 'shipping_cost' | 'other'\n ): Promise<CartResponse> {\n return await this.init(\"cart_abandoned\", {\n type: \"cart_abandoned\",\n cart,\n cartValue: cart.total,\n itemCount: cart.itemCount,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Applies a coupon to the cart.\n * \n * @param cartId - Cart identifier\n * @param couponCode - Coupon code applied\n * @param success - Whether coupon was valid\n * @param discount - Discount amount (if successful)\n * @returns Promise resolving to cart response\n */\n async applyCoupon(\n cartId: string,\n couponCode: string,\n success: boolean,\n discount?: number\n ): Promise<CartResponse> {\n return await this.init(\"apply_coupon\", {\n type: \"apply_coupon\",\n cartId,\n couponCode,\n success,\n discount,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves cart analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to cart analytics\n * \n * @example\n * ```typescript\n * const analytics = await cart.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Line chart - add to cart over time\n * const trendData = analytics.addToCartTimeSeries.data;\n * \n * // Bar chart - top products added\n * const topProducts = analytics.topAddedProducts.map(p => ({\n * name: p.product.name,\n * value: p.addCount\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<CartAnalyticsData> {\n return await this.init(\"get_cart_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default CartTracking;\n","/**\n * @fileoverview Ecommerce - Checkout Tracking\n * @module features/ecommerce/checkout\n * \n * @description\n * Track checkout flow progress, payment attempts, and checkout\n * optimization opportunities.\n * \n * @useCases\n * - Track checkout step progression\n * - Identify checkout drop-off points\n * - Monitor payment success rates\n * - Analyze shipping method preferences\n * - Optimize checkout UX\n * \n * @metrics\n * - Checkout initiation rate\n * - Step completion rates\n * - Payment success rate\n * - Checkout abandonment rate\n * - Average time to complete\n * \n * @chartData\n * - Funnel chart: Checkout steps\n * - Bar chart: Abandonment by step\n * - Pie chart: Payment methods\n * - Line chart: Checkout completions over time\n * \n * @example\n * ```typescript\n * const checkout = new Checkout(webId, endpoint, apiKey);\n * \n * // Begin checkout\n * await checkout.begin({\n * cart: shoppingCart,\n * userId: 'user_123'\n * });\n * \n * // Track step progress\n * await checkout.step({\n * step: 'add_payment_info',\n * stepNumber: 3,\n * cart: shoppingCart\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Cart,\n CheckoutStep,\n CheckoutProgress,\n ShippingInfo,\n PaymentInfo,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for beginning checkout.\n */\nexport interface BeginCheckoutConfig {\n /** Cart being checked out */\n cart: Cart;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking checkout step.\n */\nexport interface CheckoutStepConfig {\n /** Checkout step */\n step: CheckoutStep;\n /** Step number */\n stepNumber: number;\n /** Cart state at this step */\n cart: Cart;\n /** Option selected at this step (e.g., shipping method) */\n option?: string;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Configuration for adding shipping info.\n */\nexport interface AddShippingConfig {\n /** Cart being checked out */\n cart: Cart;\n /** Shipping information */\n shipping: ShippingInfo;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Configuration for adding payment info.\n */\nexport interface AddPaymentConfig {\n /** Cart being checked out */\n cart: Cart;\n /** Payment information (non-sensitive) */\n payment: PaymentInfo;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Checkout event response from API.\n */\nexport interface CheckoutResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n checkoutId: string;\n step: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Checkout analytics data for charts.\n */\nexport interface CheckoutAnalyticsData {\n /** Checkout funnel data */\n funnel: Array<{\n step: CheckoutStep;\n stepNumber: number;\n started: number;\n completed: number;\n conversionRate: number;\n dropOffRate: number;\n avgTimeToComplete: number;\n }>;\n /** Summary metrics */\n summary: {\n checkoutsStarted: number;\n checkoutsCompleted: number;\n overallConversionRate: number;\n avgCheckoutTime: number;\n avgOrderValue: number;\n abandonmentRate: number;\n };\n /** Checkouts over time */\n timeSeries: TimeSeriesData;\n /** Shipping methods used */\n shippingMethods: Array<{\n method: string;\n count: number;\n percentage: number;\n avgShippingCost: number;\n }>;\n /** Payment methods used */\n paymentMethods: Array<{\n method: string;\n count: number;\n percentage: number;\n successRate: number;\n }>;\n /** Abandonment analysis */\n abandonmentByStep: Array<{\n step: CheckoutStep;\n abandonments: number;\n percentage: number;\n avgCartValue: number;\n }>;\n}\n\n// ============================================================================\n// CHECKOUT CLASS\n// ============================================================================\n\n/**\n * Checkout - Track checkout flow and payments.\n * \n * @extends FTRPC\n * \n * @description\n * Provides checkout tracking capabilities including:\n * - Checkout initiation\n * - Step-by-step progress\n * - Shipping info capture\n * - Payment info capture\n * - Checkout abandonment\n * \n * @example\n * ```typescript\n * const checkout = new Checkout(webId, endpoint, apiKey);\n * \n * // Start checkout\n * await checkout.begin({ cart: shoppingCart });\n * \n * // Track shipping step\n * await checkout.addShipping({\n * cart: shoppingCart,\n * shipping: {\n * method: 'express',\n * carrier: 'FedEx',\n * cost: 9.99\n * }\n * });\n * \n * // Track payment step\n * await checkout.addPayment({\n * cart: shoppingCart,\n * payment: {\n * method: 'credit_card',\n * cardBrand: 'Visa'\n * }\n * });\n * ```\n */\nexport class Checkout extends FTRPC {\n /**\n * Tracks checkout initiation.\n * \n * @param config - Begin checkout configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.begin({\n * cart: {\n * cartId: 'cart_123',\n * items: cartItems,\n * total: 199.99,\n * currency: 'USD',\n * itemCount: 3\n * }\n * });\n * ```\n */\n async begin(config: BeginCheckoutConfig): Promise<CheckoutResponse> {\n return await this.init(\"begin_checkout\", {\n type: \"begin_checkout\",\n cart: config.cart,\n cartValue: config.cart.total,\n itemCount: config.cart.itemCount,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks checkout step progress.\n * \n * @param config - Checkout step configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.step({\n * step: 'add_shipping_info',\n * stepNumber: 2,\n * cart: shoppingCart,\n * option: 'express_shipping'\n * });\n * ```\n */\n async step(config: CheckoutStepConfig): Promise<CheckoutResponse> {\n return await this.init(\"checkout_step\", {\n type: \"checkout_step\",\n step: config.step,\n stepNumber: config.stepNumber,\n cart: config.cart,\n option: config.option,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks adding shipping information.\n * \n * @param config - Shipping info configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.addShipping({\n * cart: shoppingCart,\n * shipping: {\n * method: 'standard',\n * carrier: 'USPS',\n * cost: 5.99,\n * estimatedDelivery: '2026-02-07'\n * }\n * });\n * ```\n */\n async addShipping(config: AddShippingConfig): Promise<CheckoutResponse> {\n return await this.init(\"add_shipping_info\", {\n type: \"add_shipping_info\",\n cart: config.cart,\n shipping: config.shipping,\n shippingMethod: config.shipping.method,\n shippingCost: config.shipping.cost,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks adding payment information.\n * \n * @param config - Payment info configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.addPayment({\n * cart: shoppingCart,\n * payment: {\n * method: 'credit_card',\n * provider: 'Stripe',\n * cardBrand: 'Mastercard',\n * cardLast4: '4242'\n * }\n * });\n * ```\n */\n async addPayment(config: AddPaymentConfig): Promise<CheckoutResponse> {\n return await this.init(\"add_payment_info\", {\n type: \"add_payment_info\",\n cart: config.cart,\n payment: config.payment,\n paymentMethod: config.payment.method,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks checkout abandonment.\n * \n * @param cart - Cart at abandonment\n * @param step - Last completed step\n * @param reason - Abandonment reason (if known)\n * @returns Promise resolving to checkout response\n */\n async abandon(\n cart: Cart,\n step: CheckoutStep,\n reason?: string\n ): Promise<CheckoutResponse> {\n return await this.init(\"checkout_abandoned\", {\n type: \"checkout_abandoned\",\n cart,\n step,\n cartValue: cart.total,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks payment attempt (success or failure).\n * \n * @param success - Whether payment succeeded\n * @param cart - Cart being paid for\n * @param payment - Payment information\n * @param errorCode - Error code (if failed)\n * @returns Promise resolving to checkout response\n */\n async paymentAttempt(\n success: boolean,\n cart: Cart,\n payment: PaymentInfo,\n errorCode?: string\n ): Promise<CheckoutResponse> {\n return await this.init(\"payment_attempt\", {\n type: \"payment_attempt\",\n success,\n cart,\n payment,\n errorCode,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves checkout analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to checkout analytics\n * \n * @example\n * ```typescript\n * const analytics = await checkout.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Funnel chart\n * const funnelData = analytics.funnel.map(step => ({\n * name: step.step,\n * value: step.started,\n * conversion: step.conversionRate\n * }));\n * \n * // Pie chart - payment methods\n * const paymentData = analytics.paymentMethods.map(p => ({\n * name: p.method,\n * value: p.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<CheckoutAnalyticsData> {\n return await this.init(\"get_checkout_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Checkout;\n","/**\n * @fileoverview Ecommerce - Purchase/Transaction Tracking\n * @module features/ecommerce/purchases\n * \n * @description\n * Track completed purchases, transactions, and revenue with\n * full order details and customer information.\n * \n * @useCases\n * - Track completed purchases\n * - Calculate revenue metrics\n * - Monitor order values\n * - Analyze purchase patterns\n * - Track customer lifetime value\n * \n * @metrics\n * - Total revenue\n * - Number of orders\n * - Average order value\n * - Revenue per customer\n * - Items per order\n * \n * @chartData\n * - Line chart: Revenue over time\n * - Bar chart: Revenue by product/category\n * - KPI cards: Revenue, AOV, Orders\n * - Table: Recent transactions\n * \n * @example\n * ```typescript\n * const purchases = new Purchases(webId, endpoint, apiKey);\n * \n * // Track a purchase\n * await purchases.track({\n * order: {\n * orderId: 'ORD-12345',\n * items: orderItems,\n * total: 299.99,\n * currency: 'USD'\n * }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Order,\n CartItem,\n ShippingInfo,\n PaymentInfo,\n RevenueMetrics,\n MoneyValue,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData,\n PaginationParams\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a purchase.\n */\nexport interface PurchaseConfig {\n /** Order details */\n order: Order;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Attribution data */\n attribution?: {\n source?: string;\n medium?: string;\n campaign?: string;\n affiliate?: string;\n };\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Purchase event response from API.\n */\nexport interface PurchaseResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n orderId: string;\n tracked: boolean;\n revenue: number;\n isFirstPurchase: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Revenue analytics data for charts.\n */\nexport interface RevenueAnalyticsData {\n /** Revenue summary */\n summary: {\n totalRevenue: MoneyValue;\n netRevenue: MoneyValue;\n totalOrders: number;\n averageOrderValue: MoneyValue;\n itemsSold: number;\n uniqueCustomers: number;\n repeatPurchaseRate: number;\n };\n /** Revenue time series */\n revenueTimeSeries: TimeSeriesData;\n /** Orders time series */\n ordersTimeSeries: TimeSeriesData;\n /** Revenue by category */\n byCategory: Array<{\n category: string;\n revenue: number;\n orders: number;\n percentage: number;\n }>;\n /** Revenue by product */\n byProduct: Array<{\n productId: string;\n productName: string;\n revenue: number;\n unitsSold: number;\n }>;\n /** Revenue by geography */\n byCountry: Array<{\n country: string;\n revenue: number;\n orders: number;\n }>;\n /** Customer segments */\n customerSegments: Array<{\n segment: 'new' | 'returning' | 'vip';\n customers: number;\n revenue: number;\n avgOrderValue: number;\n }>;\n}\n\n/**\n * Recent orders data.\n */\nexport interface RecentOrdersData {\n orders: Array<{\n orderId: string;\n total: MoneyValue;\n itemCount: number;\n status: string;\n createdAt: string;\n customer?: {\n userId: string;\n isNew: boolean;\n };\n }>;\n pagination: {\n page: number;\n limit: number;\n total: number;\n hasMore: boolean;\n };\n}\n\n// ============================================================================\n// PURCHASES CLASS\n// ============================================================================\n\n/**\n * Purchases - Track completed purchases and revenue.\n * \n * @extends FTRPC\n * \n * @description\n * Provides purchase tracking capabilities including:\n * - Purchase completion events\n * - Revenue tracking\n * - Order details capture\n * - Customer LTV tracking\n * - Attribution tracking\n * \n * @example\n * ```typescript\n * const purchases = new Purchases(webId, endpoint, apiKey);\n * \n * // Track completed purchase\n * await purchases.track({\n * order: {\n * orderId: 'ORD-12345',\n * items: cartItems,\n * subtotal: 279.99,\n * discountTotal: 30.00,\n * shippingTotal: 9.99,\n * taxTotal: 26.00,\n * total: 285.98,\n * currency: 'USD',\n * shipping: { method: 'express', cost: 9.99 },\n * payment: { method: 'credit_card' }\n * },\n * userId: 'user_123'\n * });\n * \n * // Get revenue analytics\n * const revenue = await purchases.getRevenue({ range: 'thisMonth' });\n * ```\n */\nexport class Purchases extends FTRPC {\n /**\n * Tracks a completed purchase.\n * \n * @param config - Purchase configuration\n * @returns Promise resolving to purchase response\n * \n * @example\n * ```typescript\n * await purchases.track({\n * order: {\n * orderId: 'ORD-98765',\n * items: [\n * { productId: 'PROD-1', name: 'Widget', price: 29.99, quantity: 2, lineTotal: 59.98 }\n * ],\n * subtotal: 59.98,\n * discountTotal: 0,\n * shippingTotal: 5.99,\n * taxTotal: 5.40,\n * total: 71.37,\n * currency: 'USD'\n * },\n * attribution: {\n * source: 'google',\n * medium: 'cpc',\n * campaign: 'spring_sale'\n * }\n * });\n * ```\n */\n async track(config: PurchaseConfig): Promise<PurchaseResponse> {\n const order = config.order;\n \n return await this.init(\"purchase\", {\n type: \"purchase\",\n order: {\n orderId: order.orderId,\n items: order.items,\n subtotal: order.subtotal,\n discountTotal: order.discountTotal,\n shippingTotal: order.shippingTotal,\n taxTotal: order.taxTotal,\n total: order.total,\n currency: order.currency,\n shipping: order.shipping,\n payment: order.payment,\n coupons: order.coupons,\n affiliation: order.affiliation\n },\n revenue: order.total,\n itemCount: order.items.reduce((sum, i) => sum + i.quantity, 0),\n userId: config.userId,\n sessionId: config.sessionId,\n attribution: config.attribution,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order status change.\n * \n * @param orderId - Order identifier\n * @param newStatus - New order status\n * @param previousStatus - Previous status (optional)\n * @returns Promise resolving to status change response\n */\n async statusChange(\n orderId: string,\n newStatus: Order['status'],\n previousStatus?: Order['status']\n ): Promise<PurchaseResponse> {\n return await this.init(\"order_status_change\", {\n type: \"order_status_change\",\n orderId,\n newStatus,\n previousStatus,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order shipped event.\n * \n * @param orderId - Order identifier\n * @param shipping - Shipping details with tracking\n * @returns Promise resolving to shipped response\n */\n async shipped(orderId: string, shipping: ShippingInfo): Promise<PurchaseResponse> {\n return await this.init(\"order_shipped\", {\n type: \"order_shipped\",\n orderId,\n shipping,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order delivered event.\n * \n * @param orderId - Order identifier\n * @param deliveredAt - Delivery timestamp\n * @returns Promise resolving to delivered response\n */\n async delivered(orderId: string, deliveredAt?: string): Promise<PurchaseResponse> {\n return await this.init(\"order_delivered\", {\n type: \"order_delivered\",\n orderId,\n deliveredAt: deliveredAt || new Date().toISOString(),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves revenue analytics for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to revenue analytics\n * \n * @example\n * ```typescript\n * const revenue = await purchases.getRevenue({ \n * range: 'last30days' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'Revenue', value: revenue.summary.totalRevenue.amount },\n * { label: 'Orders', value: revenue.summary.totalOrders },\n * { label: 'AOV', value: revenue.summary.averageOrderValue.amount }\n * ];\n * \n * // Revenue chart\n * const revenueChart = revenue.revenueTimeSeries.data;\n * \n * // Category breakdown\n * const categoryPie = revenue.byCategory.map(c => ({\n * name: c.category,\n * value: c.revenue\n * }));\n * ```\n */\n async getRevenue(filter?: DateRangeFilter): Promise<RevenueAnalyticsData> {\n return await this.init(\"get_revenue_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets recent orders for display.\n * \n * @param pagination - Pagination options\n * @returns Promise resolving to recent orders\n */\n async getRecentOrders(pagination?: PaginationParams): Promise<RecentOrdersData> {\n return await this.init(\"get_recent_orders\", {\n type: \"query\",\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets order details by ID.\n * \n * @param orderId - Order identifier\n * @returns Promise resolving to order details\n */\n async getOrder(orderId: string): Promise<Order> {\n return await this.init(\"get_order\", {\n type: \"query\",\n orderId,\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Purchases;\n","/**\n * @fileoverview FlowGrid SDK - Browser Bundle\n * @module browser\n * \n * @description\n * Browser-friendly bundle for including FlowGrid SDK via script tag.\n * Works with vanilla HTML, WordPress, Shopify, and any website.\n * \n * @example\n * ```html\n * <script src=\"https://cdn.flowgrid.com/sdk/v1/flowgrid.min.js\"></script>\n * <script>\n * flowgrid.init({\n * webId: 'your-web-id',\n * endpoint: 'api.flowgrid.com/v1',\n * apiKey: 'your-api-key'\n * });\n * \n * // Track events\n * flowgrid.track('button_click', { button: 'signup' });\n * flowgrid.page();\n * flowgrid.identify('user_123', { email: 'user@example.com' });\n * </script>\n * ```\n */\n\n// Import ONLY what's needed for browser - no framework code\nimport { Activation } from './lib/features/core/activation';\nimport { TrackFeature } from './lib/features/core/track-feature';\nimport { Experiment } from './lib/features/core/experiment';\nimport { FeatureFlag } from './lib/features/core/feature-flag';\nimport { PageViews } from './lib/features/analytics/page-views';\nimport { Sessions } from './lib/features/analytics/sessions';\nimport { Events } from './lib/features/analytics/events';\nimport { Identify } from './lib/features/analytics/identify';\nimport { Products } from './lib/features/ecommerce/products';\nimport { CartTracking } from './lib/features/ecommerce/cart';\nimport { Checkout } from './lib/features/ecommerce/checkout';\nimport { Purchases } from './lib/features/ecommerce/purchases';\n\n// ============================================================================\n// BROWSER SDK\n// ============================================================================\n\ninterface BrowserConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrack?: {\n pageViews?: boolean;\n sessions?: boolean;\n };\n}\n\nclass FlowGridBrowser {\n private config: BrowserConfig | null = null;\n private activation: Activation | null = null;\n private trackFeature: TrackFeature | null = null;\n private experiment: Experiment | null = null;\n private featureFlag: FeatureFlag | null = null;\n private pageViews: PageViews | null = null;\n private sessions: Sessions | null = null;\n private events: Events | null = null;\n private identifyModule: Identify | null = null;\n private products: Products | null = null;\n private cart: CartTracking | null = null;\n private checkout: Checkout | null = null;\n private purchases: Purchases | null = null;\n private sessionId: string | null = null;\n\n /**\n * Initialize FlowGrid SDK for browser use.\n */\n init(config: BrowserConfig): void {\n this.config = config;\n const { webId, endpoint, apiKey } = config;\n\n // Initialize all modules\n this.activation = new Activation(webId, endpoint, apiKey);\n this.trackFeature = new TrackFeature(webId, endpoint, apiKey);\n this.experiment = new Experiment(webId, endpoint, apiKey);\n this.featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n this.pageViews = new PageViews(webId, endpoint, apiKey);\n this.sessions = new Sessions(webId, endpoint, apiKey);\n this.events = new Events(webId, endpoint, apiKey);\n this.identifyModule = new Identify(webId, endpoint, apiKey);\n this.products = new Products(webId, endpoint, apiKey);\n this.cart = new CartTracking(webId, endpoint, apiKey);\n this.checkout = new Checkout(webId, endpoint, apiKey);\n this.purchases = new Purchases(webId, endpoint, apiKey);\n\n // Auto-track if enabled\n if (config.autoTrack?.sessions !== false) {\n this.startSession();\n }\n if (config.autoTrack?.pageViews !== false) {\n this.page();\n }\n\n console.log('FlowGrid SDK initialized');\n }\n\n /**\n * Track a custom event.\n */\n async track(eventName: string, properties?: Record<string, unknown>): Promise<void> {\n if (!this.events) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.events.track({\n eventName,\n category: 'custom',\n properties: {\n ...properties,\n sessionId: this.sessionId,\n },\n });\n }\n\n /**\n * Track a page view.\n */\n async page(url?: string, title?: string): Promise<void> {\n if (!this.pageViews) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n const pageUrl = url || window.location.href;\n const pageTitle = title || document.title;\n \n await this.pageViews.track({\n url: pageUrl,\n path: window.location.pathname,\n title: pageTitle,\n referrer: document.referrer,\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Identify a user.\n */\n async identify(userId: string, traits?: Record<string, unknown>): Promise<void> {\n if (!this.identifyModule) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.identifyModule.user({\n userId,\n traits: traits || {},\n });\n }\n\n /**\n * Track product view.\n */\n async productView(product: {\n productId: string;\n name: string;\n price: number;\n currency?: string;\n category?: string;\n brand?: string;\n }): Promise<void> {\n if (!this.products) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.products.view({\n productId: product.productId,\n name: product.name,\n price: product.price,\n currency: product.currency || 'USD',\n category: product.category,\n brand: product.brand,\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Track add to cart.\n */\n async addToCart(product: {\n productId: string;\n name: string;\n price: number;\n quantity: number;\n currency?: string;\n }, cartId?: string): Promise<void> {\n if (!this.cart) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.cart.addItem({\n product: {\n productId: product.productId,\n name: product.name,\n price: product.price,\n currency: product.currency || 'USD',\n },\n quantity: product.quantity,\n cartId: cartId || this.getOrCreateCartId(),\n });\n }\n\n /**\n * Track purchase/conversion.\n */\n async purchase(order: {\n orderId: string;\n total: number;\n currency?: string;\n items: Array<{\n productId: string;\n name: string;\n price: number;\n quantity: number;\n }>;\n }): Promise<void> {\n if (!this.purchases) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n const currency = order.currency || 'USD';\n const items = order.items.map(item => ({\n productId: item.productId,\n name: item.name,\n price: item.price,\n currency,\n quantity: item.quantity,\n lineTotal: item.price * item.quantity,\n }));\n \n const subtotal = items.reduce((sum, item) => sum + item.lineTotal, 0);\n \n await this.purchases.track({\n order: {\n orderId: order.orderId,\n items,\n subtotal,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: order.total,\n currency,\n },\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Start a session (called automatically on init).\n */\n private async startSession(): Promise<void> {\n if (!this.sessions) return;\n \n this.sessionId = this.generateSessionId();\n \n await this.sessions.start({\n landingPage: window.location.href,\n referrer: document.referrer,\n utm: this.parseUTM(),\n });\n }\n\n /**\n * Generate a session ID.\n */\n private generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Get or create cart ID from localStorage.\n */\n private getOrCreateCartId(): string {\n let cartId = localStorage.getItem('flowgrid_cart_id');\n if (!cartId) {\n cartId = `cart_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n localStorage.setItem('flowgrid_cart_id', cartId);\n }\n return cartId;\n }\n\n /**\n * Parse UTM parameters from URL.\n */\n private parseUTM() {\n const params = new URLSearchParams(window.location.search);\n return {\n utmSource: params.get('utm_source') || undefined,\n utmMedium: params.get('utm_medium') || undefined,\n utmCampaign: params.get('utm_campaign') || undefined,\n utmTerm: params.get('utm_term') || undefined,\n utmContent: params.get('utm_content') || undefined,\n };\n }\n}\n\n// ============================================================================\n// GLOBAL INSTANCE\n// ============================================================================\n\nconst flowgridInstance = new FlowGridBrowser();\n\n// Export for UMD\nexport default flowgridInstance;\n\n// Make available globally for script tag usage\nif (typeof window !== 'undefined') {\n (window as any).flowgrid = flowgridInstance;\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","FTRPC","constructor","webId","endpoint","apiKey","length","Error","init","eventName","properties","request","validateInput","url","type","body","JSON","stringify","web_id","event_name","controller","AbortController","timeoutId","setTimeout","abort","res","fetch","method","headers","undefined","signal","clearTimeout","ok","statusText","status","json","error","name","trim","sensitiveKeys","propertiesStr","toLowerCase","includes","console","warn","Activation","create","config","timestamp","Date","toISOString","trackOnboardingStep","subtype","userId","stepId","stepName","stepOrder","totalSteps","progress","Math","round","timeSpent","skipped","completeOnboarding","totalTimeSpent","stepsCompleted","stepsSkipped","completionRate","trackFirstAction","actionName","timeSinceSignup","source","trackSignup","getAnalytics","filter","range","TrackFeature","trackUsage","action","featureId","featureName","duration","success","category","trackDiscovery","discoveryMethod","engaged","trackAdoption","trackAbandonment","reason","Experiment","track","variant","assign","experimentId","variantId","trackConversion","metricName","trackExposure","getResults","FeatureFlag","evaluate","trackEvaluation","flagKey","context","result","trackStatusChange","enabled","changedBy","trackRolloutChange","previousPercentage","newPercentage","getFlagAnalytics","PageViews","path","title","referrer","sessionId","trackScrollDepth","scrollDepth","min","max","timeAtDepth","trackTimeOnPage","trackExit","pagination","page","limit","Sessions","start","user","device","location","utm","utmSource","medium","utmMedium","campaign","utmCampaign","landingPage","window","href","document","update","end","heartbeat","getRealTime","realtime","Events","label","nonInteraction","trackBatch","events","map","e","count","trackClick","trackForm","trackSearch","query","resultsCount","resultClicked","clickedPosition","filters","trackError","message","stack","errorType","fatal","userAction","Identify","anonymousId","traits","updateTraits","alias","previousId","group","groupId","reset","Products","view","product","productId","brand","price","currency","imageUrl","rating","reviewCount","stockStatus","attributes","searchQuery","impression","list","productCount","products","click","listId","position","quickView","interaction","getProductPerformance","CartTracking","addItem","lineTotal","quantity","discount","cartId","removeItem","updateItem","previousQuantity","newQuantity","quantityChange","cart","cartValue","total","itemCount","abandon","applyCoupon","couponCode","Checkout","begin","step","stepNumber","option","addShipping","shipping","shippingMethod","shippingCost","cost","addPayment","payment","paymentMethod","paymentAttempt","errorCode","Purchases","order","orderId","items","subtotal","discountTotal","shippingTotal","taxTotal","coupons","affiliation","revenue","reduce","sum","i","attribution","statusChange","newStatus","previousStatus","shipped","delivered","deliveredAt","getRevenue","getRecentOrders","getOrder","flowgridInstance","activation","trackFeature","experiment","featureFlag","pageViews","sessions","identifyModule","checkout","purchases","autoTrack","startSession","log","pageUrl","pageTitle","pathname","identify","productView","addToCart","getOrCreateCartId","purchase","item","generateSessionId","parseUTM","now","random","toString","substring","localStorage","getItem","setItem","params","URLSearchParams","search","utmTerm","utmContent","flowgrid"],"sourceRoot":""}
1
+ {"version":3,"file":"flowgrid.min.js","mappings":"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","sources":["webpack://flowgrid/webpack/universalModuleDefinition","webpack://flowgrid/webpack/bootstrap","webpack://flowgrid/webpack/runtime/define property getters","webpack://flowgrid/webpack/runtime/hasOwnProperty shorthand","webpack://flowgrid/webpack/runtime/make namespace object","webpack://flowgrid/./src/lib/client/ftrpc.ts","webpack://flowgrid/./src/lib/features/core/activation.ts","webpack://flowgrid/./src/lib/features/core/track-feature.ts","webpack://flowgrid/./src/lib/features/core/experiment.ts","webpack://flowgrid/./src/lib/features/core/feature-flag.ts","webpack://flowgrid/./src/lib/features/analytics/page-views.ts","webpack://flowgrid/./src/lib/features/analytics/sessions.ts","webpack://flowgrid/./src/lib/features/analytics/events.ts","webpack://flowgrid/./src/lib/features/analytics/identify.ts","webpack://flowgrid/./src/lib/features/ecommerce/products.ts","webpack://flowgrid/./src/lib/features/ecommerce/cart.ts","webpack://flowgrid/./src/lib/features/ecommerce/checkout.ts","webpack://flowgrid/./src/lib/features/ecommerce/purchases.ts","webpack://flowgrid/./src/browser.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"flowgrid\"] = factory();\n\telse\n\t\troot[\"flowgrid\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","type Config = {\n eventName: string,\n type: \n // generic\n | \"query\"\n // Core types\n | \"activation\" \n | \"feature_usage\" \n | \"prompt\" \n | \"experiment\" \n | \"feature_flag_evaluation\"\n | \"feature_flag_definition\"\n | \"feature_flag_status\"\n | \"feature_flag_rollout\"\n // Analytics types\n | \"page_view\"\n | \"session\"\n | \"custom_event\"\n | \"batch_events\"\n | \"click_event\"\n | \"form_event\"\n | \"search_event\"\n | \"error_event\"\n | \"identify\"\n | \"funnel\"\n | \"retention\"\n | \"attribution\"\n | \"heatmap\"\n | \"performance\"\n // Ecommerce types\n | \"product\"\n | \"cart\"\n | \"checkout\"\n | \"purchase\"\n | \"refund\"\n | \"promotion\"\n | \"wishlist\"\n | \"ltv\"\n | \"search\"\n | \"inventory\"\n | \"subscription\"\n // Enterprise types\n | \"engagement\"\n | \"cohorts\"\n | \"churn\"\n | \"monetization\"\n | \"multi_path_funnels\"\n | \"support\"\n | \"acquisition\"\n | \"paths\"\n | \"alerts\"\n | \"security\"\n | \"forecasting\",\n properties: Record<string, any>\n}\n\n/**\n * Base SDK Class\n * - Flowgrid TypeScript Remote Procedure Call\n * - Handles common logic for sending events to the API.\n *\n * PRIVACY NOTICE:\n * This SDK collects event data for analytics purposes. Ensure compliance with\n * applicable privacy laws (GDPR, CCPA, etc.) when collecting user data.\n * Do not send personally identifiable information without proper consent.\n *\n * ```typescript\n * await this.init('eventName', { key: 'value' });\n * ```\n */\n/**\n * FTRPC - Core transport layer for Flowgrid SDK.\n *\n * @description\n * Provides a secure, validated RPC-style transport layer used by all SDK modules.\n * Handles:\n * - Input validation\n * - Payload size enforcement\n * - Timeout handling\n * - Retry logic (network failures only)\n * - Authorization headers\n *\n * This class is designed to be extended by higher-level modules\n * (e.g., FeatureFlag, Analytics, Experiments).\n *\n * @example\n * ```ts\n * const client = new FTRPC(\"web_123\", \"api.flowgrid.com\", \"sk_live_xxx\");\n * ```\n */\nexport class FTRPC {\n\n /**\n * Unique Web ID identifying the site or application.\n * Used by the backend to associate incoming events.\n */\n protected webId: string;\n\n /**\n * Base API endpoint.\n * Example values:\n * - \"api.flowgrid.com\"\n * - \"https://api.flowgrid.com\"\n *\n * Protocol is normalized automatically.\n */\n protected endpoint: string;\n\n /**\n * Private API key used for authenticating requests.\n * Sent as a Bearer token in the Authorization header.\n */\n private apiKey: string;\n\n /**\n * Maximum allowed payload size (in bytes).\n * Prevents oversized event submissions.\n */\n private static readonly MAX_PAYLOAD_SIZE = 10_000; // 10KB\n\n /**\n * Maximum time (ms) before request is aborted.\n */\n private static readonly TIMEOUT_MS = 10_000;\n\n /**\n * Maximum retry attempts for network-level failures.\n * Does NOT retry HTTP 4xx/5xx responses.\n */\n private static readonly MAX_RETRIES = 1;\n\n /**\n * Creates a new FTRPC transport instance.\n *\n * @param webId - Unique identifier for the web property.\n * @param endpoint - API base endpoint.\n * @param apiKey - Private API key for authentication.\n *\n * @throws {Error} If required parameters are missing.\n */\n constructor(webId: string, endpoint: string, apiKey: string) {\n if (!webId?.trim() || !endpoint?.trim()) {\n throw new Error(\"SDK init failed: webId and endpoint are required.\");\n }\n\n this.webId = webId.trim();\n this.endpoint = this.normalizeEndpoint(endpoint);\n this.apiKey = apiKey;\n }\n\n /**\n * Core RPC transport method.\n *\n * @template T Expected JSON response type.\n *\n * @param eventName - Logical event or function name.\n * @param properties - Arbitrary event payload properties.\n * @param method - HTTP method (\"GET\", \"POST\", \"PATCH\").\n *\n * @returns Promise resolving to typed response.\n *\n * @remarks\n * - GET requests are treated as read-only operations.\n * - POST/PATCH requests may mutate backend state.\n * - Retries occur only for network failures or timeouts.\n */\n protected async init<T>(\n eventName: string,\n properties: Record<string, any> = {},\n method: \"GET\" | \"POST\" | \"PATCH\" = \"POST\"\n ): Promise<T> {\n\n this.validateInput(eventName, properties);\n\n const callType = properties.type || \"event\";\n const url = `${this.endpoint}/sdk/functions?call=${encodeURIComponent(callType)}`;\n\n const body = JSON.stringify({\n web_id: this.webId,\n event_name: eventName,\n properties,\n });\n\n return this.executeRequest<T>(url, method, method === \"GET\" ? undefined : body);\n }\n\n /**\n * Executes HTTP request with timeout and retry handling.\n *\n * @template T Expected response type.\n *\n * @param url - Fully constructed request URL.\n * @param method - HTTP method.\n * @param body - Optional JSON body (POST/PATCH only).\n *\n * @throws {Error} On timeout, network failure, or non-OK HTTP status.\n */\n private async executeRequest<T>(\n url: string,\n method: \"GET\" | \"POST\" | \"PATCH\",\n body?: string\n ): Promise<T> {\n\n let attempt = 0;\n\n while (true) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), FTRPC.TIMEOUT_MS);\n\n try {\n const res = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${this.apiKey}`,\n },\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!res.ok) {\n const text = await this.safeRead(res);\n throw new Error(\n `SDK request failed (${res.status} ${res.statusText}) ${text}`\n );\n }\n\n return await res.json();\n\n } catch (error) {\n clearTimeout(timeoutId);\n\n const isNetworkError =\n error instanceof Error &&\n (error.name === \"AbortError\" || error.message.includes(\"fetch\"));\n\n if (isNetworkError && attempt < FTRPC.MAX_RETRIES) {\n attempt++;\n continue;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(\"SDK request timed out\");\n }\n\n throw error;\n }\n }\n }\n\n /**\n * Validates event name and payload.\n *\n * @param eventName - Event identifier.\n * @param properties - Associated event properties.\n *\n * @throws {Error} If validation fails.\n */\n private validateInput(eventName: string, properties: Record<string, any>) {\n\n if (!eventName || typeof eventName !== \"string\" || !eventName.trim()) {\n throw new Error(\"Event name must be a non-empty string\");\n }\n\n if (eventName.length > 100) {\n throw new Error(\"Event name must be less than 100 characters\");\n }\n\n let serialized: string;\n\n try {\n serialized = JSON.stringify({\n web_id: this.webId,\n event_name: eventName,\n properties,\n });\n } catch {\n throw new Error(\"Properties must be JSON serializable\");\n }\n\n if (new TextEncoder().encode(serialized).length > FTRPC.MAX_PAYLOAD_SIZE) {\n throw new Error(\"Event payload too large (max 10KB)\");\n }\n\n const sensitiveKeys = [\"password\", \"token\", \"secret\", \"apikey\", \"authorization\"];\n const lower = serialized.toLowerCase();\n\n for (const key of sensitiveKeys) {\n if (lower.includes(key)) {\n console.warn(\n `SDK Warning: Properties may contain sensitive data (${key}).`\n );\n }\n }\n }\n\n /**\n * Normalizes endpoint input.\n * Ensures protocol is present and removes trailing slashes.\n *\n * @param endpoint - Raw endpoint string.\n * @returns Normalized endpoint URL.\n */\n private normalizeEndpoint(endpoint: string): string {\n let clean = endpoint.trim();\n\n if (!clean.startsWith(\"http://\") && !clean.startsWith(\"https://\")) {\n clean = `https://${clean}`;\n }\n\n return clean.replace(/\\/+$/, \"\");\n }\n\n /**\n * Safely reads response text without throwing.\n *\n * @param res - Fetch Response object.\n * @returns Response text or empty string.\n */\n private async safeRead(res: Response): Promise<string> {\n try {\n return await res.text();\n } catch {\n return \"\";\n }\n }\n}","/**\n * @fileoverview Core - User Activation Tracking\n * @module features/core/activation\n * \n * @description\n * Track user activation events including onboarding steps,\n * signup completions, and first-time actions.\n * \n * @useCases\n * - Track onboarding step completions\n * - Monitor signup funnel\n * - Measure time to first value\n * - Identify activation bottlenecks\n * - A/B test onboarding flows\n * \n * @metrics\n * - Activation rate\n * - Onboarding completion rate\n * - Time to activate\n * - Drop-off by step\n * - Activation by source\n * \n * @chartData\n * - Funnel chart: Onboarding steps\n * - Line chart: Activation rate over time\n * - Bar chart: Activation by cohort/source\n * - KPI: Time to first value\n * \n * @example\n * ```typescript\n * const activation = new Activation(webId, endpoint, apiKey);\n * \n * // Track activation event\n * await activation.create({\n * eventName: 'onboarding_completed',\n * properties: { userId: 'user_123', step: 'profile_setup' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base configuration for activation events.\n */\nexport interface ActivationConfig {\n /** Event name */\n eventName: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Onboarding step configuration.\n */\nexport interface OnboardingStepConfig {\n /** User ID */\n userId: string;\n /** Step identifier */\n stepId: string;\n /** Step name */\n stepName: string;\n /** Step order/number */\n stepOrder: number;\n /** Total steps in flow */\n totalSteps: number;\n /** Time spent on step (ms) */\n timeSpent?: number;\n /** Whether step was skipped */\n skipped?: boolean;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * First action configuration.\n */\nexport interface FirstActionConfig {\n /** User ID */\n userId: string;\n /** Action name */\n actionName: string;\n /** Time since signup (ms) */\n timeSinceSignup: number;\n /** Source/referrer */\n source?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Activation response from API.\n */\nexport interface ActivationResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n activationId?: string;\n isFirstActivation?: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Activation analytics data.\n */\nexport interface ActivationAnalyticsData {\n /** Summary metrics */\n summary: {\n totalSignups: number;\n activatedUsers: number;\n activationRate: number;\n avgTimeToActivate: number;\n onboardingCompletionRate: number;\n };\n /** Activation by step */\n byStep: Array<{\n stepId: string;\n stepName: string;\n started: number;\n completed: number;\n dropOff: number;\n avgTimeSpent: number;\n }>;\n /** Activation by source */\n bySource: Array<{\n source: string;\n signups: number;\n activated: number;\n activationRate: number;\n }>;\n /** Activation trends */\n trends: TimeSeriesData;\n /** Cohort activation */\n byCohort: Array<{\n cohort: string;\n users: number;\n activated: number;\n activationRate: number;\n avgTimeToActivate: number;\n }>;\n}\n\n// ============================================================================\n// ACTIVATION CLASS\n// ============================================================================\n\n/**\n * Activation - Track user activation events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides activation tracking including:\n * - Generic activation events\n * - Onboarding step tracking\n * - First action tracking\n * - Signup completion\n * - Activation analytics\n * \n * @example\n * ```typescript\n * const activation = new Activation(webId, endpoint, apiKey);\n * \n * // Track onboarding step\n * await activation.trackOnboardingStep({\n * userId: 'user_123',\n * stepId: 'profile_setup',\n * stepName: 'Set Up Profile',\n * stepOrder: 2,\n * totalSteps: 5\n * });\n * \n * // Track first value action\n * await activation.trackFirstAction({\n * userId: 'user_123',\n * actionName: 'created_first_project',\n * timeSinceSignup: 3600000 // 1 hour\n * });\n * ```\n */\nexport class Activation extends FTRPC {\n /**\n * Creates and tracks an activation event.\n * \n * @param config - Activation configuration\n * @returns Promise resolving to activation response\n */\n async create(config: ActivationConfig): Promise<ActivationResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"activation\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks an onboarding step completion.\n * \n * @param config - Onboarding step configuration\n * @returns Promise resolving to activation response\n */\n async trackOnboardingStep(config: OnboardingStepConfig): Promise<ActivationResponse> {\n return await this.init(\"onboarding_step\", {\n type: \"activation\",\n subtype: \"onboarding_step\",\n userId: config.userId,\n stepId: config.stepId,\n stepName: config.stepName,\n stepOrder: config.stepOrder,\n totalSteps: config.totalSteps,\n progress: Math.round((config.stepOrder / config.totalSteps) * 100),\n timeSpent: config.timeSpent,\n skipped: config.skipped || false,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks onboarding completion.\n * \n * @param userId - User ID\n * @param totalTimeSpent - Total time in onboarding (ms)\n * @param stepsCompleted - Number of steps completed\n * @param stepsSkipped - Number of steps skipped\n * @returns Promise resolving to activation response\n */\n async completeOnboarding(\n userId: string,\n totalTimeSpent: number,\n stepsCompleted: number,\n stepsSkipped: number\n ): Promise<ActivationResponse> {\n return await this.init(\"onboarding_completed\", {\n type: \"activation\",\n subtype: \"onboarding_complete\",\n userId,\n totalTimeSpent,\n stepsCompleted,\n stepsSkipped,\n completionRate: Math.round((stepsCompleted / (stepsCompleted + stepsSkipped)) * 100),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks user's first meaningful action (activation moment).\n * \n * @param config - First action configuration\n * @returns Promise resolving to activation response\n */\n async trackFirstAction(config: FirstActionConfig): Promise<ActivationResponse> {\n return await this.init(\"first_action\", {\n type: \"activation\",\n subtype: \"first_action\",\n userId: config.userId,\n actionName: config.actionName,\n timeSinceSignup: config.timeSinceSignup,\n source: config.source,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks signup completion.\n * \n * @param userId - User ID\n * @param method - Signup method (email, google, etc.)\n * @param source - Traffic source\n * @param properties - Additional properties\n * @returns Promise resolving to activation response\n */\n async trackSignup(\n userId: string,\n method: 'email' | 'google' | 'github' | 'apple' | 'sso' | string,\n source?: string,\n properties?: Record<string, unknown>\n ): Promise<ActivationResponse> {\n return await this.init(\"signup_completed\", {\n type: \"activation\",\n subtype: \"signup\",\n userId,\n method,\n source,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets activation analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to activation analytics\n * \n * @example\n * ```typescript\n * const analytics = await activation.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Funnel chart - onboarding steps\n * const funnel = analytics.byStep.map(s => ({\n * name: s.stepName,\n * value: s.completed\n * }));\n * \n * // KPI - activation rate\n * const activationRate = analytics.summary.activationRate;\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<ActivationAnalyticsData> {\n return await this.init(\"get_activation_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Activation;\n","/**\n * @fileoverview Core - Feature Usage Tracking\n * @module features/core/track-feature\n * \n * @description\n * Track feature usage events to understand how users\n * interact with different parts of your product.\n * \n * @useCases\n * - Track feature adoption rates\n * - Measure feature engagement\n * - Identify power users\n * - Prioritize feature development\n * - Detect underused features\n * \n * @metrics\n * - Feature adoption rate\n * - Feature usage frequency\n * - Users per feature\n * - Feature stickiness\n * - Time spent per feature\n * \n * @chartData\n * - Bar chart: Most used features\n * - Heatmap: Feature usage by user segment\n * - Line chart: Feature adoption over time\n * - Table: Feature engagement metrics\n * \n * @example\n * ```typescript\n * const trackFeature = new TrackFeature(webId, endpoint, apiKey);\n * \n * await trackFeature.create({\n * userId: 'user_123',\n * action: 'export_report',\n * properties: { featureName: 'export_report', featureId: 'export_report_001' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n\ntype FeatureConfigProperties = {\n featureId?: string;\n featureName: string;\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Base configuration for feature tracking.\n */\nexport interface FeatureConfig {\n /** Feature tracking properties */\n action: string;\n\n /** Feature category */\n category?: string;\n\n userId: string;\n\n /** Event properties */\n properties: FeatureConfigProperties;\n\n}\n\n/**\n * Detailed feature usage configuration.\n */\nexport interface FeatureUsageConfig {\n /** Feature identifier */\n featureId: string;\n /** Feature name */\n featureName: string;\n /** User ID */\n userId?: string;\n /** Usage action */\n action: 'viewed' | 'used' | 'completed' | 'abandoned';\n /** Time spent (ms) */\n duration?: number;\n /** Success/failure */\n success?: boolean;\n /** Feature category */\n category?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Feature discovery configuration.\n */\nexport interface FeatureDiscoveryConfig {\n /** Feature identifier */\n featureId: string;\n /** User ID */\n userId: string;\n /** How feature was discovered */\n discoveryMethod: 'organic' | 'tooltip' | 'announcement' | 'search' | 'onboarding' | 'recommendation' | string;\n /** Whether user engaged with feature */\n engaged: boolean;\n}\n\n/**\n * Feature tracking response.\n */\nexport interface FeatureResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n featureId?: string;\n isFirstUse?: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Feature analytics data.\n */\nexport interface FeatureAnalyticsData {\n /** Summary metrics */\n summary: {\n totalFeatures: number;\n totalUsage: number;\n uniqueUsers: number;\n avgUsagePerUser: number;\n mostUsedFeature: string;\n leastUsedFeature: string;\n };\n /** Usage by feature */\n byFeature: Array<{\n featureId: string;\n featureName: string;\n category: string;\n usageCount: number;\n uniqueUsers: number;\n adoptionRate: number;\n avgDuration: number;\n successRate: number;\n }>;\n /** Usage by user segment */\n bySegment: Array<{\n segment: string;\n topFeatures: string[];\n avgFeaturesUsed: number;\n }>;\n /** Feature trends */\n trends: TimeSeriesData;\n /** Feature correlations */\n correlations: Array<{\n featureA: string;\n featureB: string;\n correlation: number;\n }>;\n}\n\n// ============================================================================\n// TRACK FEATURE CLASS\n// ============================================================================\n\n/**\n * TrackFeature - Track feature usage events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides feature tracking including:\n * - Generic feature events\n * - Detailed usage tracking\n * - Feature discovery tracking\n * \n * @example\n * ```typescript\n * const trackFeature = new TrackFeature(webId, endpoint, apiKey);\n * \n * // Simple feature tracking\n * await trackFeature.create({\n * userId: 'user_123',\n * action: 'dark_mode_enabled',\n * properties: { featureName: 'dark_mode' }\n * });\n * \n * // Detailed feature usage\n * await trackFeature.trackUsage({\n * featureId: 'export',\n * featureName: 'Data Export',\n * userId: 'user_123',\n * action: 'completed',\n * duration: 5000,\n * success: true,\n * properties: { format: 'csv' }\n * });\n * ```\n */\n\nexport class TrackFeature extends FTRPC {\n /**\n * Records a feature usage event.\n * \n * @param config - Feature configuration\n * @returns Promise resolving to feature response\n */\n async create(config: FeatureConfig): Promise<FeatureResponse> {\n return await this.init(\"create_tracking\", {\n type: \"feature_usage\",\n subtype: \"create_custom\",\n userId: config.userId,\n category: config.category,\n action: config.action,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks detailed feature usage.\n * \n * @param config - Feature usage configuration\n * @returns Promise resolving to feature response\n */\n async trackUsage(config: FeatureUsageConfig): Promise<FeatureResponse> {\n return await this.init(\"feature_usage\", {\n type: \"feature_usage\",\n subtype: config.action,\n featureId: config.featureId,\n featureName: config.featureName,\n userId: config.userId,\n action: config.action,\n duration: config.duration,\n success: config.success,\n category: config.category,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets feature analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to feature analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<FeatureAnalyticsData> {\n return await this.init(\"get_feature_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default TrackFeature;\n","/**\n * @fileoverview Core - A/B Testing & Experiments\n * @module features/core/experiment\n * \n * @description\n * Track A/B tests, experiments, and variant assignments\n * to measure impact and optimize product decisions.\n * \n * @useCases\n * - Run A/B tests on features\n * - Track variant assignments\n * - Measure experiment impact\n * - Statistical significance analysis\n * - Multi-variant testing\n * \n * @metrics\n * - Conversion by variant\n * - Statistical significance\n * - Sample size per variant\n * - Experiment duration\n * - Impact on key metrics\n * \n * @chartData\n * - Bar chart: Conversion by variant\n * - Line chart: Metric trends by variant\n * - Table: Experiment results summary\n * - Confidence interval visualization\n * \n * @example\n * ```typescript\n * const experiment = new Experiment(webId, endpoint, apiKey);\n * \n * await experiment.track({\n * eventName: 'checkout_flow_test',\n * variant: 'simplified_v2',\n * properties: { userId: 'user_123' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking an experiment-related event.\n *\n * Used when sending a generic experiment event with a specific variant\n * and associated properties.\n */\nexport interface ExperimentConfig {\n /** Logical experiment event name */\n eventName: string;\n\n /** Variant identifier associated with this event */\n variant: string;\n\n /** Additional contextual event data */\n properties: Record<string, unknown>;\n}\n\n/**\n * Defines the structure and metadata of an experiment.\n *\n * Used when creating or updating an experiment configuration.\n */\nexport interface ExperimentDefinition {\n /** Unique identifier for the experiment */\n experimentId: string;\n\n /** Human-readable experiment name */\n name: string;\n\n /** Optional description of experiment purpose */\n description?: string;\n\n /** Variants participating in the experiment */\n variants: Array<{\n /** Unique identifier for the variant */\n variantId: string;\n\n /** Human-readable variant name */\n name: string;\n\n /** Traffic allocation weight (relative distribution) */\n weight: number;\n }>;\n\n /**\n * Optional audience configuration.\n * Allows limiting exposure by percentage and/or filter conditions.\n */\n audience?: {\n /** Percentage of total traffic eligible (0–100) */\n percentage: number;\n\n /** Attribute-based targeting filters */\n filters?: Record<string, unknown>;\n };\n\n /** Primary metric used to evaluate experiment success */\n primaryMetric: string;\n\n /** Optional secondary metrics */\n secondaryMetrics?: string[];\n\n /** Optional ISO start date */\n startDate?: string;\n\n /** Optional ISO end date */\n endDate?: string;\n}\n\n/**\n * Configuration for assigning a user to a specific experiment variant.\n *\n * Represents an explicit assignment event.\n */\nexport interface ExperimentAssignmentConfig {\n /** Experiment identifier */\n experimentId: string;\n\n /** Unique user identifier */\n userId: string;\n\n /** Assigned variant identifier */\n variantId: string;\n\n /**\n * Assignment origin:\n * - random: weighted allocation\n * - targeted: rule-based assignment\n * - override: manual or forced assignment\n */\n source?: 'random' | 'targeted' | 'override';\n}\n\n/**\n * Configuration for recording a conversion event within an experiment.\n *\n * Used to attribute metric changes to a specific variant.\n */\nexport interface ExperimentConversionConfig {\n /** Experiment identifier */\n experimentId: string;\n\n /** Unique user identifier */\n userId: string;\n\n /** Variant associated with the user */\n variantId: string;\n\n /** Metric name being recorded */\n metricName: string;\n\n /** Numeric metric value */\n value: number;\n}\n\n/**\n * Standardized response returned from experiment tracking operations.\n *\n * Ensures consistent structure across assignment, exposure,\n * definition, and conversion events.\n */\nexport interface ExperimentResponse {\n /** Event name associated with the request */\n eventName: string;\n\n /** Properties sent with the event */\n properties: Record<string, unknown>;\n\n /** Server acknowledgment metadata */\n response: {\n /** Indicates whether the event was successfully recorded */\n tracked: boolean;\n\n /** Optional experiment identifier */\n experimentId?: string;\n\n /** Optional variant identifier */\n variantId?: string;\n };\n\n /** ISO timestamp of the recorded event */\n timestamp: string;\n}\n\n/**\n * Aggregated results for a single experiment.\n *\n * Represents computed performance metrics per variant.\n */\nexport interface ExperimentResultsData {\n /** Experiment metadata */\n experiment: {\n experimentId: string;\n name: string;\n status: 'running' | 'paused' | 'completed';\n startDate: string;\n /** Duration in days */\n duration: number;\n };\n\n /** Variant-level performance metrics */\n variants: Array<{\n variantId: string;\n name: string;\n\n /** Total participants assigned */\n participants: number;\n\n /** Total recorded conversions */\n conversions: number;\n\n /** conversions / participants */\n conversionRate: number;\n\n /** Relative improvement compared to baseline */\n improvement: number;\n\n /** Statistical confidence level (0–1 or percentage depending on backend) */\n confidence: number;\n\n /** Indicates highest performing variant */\n isWinner: boolean;\n\n /** Indicates whether statistical threshold is met */\n isStatisticallySignificant: boolean;\n }>;\n\n /** Time-series metric trends per metric name */\n trends: Record<string, TimeSeriesData>;\n\n /** System-generated recommendation */\n recommendation: {\n action: 'ship_winner' | 'continue' | 'stop' | 'needs_more_data';\n winningVariant?: string;\n confidence: number;\n reason: string;\n };\n}\n\n/**\n * Aggregated analytics across all experiments.\n *\n * Provides high-level performance and activity overview.\n */\nexport interface ExperimentAnalyticsData {\n /** Platform-wide experiment summary */\n summary: {\n totalExperiments: number;\n activeExperiments: number;\n completedExperiments: number;\n avgExperimentDuration: number;\n winRate: number;\n };\n\n /** Currently active experiments */\n active: Array<{\n experimentId: string;\n name: string;\n participants: number;\n daysSinceStart: number;\n leadingVariant: string;\n confidence: number;\n }>;\n\n /** Recently completed experiments */\n recentResults: Array<{\n experimentId: string;\n name: string;\n winner: string;\n improvement: number;\n completedDate: string;\n }>;\n}\n\nexport interface VariantResponse {\n experimentId: string;\n userId?: string;\n variantId: string;\n assignedAt: string;\n}\n\n// ============================================================================\n// EXPERIMENT CLASS\n// ============================================================================\n\n/**\n * Experiment - A/B Testing & Experimentation SDK\n *\n * @extends FTRPC\n *\n * @description\n * Provides structured experiment lifecycle management including:\n * - Experiment definition\n * - Deterministic or server-based variant assignment\n * - Exposure tracking\n * - Conversion tracking\n * - Statistical results & analysis\n *\n * This class enforces correct HTTP semantics:\n *\n * Exposure and conversion events are strictly POST to preserve:\n * - Statistical validity\n * - Unique participant counting\n * - Accurate conversion attribution\n * - Idempotent replay safety\n *\n * @lifecycle\n * 1. Define experiment\n * 2. Assign user to variant\n * 3. Track exposure (when user actually sees variant)\n * 4. Track conversions (primary/secondary metrics)\n * 5. Query results & statistical analysis\n *\n * @statistical_model\n * - Variant-level sample sizes tracked independently\n * - Conversion rates calculated per variant\n * - Confidence intervals computed server-side\n * - Statistical significance evaluated against control\n *\n * @guarantees\n * - Assignment is explicitly recorded\n * - Exposure tracking is immutable\n * - Conversion events are attributable to assigned variant\n * - Results queries never mutate experiment state\n *\n * @example\n * ```typescript\n * const experiment = new Experiment(webId, endpoint, apiKey);\n *\n * // 1. Define experiment\n * await experiment.define({\n * experimentId: 'checkout_v2',\n * name: 'Simplified Checkout',\n * variants: [\n * { variantId: 'control', name: 'Current', weight: 50 },\n * { variantId: 'treatment', name: 'Simplified', weight: 50 }\n * ],\n * primaryMetric: 'checkout_completed'\n * });\n *\n * // 2. Assign user\n * await experiment.assign({\n * experimentId: 'checkout_v2',\n * userId: 'user_123',\n * variantId: 'treatment'\n * });\n *\n * // 3. Track exposure\n * await experiment.trackExposure('checkout_v2', 'user_123', 'treatment');\n *\n * // 4. Track conversion\n * await experiment.trackConversion({\n * experimentId: 'checkout_v2',\n * userId: 'user_123',\n * variantId: 'treatment',\n * metricName: 'checkout_completed',\n * value: 1\n * });\n *\n * // 5. Fetch results\n * const results = await experiment.getResults('checkout_v2');\n * ```\n */\nexport class Experiment extends FTRPC {\n /**\n * Tracks an experiment event.\n * \n * @param config - Experiment configuration\n * @returns Promise resolving to experiment response\n */\n async track(config: ExperimentConfig): Promise<ExperimentResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"experiment\",\n variant: config.variant,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Defines a new experiment.\n * \n * @param definition - Experiment definition\n * @returns Promise resolving to experiment response\n */\n async define(definition: ExperimentDefinition): Promise<ExperimentResponse> {\n return await this.init(\"experiment_defined\", {\n type: \"experiment\",\n subtype: \"definition\",\n ...definition,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Assigns a user to a variant.\n *\n * This operation records assignment.\n * Assignment should occur before exposure tracking.\n *\n * @param config - Assignment configuration\n * @returns Promise resolving to ExperimentResponse\n *\n * @notes\n * - Assignment does not imply exposure.\n * - Exposure must be tracked separately when the variant is rendered.\n */\n async assign(config: ExperimentAssignmentConfig): Promise<ExperimentResponse> {\n return await this.init(\"experiment_assigned\", {\n type: \"experiment\",\n subtype: \"assignment\",\n experimentId: config.experimentId,\n userId: config.userId,\n variantId: config.variantId,\n source: config.source || \"random\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Records a conversion event for an experiment.\n *\n * Conversion events are attributed to the user's assigned variant.\n * Supports primary and secondary metrics.\n *\n * @param config - Conversion configuration\n * @returns Promise resolving to ExperimentResponse\n *\n * @statistical_impact\n * Conversion data directly affects:\n * - Conversion rate calculations\n * - Variant improvement %\n * - Confidence intervals\n * - Statistical significance evaluation\n */\n async trackConversion(config: ExperimentConversionConfig): Promise<ExperimentResponse> {\n return await this.init(\"experiment_conversion\", {\n type: \"experiment\",\n subtype: \"conversion\",\n experimentId: config.experimentId,\n userId: config.userId,\n variantId: config.variantId,\n metricName: config.metricName,\n value: config.value,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Records that a user was exposed to a variant.\n *\n * Exposure tracking is required for valid experiment analysis.\n * This ensures participants are counted correctly.\n *\n * @param experimentId - Experiment identifier\n * @param userId - Unique user identifier\n * @param variantId - Assigned variant identifier\n * @returns Promise resolving to ExperimentResponse\n *\n * @important\n * Exposure must only be tracked once per user per experiment.\n * Duplicate exposures may inflate participant counts.\n */\n async trackExposure(\n experimentId: string,\n userId: string,\n variantId: string\n ): Promise<ExperimentResponse> {\n return await this.init(\"experiment_exposure\", {\n type: \"experiment\",\n subtype: \"exposure\",\n experimentId,\n userId,\n variantId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves statistical results for an experiment.\n *\n * No experiment state is modified.\n *\n * @param experimentId - Experiment identifier\n * @returns Promise resolving to ExperimentResultsData\n *\n * @returns_data\n * - Variant performance metrics\n * - Conversion rates\n * - Improvement vs control\n * - Statistical significance flags\n * - Confidence levels\n * - Recommendation engine output\n */\n async getResults(experimentId: string): Promise<ExperimentResultsData> {\n return await this.init(\"get_experiment_results\", {\n type: \"query\",\n experimentId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets experiment analytics overview.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to experiment analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<ExperimentAnalyticsData> {\n return await this.init(\"get_experiment_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves the variant assigned to a user for a specific experiment.\n *\n * @param experimentId - Experiment identifier\n * @param userId - Unique user identifier\n * @returns Promise resolving to VariantResponse, or null if no variant is assigned\n */\n async getVariant(experimentId: string, userId: string): Promise<VariantResponse | null> {\n const response = await this.init(\"get_experiment_variant\", {\n type: \"query\",\n experimentId,\n userId,\n timestamp: new Date().toISOString()\n }) as VariantResponse | null;\n\n return response;\n }\n\n}\n\nexport default Experiment;\n","/**\n * @fileoverview Core - Feature Flags\n * @module features/core/feature-flag\n * \n * @description\n * Track feature flag evaluations and usage to understand\n * rollout progress and flag performance.\n * \n * @useCases\n * - Track flag evaluations\n * - Monitor rollout progress\n * - Analyze flag impact\n * - Debug flag configurations\n * - Measure gradual rollouts\n * \n * @metrics\n * - Evaluations per flag\n * - Unique users per variant\n * - Rollout percentage\n * - Error rate\n * - Flag age\n * \n * @chartData\n * - Pie chart: Users by variant\n * - Line chart: Evaluations over time\n * - Table: Active flags summary\n * - Bar chart: Top evaluated flags\n * \n * @example\n * ```typescript\n * const featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n * \n * await featureFlag.evaluate({\n * eventName: 'new_dashboard',\n * properties: { userId: 'user_123', result: true }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Base feature flag configuration.\n */\nexport interface FlagConfig {\n /** Flag name/event */\n eventName: string;\n /** Evaluation properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * Feature flag definition.\n */\nexport interface FlagDefinition {\n /** Flag key */\n flagKey: string;\n /** Flag name */\n name: string;\n /** Description */\n description?: string;\n /** Flag type */\n type: 'boolean' | 'string' | 'number' | 'json';\n /** Default value */\n defaultValue: boolean | string | number | Record<string, unknown>;\n /** Variants (for multivariate flags) */\n variants?: Array<{\n key: string;\n value: boolean | string | number | Record<string, unknown>;\n weight?: number;\n }>;\n /** Targeting rules */\n targeting?: {\n rules: Array<{\n attribute: string;\n operator: 'equals' | 'contains' | 'in' | 'gt' | 'lt';\n value: unknown;\n variant: string;\n }>;\n };\n /** Rollout percentage (0-100) */\n rolloutPercentage?: number;\n}\n\n/**\n * Flag evaluation configuration.\n */\nexport interface FlagEvaluationConfig {\n /** Flag key */\n flagKey: string;\n /** User ID */\n userId?: string;\n /** Evaluation context */\n context?: Record<string, unknown>;\n /** Evaluated variant/value */\n result: boolean | string | number | Record<string, unknown>;\n /** Reason for evaluation result */\n reason?: 'default' | 'targeting' | 'rollout' | 'override' | 'error';\n /** Evaluation duration (ms) */\n duration?: number;\n}\n\n/**\n * Feature flag response.\n */\nexport interface FlagResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n flagKey?: string;\n };\n timestamp: string;\n}\n\n/**\n * Single flag analytics.\n */\nexport interface FlagAnalyticsData {\n /** Flag info */\n flag: {\n flagKey: string;\n name: string;\n type: string;\n status: 'active' | 'inactive' | 'archived';\n createdAt: string;\n lastModified: string;\n };\n /** Evaluation stats */\n evaluations: {\n total: number;\n uniqueUsers: number;\n avgDuration: number;\n errorRate: number;\n };\n /** Results by variant */\n byVariant: Array<{\n variant: string;\n evaluations: number;\n uniqueUsers: number;\n percentage: number;\n }>;\n /** Results by reason */\n byReason: Record<string, number>;\n /** Trends */\n trends: TimeSeriesData;\n}\n\n/**\n * All flags analytics.\n */\nexport interface AllFlagsAnalyticsData {\n /** Summary */\n summary: {\n totalFlags: number;\n activeFlags: number;\n totalEvaluations: number;\n uniqueUsers: number;\n avgEvaluationsPerUser: number;\n };\n /** Top flags by evaluations */\n topFlags: Array<{\n flagKey: string;\n name: string;\n evaluations: number;\n uniqueUsers: number;\n rolloutPercentage: number;\n }>;\n /** Stale flags (not evaluated recently) */\n staleFlags: Array<{\n flagKey: string;\n name: string;\n lastEvaluated: string;\n daysSinceEvaluation: number;\n }>;\n /** Flags by status */\n byStatus: {\n active: number;\n inactive: number;\n archived: number;\n };\n}\n\n// ============================================================================\n// FEATURE FLAG CLASS\n// ============================================================================\n\n/**\n * FeatureFlag - Track feature flag evaluations.\n * \n * @extends FTRPC\n * \n * @description\n * Provides feature flag tracking including:\n * - Flag evaluations\n * - Rollout monitoring\n * - Flag definitions\n * - Usage analytics\n * - Stale flag detection\n * \n * @example\n * ```typescript\n * const featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n * \n * // Track evaluation\n * await featureFlag.trackEvaluation({\n * flagKey: 'new_checkout',\n * userId: 'user_123',\n * result: true,\n * reason: 'rollout'\n * });\n * \n * // Get flag analytics\n * const analytics = await featureFlag.getFlagAnalytics('new_checkout');\n * console.log(`${analytics.evaluations.total} evaluations`);\n * ```\n */\nexport class FeatureFlag extends FTRPC {\n /**\n * Evaluates and tracks a feature flag.\n * \n * @param config - Flag configuration\n * @returns Promise resolving to flag response\n */\n async evaluate(config: FlagConfig): Promise<FlagResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"feature_flag_evaluation\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a flag evaluation with details.\n * \n * @param config - Flag evaluation configuration\n * @returns Promise resolving to flag response\n */\n async trackEvaluation(config: FlagEvaluationConfig): Promise<FlagResponse> {\n return await this.init(\"flag_evaluated\", {\n type: \"feature_flag_evaluation\",\n flagKey: config.flagKey,\n userId: config.userId,\n context: config.context,\n result: config.result,\n reason: config.reason || \"default\",\n duration: config.duration,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Defines/updates a feature flag.\n * \n * @param definition - Flag definition\n * @returns Promise resolving to flag response\n */\n async define(definition: FlagDefinition): Promise<FlagResponse> {\n return await this.init(\"flag_defined\", {\n ...definition,\n type: \"feature_flag_definition\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks flag status change (enable/disable).\n * \n * @param flagKey - Flag key\n * @param enabled - Whether flag is enabled\n * @param changedBy - User who made the change\n * @returns Promise resolving to flag response\n */\n async trackStatusChange(\n flagKey: string,\n enabled: boolean,\n changedBy?: string\n ): Promise<FlagResponse> {\n return await this.init(\"flag_status_changed\", {\n type: \"feature_flag_status\",\n flagKey,\n enabled,\n changedBy,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks rollout percentage change.\n * \n * @param flagKey - Flag key\n * @param previousPercentage - Previous rollout %\n * @param newPercentage - New rollout %\n * @param changedBy - User who made the change\n * @returns Promise resolving to flag response\n */\n async trackRolloutChange(\n flagKey: string,\n previousPercentage: number,\n newPercentage: number,\n changedBy?: string\n ): Promise<FlagResponse> {\n return await this.init(\"flag_rollout_changed\", {\n type: \"feature_flag_rollout\",\n flagKey,\n previousPercentage,\n newPercentage,\n changedBy,\n timestamp: new Date().toISOString()\n });\n }\n \n}\n\nexport default FeatureFlag;\n","/**\n * @fileoverview Product Analytics - Page View Tracking\n * @module features/analytics/page-views\n * \n * @description\n * Track page views with rich context including scroll depth, time on page,\n * referrer information, and user engagement signals.\n * \n * @useCases\n * - Track which pages users visit most frequently\n * - Measure time spent on content pages\n * - Identify high bounce rate pages\n * - Analyze user navigation patterns\n * - Monitor landing page performance\n * \n * @metrics\n * - Total page views\n * - Unique page views \n * - Average time on page\n * - Bounce rate by page\n * - Scroll depth distribution\n * - Entry/exit page analysis\n * \n * @chartData\n * - Line chart: Page views over time\n * - Bar chart: Top pages by views\n * - Heatmap: Scroll depth by page\n * - Funnel: Page flow analysis\n * \n * @example\n * ```typescript\n * const pageViews = new PageViews(webId, endpoint, apiKey);\n * \n * // Track a page view\n * await pageViews.track({\n * url: window.location.href,\n * path: window.location.pathname,\n * title: document.title,\n * referrer: document.referrer\n * });\n * \n * // Track with scroll depth\n * await pageViews.trackScrollDepth({\n * path: '/blog/article-1',\n * scrollDepth: 75\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n PageView, \n TrafficMetrics, \n TimeSeriesData, \n ChartDataPoint,\n DateRangeFilter,\n PaginationParams \n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a page view.\n */\nexport interface PageViewConfig {\n /** Full page URL */\n url: string;\n /** Page path (without domain) */\n path: string;\n /** Page title */\n title?: string;\n /** Referrer URL */\n referrer?: string;\n /** User ID (if authenticated) */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking scroll depth.\n */\nexport interface ScrollDepthConfig {\n /** Page path */\n path: string;\n /** Scroll depth percentage (0-100) */\n scrollDepth: number;\n /** Time at this depth (seconds) */\n timeAtDepth?: number;\n}\n\n/**\n * Configuration for tracking time on page.\n */\nexport interface TimeOnPageConfig {\n /** Page path */\n path: string;\n /** Time spent in seconds */\n duration: number;\n /** Whether user engaged (scrolled, clicked, etc.) */\n engaged?: boolean;\n}\n\n/**\n * Page view response from API.\n */\nexport interface PageViewResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n pageViewId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Page analytics data for charts.\n */\nexport interface PageAnalyticsData {\n /** Top pages */\n topPages: Array<{\n path: string;\n title: string;\n views: number;\n uniqueViews: number;\n avgTimeOnPage: number;\n bounceRate: number;\n }>;\n /** Page views time series */\n timeSeries: TimeSeriesData;\n /** Summary metrics */\n summary: {\n totalPageViews: number;\n uniquePageViews: number;\n avgTimeOnPage: number;\n avgScrollDepth: number;\n bounceRate: number;\n };\n}\n\n// ============================================================================\n// PAGE VIEWS CLASS\n// ============================================================================\n\n/**\n * PageViews - Track and analyze page view events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides comprehensive page view tracking with support for:\n * - Basic page view events\n * - Scroll depth tracking\n * - Time on page measurement\n * - Exit intent detection\n * - Page engagement scoring\n * \n * @example\n * ```typescript\n * const pageViews = new PageViews(webId, endpoint, apiKey);\n * \n * // Basic page view\n * await pageViews.track({\n * url: 'https://example.com/products',\n * path: '/products',\n * title: 'Our Products'\n * });\n * \n * // Pull analytics data for charts\n * const analytics = await pageViews.getAnalytics({\n * range: 'last30days'\n * });\n * \n * // Data ready for charting\n * const chartData = analytics.timeSeries.data.map(d => ({\n * x: d.label,\n * y: d.value\n * }));\n * ```\n */\nexport class PageViews extends FTRPC {\n /**\n * Tracks a page view event.\n * \n * @param config - Page view configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * await pageViews.track({\n * url: window.location.href,\n * path: window.location.pathname,\n * title: document.title\n * });\n * ```\n */\n async track(config: PageViewConfig): Promise<PageViewResponse> {\n return await this.init(\"page_view\", {\n type: \"page_view\",\n url: config.url,\n path: config.path,\n title: config.title || \"\",\n referrer: config.referrer || \"\",\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks scroll depth on a page.\n * \n * @param config - Scroll depth configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * // Track when user scrolls to 50%\n * await pageViews.trackScrollDepth({\n * path: '/article/how-to-guide',\n * scrollDepth: 50\n * });\n * ```\n */\n async trackScrollDepth(config: ScrollDepthConfig): Promise<PageViewResponse> {\n return await this.init(\"scroll_depth\", {\n type: \"scroll_depth\",\n path: config.path,\n scrollDepth: Math.min(100, Math.max(0, config.scrollDepth)),\n timeAtDepth: config.timeAtDepth,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks time spent on a page.\n * \n * @param config - Time on page configuration\n * @returns Promise resolving to the API response\n * \n * @example\n * ```typescript\n * // Track on page unload\n * window.addEventListener('beforeunload', () => {\n * pageViews.trackTimeOnPage({\n * path: '/pricing',\n * duration: 45,\n * engaged: true\n * });\n * });\n * ```\n */\n async trackTimeOnPage(config: TimeOnPageConfig): Promise<PageViewResponse> {\n return await this.init(\"time_on_page\", {\n type: \"time_on_page\",\n path: config.path,\n duration: config.duration,\n engaged: config.engaged ?? false,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a page exit event.\n * \n * @param path - Page path being exited\n * @param duration - Time spent on page\n * @param scrollDepth - Final scroll depth\n * @returns Promise resolving to the API response\n */\n async trackExit(\n path: string, \n duration: number, \n scrollDepth: number\n ): Promise<PageViewResponse> {\n return await this.init(\"page_exit\", {\n type: \"page_exit\",\n path,\n duration,\n scrollDepth,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves page analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to analytics data\n * \n * @example\n * ```typescript\n * const analytics = await pageViews.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // Use for line chart\n * const lineData = analytics.timeSeries.data;\n * \n * // Use for bar chart\n * const barData = analytics.topPages.map(p => ({\n * label: p.path,\n * value: p.views\n * }));\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<PageAnalyticsData> {\n return await this.init(\"get_page_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default PageViews;\n","/**\n * @fileoverview Product Analytics - Session Tracking\n * @module features/analytics/sessions\n * \n * @description\n * Track user sessions with comprehensive context including device info,\n * geographic location, traffic source, and engagement metrics.\n * \n * @useCases\n * - Monitor active user sessions in real-time\n * - Analyze session duration and depth\n * - Track user journey across pages\n * - Identify traffic sources and campaigns\n * - Segment users by device and location\n * \n * @metrics\n * - Total sessions\n * - Unique visitors\n * - Average session duration\n * - Pages per session\n * - Bounce rate\n * - New vs returning visitors\n * \n * @chartData\n * - Line chart: Sessions over time\n * - Pie chart: Traffic source breakdown\n * - Bar chart: Sessions by device type\n * - Geo map: Sessions by country\n * \n * @example\n * ```typescript\n * const sessions = new Sessions(webId, endpoint, apiKey);\n * \n * // Start a new session\n * const session = await sessions.start({\n * userId: 'user_123',\n * device: { type: 'desktop', browser: 'Chrome' },\n * source: 'google',\n * medium: 'organic'\n * });\n * \n * // End session\n * await sessions.end(session.sessionId);\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Session,\n DeviceInfo, \n GeoLocation, \n UTMParams,\n TrafficMetrics,\n TimeSeriesData,\n DateRangeFilter,\n PaginationParams,\n UserIdentity\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for starting a new session.\n */\nexport interface SessionStartConfig {\n /** User identity */\n user?: UserIdentity;\n /** Device information */\n device?: DeviceInfo;\n /** Geographic location */\n location?: GeoLocation;\n /** Traffic source */\n source?: string;\n /** Traffic medium */\n medium?: string;\n /** Campaign name */\n campaign?: string;\n /** UTM parameters */\n utm?: UTMParams;\n /** Landing page URL */\n landingPage?: string;\n /** Referrer URL */\n referrer?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Session response from API.\n */\nexport interface SessionResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n sessionId: string;\n started: boolean;\n isNewVisitor: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Session end response.\n */\nexport interface SessionEndResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n sessionId: string;\n duration: number;\n pageViews: number;\n eventCount: number;\n };\n timestamp: string;\n}\n\n/**\n * Session analytics data for charts.\n */\nexport interface SessionAnalyticsData {\n /** Summary metrics */\n summary: {\n totalSessions: number;\n uniqueVisitors: number;\n newVisitors: number;\n returningVisitors: number;\n avgSessionDuration: number;\n avgPagesPerSession: number;\n bounceRate: number;\n };\n /** Sessions time series */\n timeSeries: TimeSeriesData;\n /** Sessions by source */\n bySource: Array<{\n source: string;\n sessions: number;\n percentage: number;\n }>;\n /** Sessions by device */\n byDevice: Array<{\n device: string;\n sessions: number;\n percentage: number;\n }>;\n /** Sessions by country */\n byCountry: Array<{\n country: string;\n countryCode: string;\n sessions: number;\n }>;\n}\n\n/**\n * Real-time session data.\n */\nexport interface RealTimeSessionData {\n /** Currently active sessions */\n activeSessions: number;\n /** Active users in last 5 minutes */\n activeUsers5min: number;\n /** Active users in last 30 minutes */\n activeUsers30min: number;\n /** Sessions by page (real-time) */\n sessionsByPage: Array<{ path: string; count: number }>;\n /** Sessions by country (real-time) */\n sessionsByCountry: Array<{ country: string; count: number }>;\n}\n\n// ============================================================================\n// SESSIONS CLASS\n// ============================================================================\n\n/**\n * Sessions - Track and analyze user sessions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides comprehensive session tracking including:\n * - Session lifecycle (start, update, end)\n * - Device and location tracking\n * - Traffic source attribution\n * - Real-time session monitoring\n * - Session replay triggers\n * \n * @example\n * ```typescript\n * const sessions = new Sessions(webId, endpoint, apiKey);\n * \n * // Start session on page load\n * const session = await sessions.start({\n * user: { userId: 'user_123' },\n * device: { type: 'mobile', os: 'iOS' },\n * source: 'email',\n * campaign: 'summer_sale'\n * });\n * \n * // Get real-time data\n * const realTime = await sessions.getRealTime();\n * console.log(`${realTime.activeSessions} users online`);\n * ```\n */\nexport class Sessions extends FTRPC {\n /**\n * Starts a new user session.\n * \n * @param config - Session configuration\n * @returns Promise resolving to session response with sessionId\n * \n * @example\n * ```typescript\n * const session = await sessions.start({\n * user: { userId: 'user_123' },\n * source: 'google',\n * medium: 'cpc',\n * campaign: 'brand_terms'\n * });\n * localStorage.setItem('sessionId', session.response.sessionId);\n * ```\n */\n async start(config: SessionStartConfig = {}): Promise<SessionResponse> {\n return await this.init(\"session_start\", {\n type: \"session_start\",\n user: config.user,\n device: config.device,\n location: config.location,\n source: config.source || config.utm?.utmSource,\n medium: config.medium || config.utm?.utmMedium,\n campaign: config.campaign || config.utm?.utmCampaign,\n utm: config.utm,\n landingPage: config.landingPage || (typeof window !== 'undefined' ? window.location.href : ''),\n referrer: config.referrer || (typeof document !== 'undefined' ? document.referrer : ''),\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates an existing session with new data.\n * \n * @param sessionId - Session identifier\n * @param properties - Properties to update\n * @returns Promise resolving to update response\n */\n async update(\n sessionId: string, \n properties: Record<string, unknown>\n ): Promise<SessionResponse> {\n return await this.init(\"session_update\", {\n type: \"session_update\",\n sessionId,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Ends a user session.\n * \n * @param sessionId - Session identifier to end\n * @returns Promise resolving to session end response with metrics\n * \n * @example\n * ```typescript\n * window.addEventListener('beforeunload', async () => {\n * const sessionId = localStorage.getItem('sessionId');\n * if (sessionId) {\n * await sessions.end(sessionId);\n * }\n * });\n * ```\n */\n async end(sessionId: string): Promise<SessionEndResponse> {\n return await this.init(\"session_end\", {\n type: \"session_end\",\n sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a heartbeat to keep session alive.\n * \n * @param sessionId - Session identifier\n * @returns Promise resolving to heartbeat response\n */\n async heartbeat(sessionId: string): Promise<SessionResponse> {\n return await this.init(\"session_heartbeat\", {\n type: \"session_heartbeat\",\n sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves session analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to session analytics\n * \n * @example\n * ```typescript\n * const analytics = await sessions.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // For pie chart - traffic sources\n * const sourceData = analytics.bySource.map(s => ({\n * name: s.source,\n * value: s.sessions\n * }));\n * \n * // For line chart - sessions over time\n * const trendData = analytics.timeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<SessionAnalyticsData> {\n return await this.init(\"get_session_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets real-time session data for live dashboards.\n * \n * @returns Promise resolving to real-time session data\n * \n * @example\n * ```typescript\n * // Poll for real-time updates\n * setInterval(async () => {\n * const realTime = await sessions.getRealTime();\n * updateDashboard(realTime.activeSessions);\n * }, 10000);\n * ```\n */\n async getRealTime(): Promise<RealTimeSessionData> {\n return await this.init(\"get_realtime_sessions\", {\n type: \"query\",\n realtime: true,\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Sessions;\n","/**\n * @fileoverview Product Analytics - Custom Event Tracking\n * @module features/analytics/events\n * \n * @description\n * Track custom events with flexible properties for any user action\n * or system event. Supports categorization, value tracking, and batching.\n * \n * @useCases\n * - Track button clicks and CTA interactions\n * - Monitor feature usage and engagement\n * - Capture form submissions and errors\n * - Log search queries and results\n * - Record video/audio playback events\n * \n * @metrics\n * - Event counts by type\n * - Event trends over time\n * - Unique users per event\n * - Event value aggregations\n * - Event-to-conversion correlation\n * \n * @chartData\n * - Bar chart: Top events by count\n * - Line chart: Event trends over time\n * - Heatmap: Events by hour/day\n * - Sankey: Event flow paths\n * \n * @example\n * ```typescript\n * const events = new Events(webId, endpoint, apiKey);\n * \n * // Track a button click\n * await events.track({\n * eventName: 'cta_clicked',\n * category: 'engagement',\n * action: 'click',\n * label: 'signup_hero'\n * });\n * \n * // Track with value\n * await events.track({\n * eventName: 'video_watched',\n * value: 120, // seconds\n * properties: { videoId: 'intro-video' }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n CustomEvent,\n ClickEvent,\n FormEvent,\n SearchEvent,\n ErrorEvent,\n TimeSeriesData,\n DateRangeFilter,\n PaginationParams,\n ChartDataPoint\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a custom event.\n */\nexport interface EventTrackConfig {\n /** Event name (required) */\n eventName: string;\n /** Event category for grouping */\n category?: string;\n /** Event action */\n action?: string;\n /** Event label for sub-categorization */\n label?: string;\n /** Numeric value associated with event */\n value?: number;\n /** Non-interactive event (won't affect bounce rate) */\n nonInteraction?: boolean;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Batch event tracking configuration.\n */\nexport interface BatchEventConfig {\n /** Array of events to track */\n events: EventTrackConfig[];\n}\n\n/**\n * Event response from API.\n */\nexport interface EventResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n eventId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Batch event response.\n */\nexport interface BatchEventResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: number;\n failed: number;\n eventIds: string[];\n };\n timestamp: string;\n}\n\n/**\n * Event analytics data for charts.\n */\nexport interface EventAnalyticsData {\n /** Top events by count */\n topEvents: Array<{\n eventName: string;\n category: string;\n count: number;\n uniqueUsers: number;\n totalValue: number;\n }>;\n /** Events time series */\n timeSeries: TimeSeriesData;\n /** Events by category */\n byCategory: Array<{\n category: string;\n count: number;\n percentage: number;\n }>;\n /** Summary metrics */\n summary: {\n totalEvents: number;\n uniqueEventTypes: number;\n eventsPerUser: number;\n totalValue: number;\n };\n}\n\n// ============================================================================\n// EVENTS CLASS\n// ============================================================================\n\n/**\n * Events - Track and analyze custom events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides flexible custom event tracking including:\n * - Standard event tracking with categories\n * - Click and interaction tracking\n * - Form submission tracking\n * - Search event tracking\n * - Error and exception logging\n * - Batch event submission\n * \n * @example\n * ```typescript\n * const events = new Events(webId, endpoint, apiKey);\n * \n * // Track feature usage\n * await events.track({\n * eventName: 'feature_used',\n * category: 'features',\n * action: 'use',\n * label: 'export_pdf',\n * properties: { format: 'A4', pages: 5 }\n * });\n * \n * // Get event analytics\n * const analytics = await events.getAnalytics({ range: 'last7days' });\n * ```\n */\nexport class Events extends FTRPC {\n /**\n * Tracks a custom event.\n * \n * @param config - Event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * await events.track({\n * eventName: 'upgrade_clicked',\n * category: 'monetization',\n * action: 'click',\n * label: 'pricing_page',\n * value: 99.99\n * });\n * ```\n */\n async track(config: EventTrackConfig): Promise<EventResponse> {\n return await this.init(\"custom_event\", {\n type: \"custom_event\",\n eventName: config.eventName,\n category: config.category || \"general\",\n action: config.action,\n label: config.label,\n value: config.value,\n nonInteraction: config.nonInteraction || false,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks multiple events in a single request.\n * \n * @param config - Batch configuration with events array\n * @returns Promise resolving to batch response\n * \n * @example\n * ```typescript\n * await events.trackBatch({\n * events: [\n * { eventName: 'step_1_complete', category: 'onboarding' },\n * { eventName: 'step_2_complete', category: 'onboarding' },\n * { eventName: 'step_3_complete', category: 'onboarding' }\n * ]\n * });\n * ```\n */\n async trackBatch(config: BatchEventConfig): Promise<BatchEventResponse> {\n const events = config.events.map(e => ({\n ...e,\n timestamp: new Date().toISOString()\n }));\n\n return await this.init(\"batch_events\", {\n type: \"batch_events\",\n events,\n count: events.length,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a click/interaction event.\n * \n * @param config - Click event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * document.addEventListener('click', (e) => {\n * if (e.target.dataset.track) {\n * events.trackClick({\n * elementId: e.target.id,\n * elementText: e.target.textContent,\n * targetUrl: e.target.href\n * });\n * }\n * });\n * ```\n */\n async trackClick(config: ClickEvent): Promise<EventResponse> {\n return await this.init(\"click_event\", {\n type: \"click_event\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a form submission event.\n * \n * @param config - Form event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * form.addEventListener('submit', async (e) => {\n * await events.trackForm({\n * formId: 'contact-form',\n * formName: 'Contact Us',\n * success: true,\n * fields: ['name', 'email', 'message'],\n * completionTime: 45\n * });\n * });\n * ```\n */\n async trackForm(config: FormEvent): Promise<EventResponse> {\n return await this.init(\"form_event\", {\n type: \"form_event\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a search event.\n * \n * @param config - Search event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * await events.trackSearch({\n * query: 'wireless headphones',\n * category: 'products',\n * resultsCount: 42,\n * filters: { brand: 'Sony', priceRange: '100-200' }\n * });\n * ```\n */\n async trackSearch(config: SearchEvent): Promise<EventResponse> {\n return await this.init(\"search_event\", {\n type: \"search_event\",\n query: config.query,\n category: config.category,\n resultsCount: config.resultsCount,\n resultClicked: config.resultClicked,\n clickedPosition: config.clickedPosition,\n filters: config.filters,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks an error or exception.\n * \n * @param config - Error event configuration\n * @returns Promise resolving to event response\n * \n * @example\n * ```typescript\n * window.onerror = (message, source, line, col, error) => {\n * events.trackError({\n * message: message.toString(),\n * stack: error?.stack,\n * type: error?.name,\n * fatal: false,\n * context: source\n * });\n * };\n * ```\n */\n async trackError(config: ErrorEvent): Promise<EventResponse> {\n return await this.init(\"error_event\", {\n type: \"error_event\",\n message: config.message,\n stack: config.stack,\n errorType: config.type,\n fatal: config.fatal || false,\n context: config.context,\n userAction: config.userAction,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves event analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to event analytics\n * \n * @example\n * ```typescript\n * const analytics = await events.getAnalytics({ \n * range: 'last7days' \n * });\n * \n * // Bar chart data - top events\n * const barData = analytics.topEvents.map(e => ({\n * x: e.eventName,\n * y: e.count\n * }));\n * \n * // Line chart - events over time\n * const lineData = analytics.timeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<EventAnalyticsData> {\n return await this.init(\"get_event_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 50 },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Events;\n","/**\n * @fileoverview Product Analytics - User Identification & Traits\n * @module features/analytics/identify\n * \n * @description\n * Identify users and track their traits for personalization,\n * segmentation, and cohort analysis.\n * \n * @useCases\n * - Link anonymous sessions to authenticated users\n * - Store user profile data for segmentation\n * - Track user lifecycle changes (signup, upgrade, churn)\n * - Enable personalized experiences\n * - Build user cohorts for analysis\n * \n * @metrics\n * - Total identified users\n * - Anonymous to identified conversion rate\n * - Users by plan/segment\n * - User lifetime value distribution\n * - Trait distribution\n * \n * @chartData\n * - Pie chart: Users by plan\n * - Bar chart: Users by trait value\n * - Line chart: New identifications over time\n * - Table: User segments\n * \n * @example\n * ```typescript\n * const identify = new Identify(webId, endpoint, apiKey);\n * \n * // Identify user on login\n * await identify.user({\n * userId: 'user_123',\n * traits: {\n * email: 'user@example.com',\n * name: 'John Doe',\n * plan: 'premium',\n * createdAt: '2025-01-15'\n * }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n UserIdentity,\n UserTraits,\n MoneyValue,\n DateRangeFilter,\n PaginationParams,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for identifying a user.\n */\nexport interface IdentifyConfig {\n /** Unique user identifier */\n userId: string;\n /** Anonymous ID to link (optional) */\n anonymousId?: string;\n /** User traits/properties */\n traits?: UserTraits;\n}\n\n/**\n * Configuration for aliasing user IDs.\n */\nexport interface AliasConfig {\n /** Previous user ID */\n previousId: string;\n /** New user ID */\n userId: string;\n}\n\n/**\n * Configuration for grouping users.\n */\nexport interface GroupConfig {\n /** User ID */\n userId: string;\n /** Group/company ID */\n groupId: string;\n /** Group traits */\n traits?: {\n name?: string;\n industry?: string;\n employees?: number;\n plan?: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Identify response from API.\n */\nexport interface IdentifyResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n userId: string;\n identified: boolean;\n isNewUser: boolean;\n linkedAnonymousId?: string;\n };\n timestamp: string;\n}\n\n/**\n * User analytics data for charts.\n */\nexport interface UserAnalyticsData {\n /** Summary metrics */\n summary: {\n totalUsers: number;\n identifiedUsers: number;\n anonymousUsers: number;\n newUsersThisPeriod: number;\n identificationRate: number;\n };\n /** Users by plan/segment */\n byPlan: Array<{\n plan: string;\n count: number;\n percentage: number;\n mrr?: MoneyValue;\n }>;\n /** New users time series */\n newUsersTimeSeries: TimeSeriesData;\n /** User lifecycle distribution */\n byLifecycleStage: Array<{\n stage: string;\n count: number;\n percentage: number;\n }>;\n}\n\n// ============================================================================\n// IDENTIFY CLASS\n// ============================================================================\n\n/**\n * Identify - User identification and trait management.\n * \n * @extends FTRPC\n * \n * @description\n * Provides user identification capabilities including:\n * - User identification on login/signup\n * - Anonymous to identified user linking\n * - User trait/property storage\n * - User aliasing for ID changes\n * - Group/company association\n * \n * @example\n * ```typescript\n * const identify = new Identify(webId, endpoint, apiKey);\n * \n * // On user signup\n * await identify.user({\n * userId: 'user_123',\n * anonymousId: getAnonymousId(),\n * traits: {\n * email: 'user@example.com',\n * name: 'Jane Smith',\n * plan: 'starter',\n * createdAt: new Date().toISOString()\n * }\n * });\n * \n * // Associate user with company\n * await identify.group({\n * userId: 'user_123',\n * groupId: 'company_456',\n * traits: { name: 'Acme Inc', employees: 50 }\n * });\n * ```\n */\nexport class Identify extends FTRPC {\n /**\n * Identifies a user with traits.\n * \n * @param config - Identification configuration\n * @returns Promise resolving to identify response\n * \n * @example\n * ```typescript\n * // Basic identification\n * await identify.user({\n * userId: 'user_123',\n * traits: { email: 'user@example.com' }\n * });\n * \n * // With anonymous ID linking\n * await identify.user({\n * userId: 'user_123',\n * anonymousId: localStorage.getItem('anonId'),\n * traits: {\n * name: 'John Doe',\n * plan: 'premium',\n * ltv: { amount: 29900, currency: 'USD' }\n * }\n * });\n * ```\n */\n async user(config: IdentifyConfig): Promise<IdentifyResponse> {\n return await this.init(\"identify_user\", {\n type: \"identify\",\n userId: config.userId,\n anonymousId: config.anonymousId,\n traits: config.traits || {},\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates traits for an existing user.\n * \n * @param userId - User identifier\n * @param traits - Traits to update/add\n * @returns Promise resolving to identify response\n * \n * @example\n * ```typescript\n * // Update user plan after upgrade\n * await identify.updateTraits('user_123', {\n * plan: 'enterprise',\n * ltv: { amount: 99900, currency: 'USD' }\n * });\n * ```\n */\n async updateTraits(userId: string, traits: UserTraits): Promise<IdentifyResponse> {\n return await this.init(\"update_traits\", {\n type: \"update_traits\",\n userId,\n traits,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Creates an alias between two user IDs.\n * \n * @param config - Alias configuration\n * @returns Promise resolving to alias response\n * \n * @example\n * ```typescript\n * // When user ID changes (e.g., after migration)\n * await identify.alias({\n * previousId: 'old_user_id',\n * userId: 'new_user_id'\n * });\n * ```\n */\n async alias(config: AliasConfig): Promise<IdentifyResponse> {\n return await this.init(\"alias_user\", {\n type: \"alias\",\n previousId: config.previousId,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Associates a user with a group/company.\n * \n * @param config - Group configuration\n * @returns Promise resolving to group response\n * \n * @example\n * ```typescript\n * await identify.group({\n * userId: 'user_123',\n * groupId: 'company_456',\n * traits: {\n * name: 'Acme Corporation',\n * industry: 'Technology',\n * employees: 500,\n * plan: 'enterprise'\n * }\n * });\n * ```\n */\n async group(config: GroupConfig): Promise<IdentifyResponse> {\n return await this.init(\"group_user\", {\n type: \"group\",\n userId: config.userId,\n groupId: config.groupId,\n traits: config.traits || {},\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Resets user identity (logout).\n * \n * @param userId - User ID to reset\n * @returns Promise resolving to reset response\n */\n async reset(userId: string): Promise<IdentifyResponse> {\n return await this.init(\"reset_identity\", {\n type: \"reset\",\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves user analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to user analytics\n * \n * @example\n * ```typescript\n * const analytics = await identify.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Pie chart - users by plan\n * const planData = analytics.byPlan.map(p => ({\n * name: p.plan,\n * value: p.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<UserAnalyticsData> {\n return await this.init(\"get_user_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Identify;\n","/**\n * @fileoverview Ecommerce - Product Tracking\n * @module features/ecommerce/products\n * \n * @description\n * Track product interactions including views, impressions, clicks,\n * and product list interactions.\n * \n * @useCases\n * - Track product page views\n * - Measure product list/search impressions\n * - Analyze product click-through rates\n * - Monitor product detail engagement\n * - Compare product performance\n * \n * @metrics\n * - Product views\n * - Product impressions\n * - Click-through rate\n * - View-to-cart rate\n * - Revenue per product\n * \n * @chartData\n * - Bar chart: Top products by views\n * - Line chart: Product views over time\n * - Table: Product performance comparison\n * - Scatter: Price vs conversion rate\n * \n * @example\n * ```typescript\n * const products = new Products(webId, endpoint, apiKey);\n * \n * // Track product view\n * await products.view({\n * productId: 'SKU-123',\n * name: 'Premium Headphones',\n * price: 299.99,\n * currency: 'USD',\n * category: 'Electronics/Audio'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Product,\n ProductList,\n ProductPerformance,\n DateRangeFilter,\n PaginationParams,\n TimeSeriesData,\n CurrencyCode\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a product view.\n */\nexport interface ProductViewConfig extends Product {\n /** User ID (if authenticated) */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** How user arrived at product (search, category, recommendation) */\n source?: 'search' | 'category' | 'recommendation' | 'direct' | 'ad';\n /** Search query if from search */\n searchQuery?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking product impressions.\n */\nexport interface ProductImpressionConfig {\n /** List information */\n list: ProductList;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n}\n\n/**\n * Configuration for tracking product clicks.\n */\nexport interface ProductClickConfig {\n /** Product clicked */\n product: Product;\n /** List where product was clicked */\n listId?: string;\n /** Position in list */\n position?: number;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Product event response from API.\n */\nexport interface ProductResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n productId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Product analytics data for charts.\n */\nexport interface ProductAnalyticsData {\n /** Top products by various metrics */\n topProducts: {\n byViews: ProductPerformance[];\n byRevenue: ProductPerformance[];\n byConversion: ProductPerformance[];\n };\n /** Product views time series */\n viewsTimeSeries: TimeSeriesData;\n /** Summary metrics */\n summary: {\n totalProductViews: number;\n uniqueProductsViewed: number;\n avgViewsPerProduct: number;\n topCategory: string;\n topBrand: string;\n };\n /** Performance by category */\n byCategory: Array<{\n category: string;\n views: number;\n revenue: number;\n conversionRate: number;\n }>;\n}\n\n// ============================================================================\n// PRODUCTS CLASS\n// ============================================================================\n\n/**\n * Products - Track product interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides product tracking capabilities including:\n * - Product page views\n * - Product list impressions\n * - Product clicks from lists\n * - Product detail interactions\n * - Quick view tracking\n * \n * @example\n * ```typescript\n * const products = new Products(webId, endpoint, apiKey);\n * \n * // Track product page view\n * await products.view({\n * productId: 'PROD-001',\n * name: 'Wireless Earbuds',\n * price: 79.99,\n * currency: 'USD',\n * category: 'Electronics/Audio',\n * brand: 'AudioTech'\n * });\n * \n * // Track list impressions\n * await products.impression({\n * list: {\n * listId: 'search-results',\n * listName: 'Search Results',\n * products: searchResults\n * }\n * });\n * ```\n */\nexport class Products extends FTRPC {\n /**\n * Tracks a product page view.\n * \n * @param config - Product view configuration\n * @returns Promise resolving to product response\n * \n * @example\n * ```typescript\n * await products.view({\n * productId: 'SKU-12345',\n * name: 'Premium Widget',\n * price: 49.99,\n * currency: 'USD',\n * category: 'Widgets/Premium',\n * brand: 'WidgetCo',\n * source: 'search',\n * searchQuery: 'premium widget'\n * });\n * ```\n */\n async view(config: ProductViewConfig): Promise<ProductResponse> {\n return await this.init(\"product_view\", {\n type: \"ecommerce\",\n subtype: \"product_view\",\n product: {\n productId: config.productId,\n name: config.name,\n brand: config.brand,\n category: config.category,\n variant: config.variant,\n price: config.price,\n currency: config.currency,\n url: config.url,\n imageUrl: config.imageUrl,\n rating: config.rating,\n reviewCount: config.reviewCount,\n stockStatus: config.stockStatus,\n attributes: config.attributes\n },\n source: config.source,\n searchQuery: config.searchQuery,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks product list impressions.\n * \n * @param config - Impression configuration\n * @returns Promise resolving to impression response\n * \n * @example\n * ```typescript\n * // Track products shown in search results\n * await products.impression({\n * list: {\n * listId: 'search-results',\n * listName: 'Search Results',\n * products: products.map((p, i) => ({ ...p, position: i + 1 }))\n * }\n * });\n * ```\n */\n async impression(config: ProductImpressionConfig): Promise<ProductResponse> {\n return await this.init(\"product_impression\", {\n type: \"ecommerce\",\n subtype: \"product_impression\",\n list: config.list,\n productCount: config.list.products.length,\n userId: config.userId,\n sessionId: config.sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a product click from a list.\n * \n * @param config - Click configuration\n * @returns Promise resolving to click response\n * \n * @example\n * ```typescript\n * await products.click({\n * product: selectedProduct,\n * listId: 'homepage-featured',\n * position: 3\n * });\n * ```\n */\n async click(config: ProductClickConfig): Promise<ProductResponse> {\n return await this.init(\"product_click\", {\n type: \"ecommerce\",\n subtype: \"product_click\",\n product: config.product,\n listId: config.listId,\n position: config.position,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a quick view interaction (modal product view).\n * \n * @param product - Product being quick-viewed\n * @param listId - List where quick view was triggered\n * @returns Promise resolving to quick view response\n */\n async quickView(product: Product, listId?: string): Promise<ProductResponse> {\n return await this.init(\"product_quick_view\", {\n type: \"ecommerce\",\n subtype: \"product_quick_view\",\n product,\n listId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks product detail interaction (zoom, read reviews, etc.).\n * \n * @param productId - Product identifier\n * @param action - Interaction type\n * @param properties - Additional properties\n * @returns Promise resolving to interaction response\n */\n async interaction(\n productId: string,\n action: 'zoom' | 'read_reviews' | 'size_guide' | 'compare' | 'share' | 'notify_stock',\n properties?: Record<string, unknown>\n ): Promise<ProductResponse> {\n return await this.init(\"product_interaction\", {\n type: \"ecommerce\",\n subtype: \"product_interaction\",\n productId,\n action,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves product analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @param pagination - Pagination options\n * @returns Promise resolving to product analytics\n * \n * @example\n * ```typescript\n * const analytics = await products.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Bar chart - top products by views\n * const topByViews = analytics.topProducts.byViews.map(p => ({\n * name: p.product.name,\n * value: p.views\n * }));\n * \n * // Line chart - views over time\n * const viewsTrend = analytics.viewsTimeSeries.data;\n * ```\n */\n async getAnalytics(\n filter?: DateRangeFilter,\n pagination?: PaginationParams\n ): Promise<ProductAnalyticsData> {\n return await this.init(\"get_product_analytics\", {\n type: \"ecommerce\",\n subtype: \"get_product_analytics\",\n filter: filter || { range: \"last30days\" },\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets performance data for a specific product.\n * \n * @param productId - Product identifier\n * @param filter - Date range filter\n * @returns Promise resolving to product performance\n */\n async getProductPerformance(\n productId: string,\n filter?: DateRangeFilter\n ): Promise<ProductPerformance> {\n return await this.init(\"get_product_performance\", {\n type: \"ecommerce\",\n subtype: \"get_product_performance\",\n productId,\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Products;\n","/**\n * @fileoverview Ecommerce - Cart Tracking\n * @module features/ecommerce/cart\n * \n * @description\n * Track shopping cart interactions including add/remove items,\n * cart views, and cart abandonment.\n * \n * @useCases\n * - Track add to cart events\n * - Monitor cart modifications\n * - Detect cart abandonment\n * - Analyze popular cart items\n * - Measure cart value trends\n * \n * @metrics\n * - Add to cart rate\n * - Average cart value\n * - Cart abandonment rate\n * - Items per cart\n * - Cart-to-checkout rate\n * \n * @chartData\n * - Line chart: Cart value over time\n * - Bar chart: Top added products\n * - Pie chart: Abandonment reasons\n * - Funnel: Cart to checkout flow\n * \n * @example\n * ```typescript\n * const cart = new CartTracking(webId, endpoint, apiKey);\n * \n * // Track add to cart\n * await cart.addItem({\n * product: { productId: 'SKU-123', name: 'Widget', price: 29.99, currency: 'USD' },\n * quantity: 2,\n * cartId: 'cart_abc'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Product,\n Cart,\n CartItem,\n CartAnalytics,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for adding item to cart.\n */\nexport interface AddToCartConfig {\n /** Product being added */\n product: Product;\n /** Quantity to add */\n quantity: number;\n /** Cart identifier */\n cartId?: string;\n /** User ID */\n userId?: string;\n /** Source of add (product page, quick add, etc.) */\n source?: 'product_page' | 'quick_add' | 'wishlist' | 'recommendation' | 'reorder';\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for removing item from cart.\n */\nexport interface RemoveFromCartConfig {\n /** Product being removed */\n product: Product;\n /** Quantity to remove */\n quantity: number;\n /** Cart identifier */\n cartId?: string;\n /** User ID */\n userId?: string;\n /** Reason for removal */\n reason?: 'user_action' | 'out_of_stock' | 'price_change' | 'auto_expired';\n}\n\n/**\n * Configuration for updating cart item.\n */\nexport interface UpdateCartItemConfig {\n /** Product being updated */\n product: Product;\n /** Previous quantity */\n previousQuantity: number;\n /** New quantity */\n newQuantity: number;\n /** Cart identifier */\n cartId?: string;\n}\n\n/**\n * Configuration for cart view.\n */\nexport interface ViewCartConfig {\n /** Current cart state */\n cart: Cart;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Cart event response from API.\n */\nexport interface CartResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n cartId: string;\n tracked: boolean;\n cartValue: number;\n itemCount: number;\n };\n timestamp: string;\n}\n\n/**\n * Cart analytics data for charts.\n */\nexport interface CartAnalyticsData {\n /** Cart metrics summary */\n summary: {\n totalAddToCarts: number;\n totalRemoveFromCarts: number;\n averageCartValue: number;\n averageItemsPerCart: number;\n abandonmentRate: number;\n cartToCheckoutRate: number;\n };\n /** Add to cart trends */\n addToCartTimeSeries: TimeSeriesData;\n /** Top products added to cart */\n topAddedProducts: Array<{\n product: Pick<Product, 'productId' | 'name' | 'category'>;\n addCount: number;\n removeCount: number;\n netAdds: number;\n }>;\n /** Abandonment analysis */\n abandonment: {\n rate: number;\n avgAbandonedValue: number;\n topAbandonedProducts: Array<{\n product: Pick<Product, 'productId' | 'name'>;\n abandonCount: number;\n }>;\n };\n}\n\n// ============================================================================\n// CART TRACKING CLASS\n// ============================================================================\n\n/**\n * CartTracking - Track shopping cart interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides cart tracking capabilities including:\n * - Add to cart events\n * - Remove from cart events\n * - Cart quantity updates\n * - Cart view tracking\n * - Cart abandonment detection\n * \n * @example\n * ```typescript\n * const cart = new CartTracking(webId, endpoint, apiKey);\n * \n * // Track add to cart\n * await cart.addItem({\n * product: {\n * productId: 'PROD-001',\n * name: 'Widget Pro',\n * price: 99.99,\n * currency: 'USD'\n * },\n * quantity: 1,\n * source: 'product_page'\n * });\n * \n * // Track cart view\n * await cart.view({\n * cart: currentCart\n * });\n * ```\n */\nexport class CartTracking extends FTRPC {\n /**\n * Tracks adding an item to cart.\n * \n * @param config - Add to cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.addItem({\n * product: {\n * productId: 'SKU-123',\n * name: 'Premium Widget',\n * price: 49.99,\n * currency: 'USD',\n * category: 'Widgets'\n * },\n * quantity: 2,\n * source: 'product_page'\n * });\n * ```\n */\n async addItem(config: AddToCartConfig): Promise<CartResponse> {\n const lineTotal = config.product.price * config.quantity - (config.product.discount || 0);\n \n return await this.init(\"add_to_cart\", {\n type: \"ecommerce\",\n subtype: \"add_to_cart\",\n product: config.product,\n quantity: config.quantity,\n lineTotal,\n cartId: config.cartId,\n userId: config.userId,\n source: config.source,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks removing an item from cart.\n * \n * @param config - Remove from cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.removeItem({\n * product: productToRemove,\n * quantity: 1,\n * cartId: 'cart_123',\n * reason: 'user_action'\n * });\n * ```\n */\n async removeItem(config: RemoveFromCartConfig): Promise<CartResponse> {\n return await this.init(\"remove_from_cart\", {\n type: \"ecommerce\",\n subtype: \"remove_from_cart\",\n product: config.product,\n quantity: config.quantity,\n cartId: config.cartId,\n userId: config.userId,\n reason: config.reason || \"user_action\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks cart item quantity update.\n * \n * @param config - Update configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.updateItem({\n * product: item.product,\n * previousQuantity: 1,\n * newQuantity: 3,\n * cartId: 'cart_123'\n * });\n * ```\n */\n async updateItem(config: UpdateCartItemConfig): Promise<CartResponse> {\n return await this.init(\"update_cart_item\", {\n type: \"ecommerce\",\n subtype: \"update_cart_item\",\n product: config.product,\n previousQuantity: config.previousQuantity,\n newQuantity: config.newQuantity,\n quantityChange: config.newQuantity - config.previousQuantity,\n cartId: config.cartId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a cart view event.\n * \n * @param config - View cart configuration\n * @returns Promise resolving to cart response\n * \n * @example\n * ```typescript\n * await cart.view({\n * cart: {\n * cartId: 'cart_123',\n * items: cartItems,\n * subtotal: 149.97,\n * total: 164.97,\n * currency: 'USD',\n * itemCount: 3\n * }\n * });\n * ```\n */\n async view(config: ViewCartConfig): Promise<CartResponse> {\n return await this.init(\"view_cart\", {\n type: \"ecommerce\",\n subtype: \"view_cart\",\n cart: config.cart,\n cartValue: config.cart.total,\n itemCount: config.cart.itemCount,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks cart abandonment.\n * \n * @param cart - Abandoned cart state\n * @param reason - Abandonment reason (if known)\n * @returns Promise resolving to cart response\n */\n async abandon(\n cart: Cart,\n reason?: 'exit' | 'timeout' | 'price_too_high' | 'shipping_cost' | 'other'\n ): Promise<CartResponse> {\n return await this.init(\"cart_abandoned\", {\n type: \"ecommerce\",\n subtype: \"cart_abandoned\",\n cart,\n cartValue: cart.total,\n itemCount: cart.itemCount,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Applies a coupon to the cart.\n * \n * @param cartId - Cart identifier\n * @param couponCode - Coupon code applied\n * @param success - Whether coupon was valid\n * @param discount - Discount amount (if successful)\n * @returns Promise resolving to cart response\n */\n async applyCoupon(\n cartId: string,\n couponCode: string,\n success: boolean,\n discount?: number\n ): Promise<CartResponse> {\n return await this.init(\"apply_coupon\", {\n type: \"ecommerce\",\n subtype: \"apply_coupon\",\n cartId,\n couponCode,\n success,\n discount,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves cart analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to cart analytics\n * \n * @example\n * ```typescript\n * const analytics = await cart.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Line chart - add to cart over time\n * const trendData = analytics.addToCartTimeSeries.data;\n * \n * // Bar chart - top products added\n * const topProducts = analytics.topAddedProducts.map(p => ({\n * name: p.product.name,\n * value: p.addCount\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<CartAnalyticsData> {\n return await this.init(\"get_cart_analytics\", {\n type: \"ecommerce\",\n subtype: \"get_cart_analytics\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default CartTracking;\n","/**\n * @fileoverview Ecommerce - Checkout Tracking\n * @module features/ecommerce/checkout\n * \n * @description\n * Track checkout flow progress, payment attempts, and checkout\n * optimization opportunities.\n * \n * @useCases\n * - Track checkout step progression\n * - Identify checkout drop-off points\n * - Monitor payment success rates\n * - Analyze shipping method preferences\n * - Optimize checkout UX\n * \n * @metrics\n * - Checkout initiation rate\n * - Step completion rates\n * - Payment success rate\n * - Checkout abandonment rate\n * - Average time to complete\n * \n * @chartData\n * - Funnel chart: Checkout steps\n * - Bar chart: Abandonment by step\n * - Pie chart: Payment methods\n * - Line chart: Checkout completions over time\n * \n * @example\n * ```typescript\n * const checkout = new Checkout(webId, endpoint, apiKey);\n * \n * // Begin checkout\n * await checkout.begin({\n * cart: shoppingCart,\n * userId: 'user_123'\n * });\n * \n * // Track step progress\n * await checkout.step({\n * step: 'add_payment_info',\n * stepNumber: 3,\n * cart: shoppingCart\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Cart,\n CheckoutStep,\n CheckoutProgress,\n ShippingInfo,\n PaymentInfo,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for beginning checkout.\n */\nexport interface BeginCheckoutConfig {\n /** Cart being checked out */\n cart: Cart;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking checkout step.\n */\nexport interface CheckoutStepConfig {\n /** Checkout step */\n step: CheckoutStep;\n /** Step number */\n stepNumber: number;\n /** Cart state at this step */\n cart: Cart;\n /** Option selected at this step (e.g., shipping method) */\n option?: string;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Configuration for adding shipping info.\n */\nexport interface AddShippingConfig {\n /** Cart being checked out */\n cart: Cart;\n /** Shipping information */\n shipping: ShippingInfo;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Configuration for adding payment info.\n */\nexport interface AddPaymentConfig {\n /** Cart being checked out */\n cart: Cart;\n /** Payment information (non-sensitive) */\n payment: PaymentInfo;\n /** User ID */\n userId?: string;\n}\n\n/**\n * Checkout event response from API.\n */\nexport interface CheckoutResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n checkoutId: string;\n step: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Checkout analytics data for charts.\n */\nexport interface CheckoutAnalyticsData {\n /** Checkout funnel data */\n funnel: Array<{\n step: CheckoutStep;\n stepNumber: number;\n started: number;\n completed: number;\n conversionRate: number;\n dropOffRate: number;\n avgTimeToComplete: number;\n }>;\n /** Summary metrics */\n summary: {\n checkoutsStarted: number;\n checkoutsCompleted: number;\n overallConversionRate: number;\n avgCheckoutTime: number;\n avgOrderValue: number;\n abandonmentRate: number;\n };\n /** Checkouts over time */\n timeSeries: TimeSeriesData;\n /** Shipping methods used */\n shippingMethods: Array<{\n method: string;\n count: number;\n percentage: number;\n avgShippingCost: number;\n }>;\n /** Payment methods used */\n paymentMethods: Array<{\n method: string;\n count: number;\n percentage: number;\n successRate: number;\n }>;\n /** Abandonment analysis */\n abandonmentByStep: Array<{\n step: CheckoutStep;\n abandonments: number;\n percentage: number;\n avgCartValue: number;\n }>;\n}\n\n// ============================================================================\n// CHECKOUT CLASS\n// ============================================================================\n\n/**\n * Checkout - Track checkout flow and payments.\n * \n * @extends FTRPC\n * \n * @description\n * Provides checkout tracking capabilities including:\n * - Checkout initiation\n * - Step-by-step progress\n * - Shipping info capture\n * - Payment info capture\n * - Checkout abandonment\n * \n * @example\n * ```typescript\n * const checkout = new Checkout(webId, endpoint, apiKey);\n * \n * // Start checkout\n * await checkout.begin({ cart: shoppingCart });\n * \n * // Track shipping step\n * await checkout.addShipping({\n * cart: shoppingCart,\n * shipping: {\n * method: 'express',\n * carrier: 'FedEx',\n * cost: 9.99\n * }\n * });\n * \n * // Track payment step\n * await checkout.addPayment({\n * cart: shoppingCart,\n * payment: {\n * method: 'credit_card',\n * cardBrand: 'Visa'\n * }\n * });\n * ```\n */\nexport class Checkout extends FTRPC {\n /**\n * Tracks checkout initiation.\n * \n * @param config - Begin checkout configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.begin({\n * cart: {\n * cartId: 'cart_123',\n * items: cartItems,\n * total: 199.99,\n * currency: 'USD',\n * itemCount: 3\n * }\n * });\n * ```\n */\n async begin(config: BeginCheckoutConfig): Promise<CheckoutResponse> {\n return await this.init(\"begin_checkout\", {\n type: \"ecommerce\",\n subtype: \"begin_checkout\",\n cart: config.cart,\n cartValue: config.cart.total,\n itemCount: config.cart.itemCount,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks checkout step progress.\n * \n * @param config - Checkout step configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.step({\n * step: 'add_shipping_info',\n * stepNumber: 2,\n * cart: shoppingCart,\n * option: 'express_shipping'\n * });\n * ```\n */\n async step(config: CheckoutStepConfig): Promise<CheckoutResponse> {\n return await this.init(\"checkout_step\", {\n type: \"ecommerce\",\n subtype: \"checkout_step\",\n step: config.step,\n stepNumber: config.stepNumber,\n cart: config.cart,\n option: config.option,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks adding shipping information.\n * \n * @param config - Shipping info configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.addShipping({\n * cart: shoppingCart,\n * shipping: {\n * method: 'standard',\n * carrier: 'USPS',\n * cost: 5.99,\n * estimatedDelivery: '2026-02-07'\n * }\n * });\n * ```\n */\n async addShipping(config: AddShippingConfig): Promise<CheckoutResponse> {\n return await this.init(\"add_shipping_info\", {\n type: \"ecommerce\",\n subtype: \"shipping_info\",\n cart: config.cart,\n shipping: config.shipping,\n shippingMethod: config.shipping.method,\n shippingCost: config.shipping.cost,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks adding payment information.\n * \n * @param config - Payment info configuration\n * @returns Promise resolving to checkout response\n * \n * @example\n * ```typescript\n * await checkout.addPayment({\n * cart: shoppingCart,\n * payment: {\n * method: 'credit_card',\n * provider: 'stripe',\n * cardBrand: 'Mastercard',\n * cardLast4: '4242'\n * }\n * });\n * ```\n */\n async addPayment(config: AddPaymentConfig): Promise<CheckoutResponse> {\n return await this.init(\"add_payment_info\", {\n type: \"ecommerce\",\n subtype: \"payment_info\",\n cart: config.cart,\n payment: config.payment,\n paymentMethod: config.payment.method,\n userId: config.userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks checkout abandonment.\n * \n * @param cart - Cart at abandonment\n * @param step - Last completed step\n * @param reason - Abandonment reason (if known)\n * @returns Promise resolving to checkout response\n */\n async abandon(\n cart: Cart,\n step: CheckoutStep,\n reason?: string\n ): Promise<CheckoutResponse> {\n return await this.init(\"checkout_abandoned\", {\n type: \"ecommerce\",\n subtype: \"checkout_abandoned\",\n cart,\n step,\n cartValue: cart.total,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks payment attempt (success or failure).\n * \n * @param success - Whether payment succeeded\n * @param cart - Cart being paid for\n * @param payment - Payment information\n * @param errorCode - Error code (if failed)\n * @returns Promise resolving to checkout response\n */\n async paymentAttempt(\n success: boolean,\n cart: Cart,\n payment: PaymentInfo,\n errorCode?: string\n ): Promise<CheckoutResponse> {\n return await this.init(\"payment_attempt\", {\n type: \"ecommerce\",\n subtype: \"payment_attempt\",\n success,\n cart,\n payment,\n errorCode,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves checkout analytics data for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to checkout analytics\n * \n * @example\n * ```typescript\n * const analytics = await checkout.getAnalytics({ \n * range: 'last30days' \n * });\n * \n * // Funnel chart\n * const funnelData = analytics.funnel.map(step => ({\n * name: step.step,\n * value: step.started,\n * conversion: step.conversionRate\n * }));\n * \n * // Pie chart - payment methods\n * const paymentData = analytics.paymentMethods.map(p => ({\n * name: p.method,\n * value: p.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<CheckoutAnalyticsData> {\n return await this.init(\"get_checkout_analytics\", {\n type: \"ecommerce\",\n subtype: \"checkout_analytics\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Checkout;\n","/**\n * @fileoverview Ecommerce - Purchase/Transaction Tracking\n * @module features/ecommerce/purchases\n * \n * @description\n * Track completed purchases, transactions, and revenue with\n * full order details and customer information.\n * \n * @useCases\n * - Track completed purchases\n * - Calculate revenue metrics\n * - Monitor order values\n * - Analyze purchase patterns\n * - Track customer lifetime value\n * \n * @metrics\n * - Total revenue\n * - Number of orders\n * - Average order value\n * - Revenue per customer\n * - Items per order\n * \n * @chartData\n * - Line chart: Revenue over time\n * - Bar chart: Revenue by product/category\n * - KPI cards: Revenue, AOV, Orders\n * - Table: Recent transactions\n * \n * @example\n * ```typescript\n * const purchases = new Purchases(webId, endpoint, apiKey);\n * \n * // Track a purchase\n * await purchases.track({\n * order: {\n * orderId: 'ORD-12345',\n * items: orderItems,\n * total: 299.99,\n * currency: 'USD'\n * }\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n Order,\n CartItem,\n ShippingInfo,\n PaymentInfo,\n RevenueMetrics,\n MoneyValue,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData,\n PaginationParams\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking a purchase.\n */\nexport interface PurchaseConfig {\n /** Order details */\n order: Order;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Attribution data */\n attribution?: {\n source?: string;\n medium?: string;\n campaign?: string;\n affiliate?: string;\n };\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Purchase event response from API.\n */\nexport interface PurchaseResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n orderId: string;\n tracked: boolean;\n revenue: number;\n isFirstPurchase: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Revenue analytics data for charts.\n */\nexport interface RevenueAnalyticsData {\n /** Revenue summary */\n summary: {\n totalRevenue: MoneyValue;\n netRevenue: MoneyValue;\n totalOrders: number;\n averageOrderValue: MoneyValue;\n itemsSold: number;\n uniqueCustomers: number;\n repeatPurchaseRate: number;\n };\n /** Revenue time series */\n revenueTimeSeries: TimeSeriesData;\n /** Orders time series */\n ordersTimeSeries: TimeSeriesData;\n /** Revenue by category */\n byCategory: Array<{\n category: string;\n revenue: number;\n orders: number;\n percentage: number;\n }>;\n /** Revenue by product */\n byProduct: Array<{\n productId: string;\n productName: string;\n revenue: number;\n unitsSold: number;\n }>;\n /** Revenue by geography */\n byCountry: Array<{\n country: string;\n revenue: number;\n orders: number;\n }>;\n /** Customer segments */\n customerSegments: Array<{\n segment: 'new' | 'returning' | 'vip';\n customers: number;\n revenue: number;\n avgOrderValue: number;\n }>;\n}\n\n/**\n * Recent orders data.\n */\nexport interface RecentOrdersData {\n orders: Array<{\n orderId: string;\n total: MoneyValue;\n itemCount: number;\n status: string;\n createdAt: string;\n customer?: {\n userId: string;\n isNew: boolean;\n };\n }>;\n pagination: {\n page: number;\n limit: number;\n total: number;\n hasMore: boolean;\n };\n}\n\n// ============================================================================\n// PURCHASES CLASS\n// ============================================================================\n\n/**\n * Purchases - Track completed purchases and revenue.\n * \n * @extends FTRPC\n * \n * @description\n * Provides purchase tracking capabilities including:\n * - Purchase completion events\n * - Revenue tracking\n * - Order details capture\n * - Customer LTV tracking\n * - Attribution tracking\n * \n * @example\n * ```typescript\n * const purchases = new Purchases(webId, endpoint, apiKey);\n * \n * // Track completed purchase\n * await purchases.track({\n * order: {\n * orderId: 'ORD-12345',\n * items: cartItems,\n * subtotal: 279.99,\n * discountTotal: 30.00,\n * shippingTotal: 9.99,\n * taxTotal: 26.00,\n * total: 285.98,\n * currency: 'USD',\n * shipping: { method: 'express', cost: 9.99 },\n * payment: { method: 'credit_card' }\n * },\n * userId: 'user_123'\n * });\n * \n * // Get revenue analytics\n * const revenue = await purchases.getRevenue({ range: 'thisMonth' });\n * ```\n */\nexport class Purchases extends FTRPC {\n /**\n * Tracks a completed purchase.\n * \n * @param config - Purchase configuration\n * @returns Promise resolving to purchase response\n * \n * @example\n * ```typescript\n * await purchases.track({\n * order: {\n * orderId: 'ORD-98765',\n * items: [\n * { productId: 'PROD-1', name: 'Widget', price: 29.99, quantity: 2, lineTotal: 59.98 }\n * ],\n * subtotal: 59.98,\n * discountTotal: 0,\n * shippingTotal: 5.99,\n * taxTotal: 5.40,\n * total: 71.37,\n * currency: 'USD'\n * },\n * attribution: {\n * source: 'google',\n * medium: 'cpc',\n * campaign: 'spring_sale'\n * }\n * });\n * ```\n */\n async track(config: PurchaseConfig): Promise<PurchaseResponse> {\n const order = config.order;\n \n return await this.init(\"purchase\", {\n type: \"ecommerce\",\n subtype: \"purchase\",\n order: {\n orderId: order.orderId,\n items: order.items,\n subtotal: order.subtotal,\n discountTotal: order.discountTotal,\n shippingTotal: order.shippingTotal,\n taxTotal: order.taxTotal,\n total: order.total,\n currency: order.currency,\n shipping: order.shipping,\n payment: order.payment,\n coupons: order.coupons,\n affiliation: order.affiliation\n },\n revenue: order.total,\n itemCount: order.items.reduce((sum, i) => sum + i.quantity, 0),\n userId: config.userId,\n sessionId: config.sessionId,\n attribution: config.attribution,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order status change.\n * \n * @param orderId - Order identifier\n * @param newStatus - New order status\n * @param previousStatus - Previous status (optional)\n * @returns Promise resolving to status change response\n */\n async statusChange(\n orderId: string,\n newStatus: Order['status'],\n previousStatus?: Order['status']\n ): Promise<PurchaseResponse> {\n return await this.init(\"order_status_change\", {\n type: \"ecommerce\",\n subtype: \"order_status_change\",\n orderId,\n newStatus,\n previousStatus,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order shipped event.\n * \n * @param orderId - Order identifier\n * @param shipping - Shipping details with tracking\n * @returns Promise resolving to shipped response\n */\n async shipped(orderId: string, shipping: ShippingInfo): Promise<PurchaseResponse> {\n return await this.init(\"order_shipped\", {\n type: \"ecommerce\",\n subtype: \"order_shipped\",\n orderId,\n shipping,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks order delivered event.\n * \n * @param orderId - Order identifier\n * @param deliveredAt - Delivery timestamp\n * @returns Promise resolving to delivered response\n */\n async delivered(orderId: string, deliveredAt?: string): Promise<PurchaseResponse> {\n return await this.init(\"order_delivered\", {\n type: \"ecommerce\",\n subtype: \"order_delivered\",\n orderId,\n deliveredAt: deliveredAt || new Date().toISOString(),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves revenue analytics for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to revenue analytics\n * \n * @example\n * ```typescript\n * const revenue = await purchases.getRevenue({ \n * range: 'last30days' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'Revenue', value: revenue.summary.totalRevenue.amount },\n * { label: 'Orders', value: revenue.summary.totalOrders },\n * { label: 'AOV', value: revenue.summary.averageOrderValue.amount }\n * ];\n * \n * // Revenue chart\n * const revenueChart = revenue.revenueTimeSeries.data;\n * \n * // Category breakdown\n * const categoryPie = revenue.byCategory.map(c => ({\n * name: c.category,\n * value: c.revenue\n * }));\n * ```\n */\n async getRevenue(filter?: DateRangeFilter): Promise<RevenueAnalyticsData> {\n return await this.init(\"get_revenue_analytics\", {\n type: \"ecommerce\",\n subtype: \"get_revenue_analytics\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets recent orders for display.\n * \n * @param pagination - Pagination options\n * @returns Promise resolving to recent orders\n */\n async getRecentOrders(pagination?: PaginationParams): Promise<RecentOrdersData> {\n return await this.init(\"get_recent_orders\", {\n type: \"ecommerce\",\n subtype: \"get_recent_orders\",\n pagination: pagination || { page: 1, limit: 20 },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets order details by ID.\n * \n * @param orderId - Order identifier\n * @returns Promise resolving to order details\n */\n async getOrder(orderId: string): Promise<Order> {\n return await this.init(\"get_order\", {\n type: \"ecommerce\",\n subtype: \"get_order\",\n orderId,\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Purchases;\n","/**\n * @fileoverview FlowGrid SDK - Browser Bundle\n * @module browser\n * \n * @description\n * Browser-friendly bundle for including FlowGrid SDK via script tag.\n * Works with vanilla HTML, WordPress, Shopify, and any website.\n * \n * @example\n * ```html\n * <script src=\"https://cdn.flowgrid.com/sdk/v1/flowgrid.min.js\"></script>\n * <script>\n * flowgrid.init({\n * webId: 'your-web-id',\n * endpoint: 'api.flowgrid.com/v1',\n * apiKey: 'your-api-key'\n * });\n * \n * // Track events\n * flowgrid.track('button_click', { button: 'signup' });\n * flowgrid.page();\n * flowgrid.identify('user_123', { email: 'user@example.com' });\n * </script>\n * ```\n */\n\n// Import ONLY what's needed for browser - no framework code\nimport { Activation } from './lib/features/core/activation';\nimport { TrackFeature } from './lib/features/core/track-feature';\nimport { Experiment } from './lib/features/core/experiment';\nimport { FeatureFlag } from './lib/features/core/feature-flag';\nimport { PageViews } from './lib/features/analytics/page-views';\nimport { Sessions } from './lib/features/analytics/sessions';\nimport { Events } from './lib/features/analytics/events';\nimport { Identify } from './lib/features/analytics/identify';\nimport { Products } from './lib/features/ecommerce/products';\nimport { CartTracking } from './lib/features/ecommerce/cart';\nimport { Checkout } from './lib/features/ecommerce/checkout';\nimport { Purchases } from './lib/features/ecommerce/purchases';\n\n// ============================================================================\n// BROWSER SDK\n// ============================================================================\n\ninterface BrowserConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrack?: {\n pageViews?: boolean;\n sessions?: boolean;\n };\n}\n\nclass FlowGridBrowser {\n private config: BrowserConfig | null = null;\n private activation: Activation | null = null;\n private trackFeature: TrackFeature | null = null;\n private experiment: Experiment | null = null;\n private featureFlag: FeatureFlag | null = null;\n private pageViews: PageViews | null = null;\n private sessions: Sessions | null = null;\n private events: Events | null = null;\n private identifyModule: Identify | null = null;\n private products: Products | null = null;\n private cart: CartTracking | null = null;\n private checkout: Checkout | null = null;\n private purchases: Purchases | null = null;\n private sessionId: string | null = null;\n\n /**\n * Initialize FlowGrid SDK for browser use.\n */\n init(config: BrowserConfig): void {\n this.config = config;\n const { webId, endpoint, apiKey } = config;\n\n // Initialize all modules\n this.activation = new Activation(webId, endpoint, apiKey);\n this.trackFeature = new TrackFeature(webId, endpoint, apiKey);\n this.experiment = new Experiment(webId, endpoint, apiKey);\n this.featureFlag = new FeatureFlag(webId, endpoint, apiKey);\n this.pageViews = new PageViews(webId, endpoint, apiKey);\n this.sessions = new Sessions(webId, endpoint, apiKey);\n this.events = new Events(webId, endpoint, apiKey);\n this.identifyModule = new Identify(webId, endpoint, apiKey);\n this.products = new Products(webId, endpoint, apiKey);\n this.cart = new CartTracking(webId, endpoint, apiKey);\n this.checkout = new Checkout(webId, endpoint, apiKey);\n this.purchases = new Purchases(webId, endpoint, apiKey);\n\n // Auto-track if enabled\n if (config.autoTrack?.sessions !== false) {\n this.startSession();\n }\n if (config.autoTrack?.pageViews !== false) {\n this.page();\n }\n\n console.log('FlowGrid SDK initialized');\n }\n\n /**\n * Track a custom event.\n */\n async track(eventName: string, properties?: Record<string, unknown>): Promise<void> {\n if (!this.events) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.events.track({\n eventName,\n category: 'custom',\n properties: {\n ...properties,\n sessionId: this.sessionId,\n },\n });\n }\n\n /**\n * Track a page view.\n */\n async page(url?: string, title?: string): Promise<void> {\n if (!this.pageViews) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n const pageUrl = url || window.location.href;\n const pageTitle = title || document.title;\n \n await this.pageViews.track({\n url: pageUrl,\n path: window.location.pathname,\n title: pageTitle,\n referrer: document.referrer,\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Identify a user.\n */\n async identify(userId: string, traits?: Record<string, unknown>): Promise<void> {\n if (!this.identifyModule) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.identifyModule.user({\n userId,\n traits: traits || {},\n });\n }\n\n /**\n * Track product view.\n */\n async productView(product: {\n productId: string;\n name: string;\n price: number;\n currency?: string;\n category?: string;\n brand?: string;\n }): Promise<void> {\n if (!this.products) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.products.view({\n productId: product.productId,\n name: product.name,\n price: product.price,\n currency: product.currency || 'USD',\n category: product.category,\n brand: product.brand,\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Track add to cart.\n */\n async addToCart(product: {\n productId: string;\n name: string;\n price: number;\n quantity: number;\n currency?: string;\n }, cartId?: string): Promise<void> {\n if (!this.cart) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n await this.cart.addItem({\n product: {\n productId: product.productId,\n name: product.name,\n price: product.price,\n currency: product.currency || 'USD',\n },\n quantity: product.quantity,\n cartId: cartId || this.getOrCreateCartId(),\n });\n }\n\n /**\n * Track purchase/conversion.\n */\n async purchase(order: {\n orderId: string;\n total: number;\n currency?: string;\n items: Array<{\n productId: string;\n name: string;\n price: number;\n quantity: number;\n }>;\n }): Promise<void> {\n if (!this.purchases) throw new Error('FlowGrid not initialized. Call flowgrid.init() first.');\n \n const currency = order.currency || 'USD';\n const items = order.items.map(item => ({\n productId: item.productId,\n name: item.name,\n price: item.price,\n currency,\n quantity: item.quantity,\n lineTotal: item.price * item.quantity,\n }));\n \n const subtotal = items.reduce((sum, item) => sum + item.lineTotal, 0);\n \n await this.purchases.track({\n order: {\n orderId: order.orderId,\n items,\n subtotal,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: order.total,\n currency,\n },\n sessionId: this.sessionId || undefined,\n });\n }\n\n /**\n * Start a session (called automatically on init).\n */\n private async startSession(): Promise<void> {\n if (!this.sessions) return;\n \n this.sessionId = this.generateSessionId();\n \n await this.sessions.start({\n landingPage: window.location.href,\n referrer: document.referrer,\n utm: this.parseUTM(),\n });\n }\n\n /**\n * Generate a session ID.\n */\n private generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Get or create cart ID from localStorage.\n */\n private getOrCreateCartId(): string {\n let cartId = localStorage.getItem('flowgrid_cart_id');\n if (!cartId) {\n cartId = `cart_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n localStorage.setItem('flowgrid_cart_id', cartId);\n }\n return cartId;\n }\n\n /**\n * Parse UTM parameters from URL.\n */\n private parseUTM() {\n const params = new URLSearchParams(window.location.search);\n return {\n utmSource: params.get('utm_source') || undefined,\n utmMedium: params.get('utm_medium') || undefined,\n utmCampaign: params.get('utm_campaign') || undefined,\n utmTerm: params.get('utm_term') || undefined,\n utmContent: params.get('utm_content') || undefined,\n };\n }\n}\n\n// ============================================================================\n// GLOBAL INSTANCE\n// ============================================================================\n\nconst flowgridInstance = new FlowGridBrowser();\n\n// Export for UMD\nexport default flowgridInstance;\n\n// Make available globally for script tag usage\nif (typeof window !== 'undefined') {\n (window as any).flowgrid = flowgridInstance;\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","FTRPC","constructor","webId","endpoint","apiKey","trim","Error","normalizeEndpoint","init","eventName","properties","method","validateInput","callType","type","url","encodeURIComponent","body","JSON","stringify","web_id","event_name","executeRequest","undefined","attempt","controller","AbortController","timeoutId","setTimeout","abort","TIMEOUT_MS","res","fetch","headers","signal","clearTimeout","ok","text","safeRead","status","statusText","json","error","name","message","includes","MAX_RETRIES","length","serialized","TextEncoder","encode","MAX_PAYLOAD_SIZE","sensitiveKeys","lower","toLowerCase","console","warn","clean","startsWith","replace","Activation","create","config","timestamp","Date","toISOString","trackOnboardingStep","subtype","userId","stepId","stepName","stepOrder","totalSteps","progress","Math","round","timeSpent","skipped","completeOnboarding","totalTimeSpent","stepsCompleted","stepsSkipped","completionRate","trackFirstAction","actionName","timeSinceSignup","source","trackSignup","getAnalytics","filter","range","TrackFeature","category","action","trackUsage","featureId","featureName","duration","success","Experiment","track","variant","assign","experimentId","variantId","trackConversion","metricName","trackExposure","getResults","getVariant","FeatureFlag","evaluate","trackEvaluation","flagKey","context","result","reason","trackStatusChange","enabled","changedBy","trackRolloutChange","previousPercentage","newPercentage","PageViews","path","title","referrer","sessionId","trackScrollDepth","scrollDepth","min","max","timeAtDepth","trackTimeOnPage","engaged","trackExit","pagination","page","limit","Sessions","start","user","device","location","utm","utmSource","medium","utmMedium","campaign","utmCampaign","landingPage","window","href","document","update","end","heartbeat","getRealTime","realtime","Events","label","nonInteraction","trackBatch","events","map","e","count","trackClick","trackForm","trackSearch","query","resultsCount","resultClicked","clickedPosition","filters","trackError","stack","errorType","fatal","userAction","Identify","anonymousId","traits","updateTraits","alias","previousId","group","groupId","reset","Products","view","product","productId","brand","price","currency","imageUrl","rating","reviewCount","stockStatus","attributes","searchQuery","impression","list","productCount","products","click","listId","position","quickView","interaction","getProductPerformance","CartTracking","addItem","lineTotal","quantity","discount","cartId","removeItem","updateItem","previousQuantity","newQuantity","quantityChange","cart","cartValue","total","itemCount","abandon","applyCoupon","couponCode","Checkout","begin","step","stepNumber","option","addShipping","shipping","shippingMethod","shippingCost","cost","addPayment","payment","paymentMethod","paymentAttempt","errorCode","Purchases","order","orderId","items","subtotal","discountTotal","shippingTotal","taxTotal","coupons","affiliation","revenue","reduce","sum","i","attribution","statusChange","newStatus","previousStatus","shipped","delivered","deliveredAt","getRevenue","getRecentOrders","getOrder","flowgridInstance","activation","trackFeature","experiment","featureFlag","pageViews","sessions","identifyModule","checkout","purchases","autoTrack","startSession","log","pageUrl","pageTitle","pathname","identify","productView","addToCart","getOrCreateCartId","purchase","item","generateSessionId","parseUTM","now","random","toString","substring","localStorage","getItem","setItem","params","URLSearchParams","search","utmTerm","utmContent","flowgrid"],"sourceRoot":""}