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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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","sources":["webpack://FlowGridSDK/webpack/universalModuleDefinition","webpack://FlowGridSDK/external umd \"next/navigation\"","webpack://FlowGridSDK/external umd \"react/jsx-runtime\"","webpack://FlowGridSDK/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"react\",\"root\":\"React\"}","webpack://FlowGridSDK/external umd {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"amd\":\"vue\",\"root\":\"Vue\"}","webpack://FlowGridSDK/webpack/bootstrap","webpack://FlowGridSDK/webpack/runtime/define property getters","webpack://FlowGridSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FlowGridSDK/./src/lib/client/ftrpc.ts","webpack://FlowGridSDK/./src/lib/features/core/activation.ts","webpack://FlowGridSDK/./src/lib/features/core/track-feature.ts","webpack://FlowGridSDK/./src/lib/features/core/track-prompt.ts","webpack://FlowGridSDK/./src/lib/features/core/experiment.ts","webpack://FlowGridSDK/./src/lib/features/core/feature-flag.ts","webpack://FlowGridSDK/./src/lib/features/analytics/page-views.ts","webpack://FlowGridSDK/./src/lib/features/analytics/sessions.ts","webpack://FlowGridSDK/./src/lib/features/analytics/events.ts","webpack://FlowGridSDK/./src/lib/features/analytics/identify.ts","webpack://FlowGridSDK/./src/lib/features/analytics/funnels.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/products.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/cart.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/checkout.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/purchases.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/ltv.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/subscriptions.ts","webpack://FlowGridSDK/./src/lib/frameworks/nextjs/client.tsx","webpack://FlowGridSDK/./src/lib/frameworks/react/index.tsx","webpack://FlowGridSDK/./src/lib/frameworks/vue/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react/jsx-runtime\"), require(\"react\"), require(\"vue\"), (function webpackLoadOptionalExternalModule() { try { return require(\"next/navigation\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react/jsx-runtime\", \"react\", \"vue\", \"next/navigation\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FlowGridSDK\"] = factory(require(\"react/jsx-runtime\"), require(\"react\"), require(\"vue\"), (function webpackLoadOptionalExternalModule() { try { return require(\"next/navigation\"); } catch(e) {} }()));\n\telse\n\t\troot[\"FlowGridSDK\"] = factory(root[\"react/jsx-runtime\"], root[\"React\"], root[\"Vue\"], root[\"next/navigation\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__272__, __WEBPACK_EXTERNAL_MODULE__12__, __WEBPACK_EXTERNAL_MODULE__594__, __WEBPACK_EXTERNAL_MODULE__500__) => {\nreturn ","if(typeof __WEBPACK_EXTERNAL_MODULE__500__ === 'undefined') { var e = new Error(\"Cannot find module 'next/navigation'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__500__;","module.exports = __WEBPACK_EXTERNAL_MODULE__272__;","module.exports = __WEBPACK_EXTERNAL_MODULE__12__;","module.exports = __WEBPACK_EXTERNAL_MODULE__594__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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))","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 - Prompt & AI Interaction Tracking\n * @module features/core/track-prompt\n * \n * @description\n * Track AI prompt interactions, completions, and user feedback\n * for AI-powered features.\n * \n * @useCases\n * - Track AI prompt submissions\n * - Monitor response quality\n * - Measure user satisfaction\n * - Analyze prompt patterns\n * - Optimize AI features\n * \n * @metrics\n * - Prompts per user\n * - Response acceptance rate\n * - Average response time\n * - User satisfaction score\n * - Token usage\n * \n * @chartData\n * - Line chart: Prompts over time\n * - Bar chart: Prompts by category\n * - Histogram: Response time distribution\n * - Gauge: Satisfaction score\n * \n * @example\n * ```typescript\n * const trackPrompt = new TrackPrompt(webId, endpoint, apiKey);\n * \n * await trackPrompt.create({\n * eventName: 'ai_completion',\n * properties: { \n * promptType: 'code_suggestion',\n * accepted: true \n * }\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 prompt events.\n */\nexport interface PromptConfig {\n /** Event name */\n eventName: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * AI prompt submission configuration.\n */\nexport interface PromptSubmissionConfig {\n /** Prompt ID */\n promptId: string;\n /** User ID */\n userId?: string;\n /** Prompt text (may be truncated/hashed for privacy) */\n promptText?: string;\n /** Prompt category/type */\n promptType: string;\n /** Model used */\n model?: string;\n /** Input token count */\n inputTokens?: number;\n /** Session/conversation ID */\n conversationId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * AI response configuration.\n */\nexport interface PromptResponseConfig {\n /** Prompt ID */\n promptId: string;\n /** Response time (ms) */\n responseTime: number;\n /** Output token count */\n outputTokens?: number;\n /** Whether response completed */\n completed: boolean;\n /** Error if any */\n error?: string;\n /** Response quality (if auto-detected) */\n qualityScore?: number;\n}\n\n/**\n * User feedback on AI response.\n */\nexport interface PromptFeedbackConfig {\n /** Prompt ID */\n promptId: string;\n /** User ID */\n userId?: string;\n /** Feedback type */\n feedbackType: 'accepted' | 'rejected' | 'edited' | 'thumbs_up' | 'thumbs_down';\n /** Rating (1-5) */\n rating?: number;\n /** User comment */\n comment?: string;\n}\n\n/**\n * Prompt tracking response.\n */\nexport interface PromptResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n promptId?: string;\n };\n timestamp: string;\n}\n\n/**\n * Prompt analytics data.\n */\nexport interface PromptAnalyticsData {\n /** Summary metrics */\n summary: {\n totalPrompts: number;\n uniqueUsers: number;\n avgResponseTime: number;\n acceptanceRate: number;\n avgSatisfactionScore: number;\n totalTokensUsed: number;\n errorRate: number;\n };\n /** Usage by prompt type */\n byType: Array<{\n promptType: string;\n count: number;\n acceptanceRate: number;\n avgResponseTime: number;\n avgTokens: number;\n }>;\n /** Usage by model */\n byModel: Array<{\n model: string;\n count: number;\n avgResponseTime: number;\n errorRate: number;\n }>;\n /** Feedback breakdown */\n feedback: {\n accepted: number;\n rejected: number;\n edited: number;\n thumbsUp: number;\n thumbsDown: number;\n };\n /** Trends */\n trends: TimeSeriesData;\n}\n\n// ============================================================================\n// TRACK PROMPT CLASS\n// ============================================================================\n\n/**\n * TrackPrompt - Track AI prompt interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides prompt tracking including:\n * - Prompt submissions\n * - Response tracking\n * - User feedback\n * - Quality metrics\n * - Usage analytics\n * \n * @example\n * ```typescript\n * const trackPrompt = new TrackPrompt(webId, endpoint, apiKey);\n * \n * // Track prompt submission\n * await trackPrompt.trackSubmission({\n * promptId: 'prompt_123',\n * userId: 'user_456',\n * promptType: 'code_completion',\n * model: 'gpt-4',\n * inputTokens: 150\n * });\n * \n * // Track response\n * await trackPrompt.trackResponse({\n * promptId: 'prompt_123',\n * responseTime: 1200,\n * outputTokens: 300,\n * completed: true\n * });\n * \n * // Track user feedback\n * await trackPrompt.trackFeedback({\n * promptId: 'prompt_123',\n * feedbackType: 'accepted',\n * rating: 5\n * });\n * ```\n */\nexport class TrackPrompt extends FTRPC {\n /**\n * Creates and tracks a prompt event.\n * \n * @param config - Prompt configuration\n * @returns Promise resolving to prompt response\n */\n async create(config: PromptConfig): Promise<PromptResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"prompt\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a prompt submission.\n * \n * @param config - Prompt submission configuration\n * @returns Promise resolving to prompt response\n */\n async trackSubmission(config: PromptSubmissionConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_submitted\", {\n type: \"prompt\",\n subtype: \"submission\",\n promptId: config.promptId,\n userId: config.userId,\n promptType: config.promptType,\n model: config.model,\n inputTokens: config.inputTokens,\n conversationId: config.conversationId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a prompt response.\n * \n * @param config - Prompt response configuration\n * @returns Promise resolving to prompt response\n */\n async trackResponse(config: PromptResponseConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_response\", {\n type: \"prompt\",\n subtype: \"response\",\n promptId: config.promptId,\n responseTime: config.responseTime,\n outputTokens: config.outputTokens,\n completed: config.completed,\n error: config.error,\n qualityScore: config.qualityScore,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks user feedback on a prompt response.\n * \n * @param config - Prompt feedback configuration\n * @returns Promise resolving to prompt response\n */\n async trackFeedback(config: PromptFeedbackConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_feedback\", {\n type: \"prompt\",\n subtype: \"feedback\",\n promptId: config.promptId,\n userId: config.userId,\n feedbackType: config.feedbackType,\n rating: config.rating,\n comment: config.comment,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a conversation/multi-turn prompt session.\n * \n * @param conversationId - Conversation ID\n * @param userId - User ID\n * @param turnCount - Number of turns\n * @param totalDuration - Total conversation duration (ms)\n * @returns Promise resolving to prompt response\n */\n async trackConversation(\n conversationId: string,\n userId: string,\n turnCount: number,\n totalDuration: number\n ): Promise<PromptResponse> {\n return await this.init(\"prompt_conversation\", {\n type: \"prompt\",\n subtype: \"conversation\",\n conversationId,\n userId,\n turnCount,\n totalDuration,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets prompt analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to prompt analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<PromptAnalyticsData> {\n return await this.init(\"get_prompt_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default TrackPrompt;\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 Product Analytics - Funnel Analysis\n * @module features/analytics/funnels\n * \n * @description\n * Define and analyze conversion funnels to understand user journeys,\n * identify drop-off points, and optimize conversion rates.\n * \n * @useCases\n * - Track signup/onboarding completion rates\n * - Analyze checkout funnel performance\n * - Identify where users drop off in key flows\n * - Compare funnel performance across segments\n * - A/B test different funnel variations\n * \n * @metrics\n * - Step-by-step conversion rates\n * - Drop-off rates at each step\n * - Time to complete each step\n * - Overall funnel conversion rate\n * - Funnel completion time\n * \n * @chartData\n * - Funnel chart: Step-by-step visualization\n * - Bar chart: Conversion by step\n * - Line chart: Funnel performance over time\n * - Comparison: Funnel variants side-by-side\n * \n * @example\n * ```typescript\n * const funnels = new Funnels(webId, endpoint, apiKey);\n * \n * // Track funnel step\n * await funnels.trackStep({\n * funnelId: 'checkout_funnel',\n * step: 'add_payment',\n * stepNumber: 3,\n * userId: 'user_123'\n * });\n * \n * // Get funnel analysis\n * const analysis = await funnels.analyze('checkout_funnel');\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n FunnelStep,\n FunnelAnalysis,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Funnel definition configuration.\n */\nexport interface FunnelDefinition {\n /** Unique funnel identifier */\n funnelId: string;\n /** Funnel name for display */\n name: string;\n /** Funnel description */\n description?: string;\n /** Ordered list of step definitions */\n steps: Array<{\n /** Step name */\n name: string;\n /** Event(s) that trigger this step */\n events: string[];\n /** Step description */\n description?: string;\n /** Whether step is optional */\n optional?: boolean;\n }>;\n}\n\n/**\n * Configuration for tracking a funnel step.\n */\nexport interface FunnelStepConfig {\n /** Funnel identifier */\n funnelId: string;\n /** Step name or event */\n step: string;\n /** Step number (1-indexed) */\n stepNumber: number;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Funnel step response from API.\n */\nexport interface FunnelStepResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n funnelId: string;\n step: string;\n tracked: boolean;\n previousStep?: string;\n timeFromPrevious?: number;\n };\n timestamp: string;\n}\n\n/**\n * Funnel analytics data for charts.\n */\nexport interface FunnelAnalyticsData {\n /** Funnel definition */\n funnel: FunnelDefinition;\n /** Analysis results */\n analysis: FunnelAnalysis;\n /** Step-by-step data for visualization */\n visualization: Array<{\n step: string;\n entered: number;\n completed: number;\n conversionRate: number;\n dropOffRate: number;\n avgTime: number;\n }>;\n /** Performance over time */\n trendData: TimeSeriesData;\n}\n\n/**\n * Funnel comparison data.\n */\nexport interface FunnelComparisonData {\n /** Base funnel data */\n baseline: FunnelAnalyticsData;\n /** Comparison funnel data */\n comparison: FunnelAnalyticsData;\n /** Step-by-step comparison */\n stepComparison: Array<{\n step: string;\n baselineRate: number;\n comparisonRate: number;\n difference: number;\n significant: boolean;\n }>;\n}\n\n// ============================================================================\n// FUNNELS CLASS\n// ============================================================================\n\n/**\n * Funnels - Define and analyze conversion funnels.\n * \n * @extends FTRPC\n * \n * @description\n * Provides funnel analysis capabilities including:\n * - Funnel definition and management\n * - Step-by-step event tracking\n * - Conversion and drop-off analysis\n * - Time-to-completion tracking\n * - Segment-based funnel comparison\n * \n * @example\n * ```typescript\n * const funnels = new Funnels(webId, endpoint, apiKey);\n * \n * // Define a signup funnel\n * await funnels.define({\n * funnelId: 'signup_funnel',\n * name: 'User Signup',\n * steps: [\n * { name: 'Visit Landing', events: ['page_view_landing'] },\n * { name: 'Click Signup', events: ['signup_clicked'] },\n * { name: 'Submit Form', events: ['signup_submitted'] },\n * { name: 'Verify Email', events: ['email_verified'] }\n * ]\n * });\n * \n * // Analyze funnel performance\n * const analysis = await funnels.analyze('signup_funnel', {\n * range: 'last30days'\n * });\n * ```\n */\nexport class Funnels extends FTRPC {\n /**\n * Defines a new funnel or updates existing.\n * \n * @param config - Funnel definition\n * @returns Promise resolving to definition response\n * \n * @example\n * ```typescript\n * await funnels.define({\n * funnelId: 'checkout_funnel',\n * name: 'Checkout Flow',\n * steps: [\n * { name: 'View Cart', events: ['view_cart'] },\n * { name: 'Begin Checkout', events: ['begin_checkout'] },\n * { name: 'Add Shipping', events: ['add_shipping_info'] },\n * { name: 'Add Payment', events: ['add_payment_info'] },\n * { name: 'Purchase', events: ['purchase'] }\n * ]\n * });\n * ```\n */\n async define(config: FunnelDefinition): Promise<FunnelStepResponse> {\n return await this.init(\"define_funnel\", {\n type: \"define_funnel\",\n funnelId: config.funnelId,\n name: config.name,\n description: config.description,\n steps: config.steps,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a funnel step completion.\n * \n * @param config - Funnel step configuration\n * @returns Promise resolving to step response\n * \n * @example\n * ```typescript\n * // Track user progressing through checkout\n * await funnels.trackStep({\n * funnelId: 'checkout_funnel',\n * step: 'add_shipping_info',\n * stepNumber: 3,\n * userId: 'user_123',\n * properties: { shippingMethod: 'express' }\n * });\n * ```\n */\n async trackStep(config: FunnelStepConfig): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_step\", {\n type: \"funnel_step\",\n funnelId: config.funnelId,\n step: config.step,\n stepNumber: config.stepNumber,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks funnel completion.\n * \n * @param funnelId - Funnel identifier\n * @param userId - User who completed\n * @param properties - Completion properties\n * @returns Promise resolving to completion response\n */\n async trackComplete(\n funnelId: string,\n userId?: string,\n properties?: Record<string, unknown>\n ): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_complete\", {\n type: \"funnel_complete\",\n funnelId,\n userId,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks funnel abandonment.\n * \n * @param funnelId - Funnel identifier\n * @param lastStep - Last completed step\n * @param userId - User who abandoned\n * @param reason - Optional abandonment reason\n * @returns Promise resolving to abandonment response\n */\n async trackAbandon(\n funnelId: string,\n lastStep: string,\n userId?: string,\n reason?: string\n ): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_abandon\", {\n type: \"funnel_abandon\",\n funnelId,\n lastStep,\n userId,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Analyzes funnel performance.\n * \n * @param funnelId - Funnel identifier\n * @param filter - Date range filter\n * @returns Promise resolving to funnel analytics\n * \n * @example\n * ```typescript\n * const analysis = await funnels.analyze('checkout_funnel', {\n * range: 'last7days'\n * });\n * \n * // Funnel visualization data\n * const funnelData = analysis.visualization.map(step => ({\n * name: step.step,\n * value: step.entered,\n * conversion: step.conversionRate\n * }));\n * \n * // Overall conversion rate\n * console.log(`Conversion: ${analysis.analysis.overallConversionRate}%`);\n * ```\n */\n async analyze(\n funnelId: string,\n filter?: DateRangeFilter\n ): Promise<FunnelAnalyticsData> {\n return await this.init(\"analyze_funnel\", {\n type: \"query\",\n funnelId,\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Compares two funnel periods or segments.\n * \n * @param funnelId - Funnel identifier\n * @param baselineFilter - Baseline period filter\n * @param comparisonFilter - Comparison period filter\n * @returns Promise resolving to comparison data\n * \n * @example\n * ```typescript\n * const comparison = await funnels.compare(\n * 'checkout_funnel',\n * { range: 'last30days' },\n * { range: 'last60days' }\n * );\n * \n * // Side-by-side comparison chart\n * const comparisonData = comparison.stepComparison.map(s => ({\n * step: s.step,\n * baseline: s.baselineRate,\n * comparison: s.comparisonRate\n * }));\n * ```\n */\n async compare(\n funnelId: string,\n baselineFilter: DateRangeFilter,\n comparisonFilter: DateRangeFilter\n ): Promise<FunnelComparisonData> {\n return await this.init(\"compare_funnel\", {\n type: \"query\",\n funnelId,\n baselineFilter,\n comparisonFilter,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Lists all defined funnels.\n * \n * @returns Promise resolving to funnel list\n */\n async list(): Promise<FunnelDefinition[]> {\n return await this.init(\"list_funnels\", {\n type: \"query\",\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Funnels;\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 Ecommerce - Customer Lifetime Value (LTV)\n * @module features/ecommerce/ltv\n * \n * @description\n * Calculate and track customer lifetime value to understand\n * customer worth and optimize acquisition costs.\n * \n * @useCases\n * - Calculate customer LTV\n * - Segment customers by value\n * - Track LTV trends over time\n * - Identify high-value customers\n * - Optimize acquisition spend (LTV:CAC)\n * \n * @metrics\n * - Average LTV\n * - LTV by cohort\n * - LTV by segment\n * - LTV:CAC ratio\n * - Customer value distribution\n * \n * @chartData\n * - Line chart: LTV by cohort over time\n * - Bar chart: LTV by segment\n * - Histogram: Customer value distribution\n * - KPI: Average LTV, LTV:CAC\n * \n * @example\n * ```typescript\n * const ltv = new CustomerLTV(webId, endpoint, apiKey);\n * \n * // Get customer LTV\n * const customerValue = await ltv.getCustomerValue('user_123');\n * \n * // Get LTV analytics\n * const analytics = await ltv.getAnalytics({ range: 'last90days' });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n MoneyValue,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Customer value data.\n */\nexport interface CustomerValueData {\n /** Customer/user ID */\n userId: string;\n /** Total revenue from customer */\n totalRevenue: MoneyValue;\n /** Number of orders */\n orderCount: number;\n /** Average order value */\n averageOrderValue: MoneyValue;\n /** Predicted future value */\n predictedLTV: MoneyValue;\n /** Customer segment */\n segment: 'low' | 'medium' | 'high' | 'vip';\n /** Days since first purchase */\n customerAge: number;\n /** Days since last purchase */\n daysSinceLastPurchase: number;\n /** Purchase frequency (orders per month) */\n purchaseFrequency: number;\n}\n\n/**\n * Configuration for recording acquisition cost.\n */\nexport interface AcquisitionCostConfig {\n /** Customer/user ID */\n userId: string;\n /** Acquisition cost */\n cost: MoneyValue;\n /** Acquisition channel */\n channel: string;\n /** Campaign (if applicable) */\n campaign?: string;\n}\n\n/**\n * LTV event response from API.\n */\nexport interface LTVResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n userId: string;\n ltv: number;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * LTV analytics data for charts.\n */\nexport interface LTVAnalyticsData {\n /** Summary metrics */\n summary: {\n averageLTV: MoneyValue;\n medianLTV: MoneyValue;\n totalCustomerValue: MoneyValue;\n averageCAC: MoneyValue;\n ltvCacRatio: number;\n averageOrderValue: MoneyValue;\n averageOrdersPerCustomer: number;\n };\n /** LTV by customer segment */\n bySegment: Array<{\n segment: string;\n customerCount: number;\n averageLTV: MoneyValue;\n totalRevenue: MoneyValue;\n percentageOfCustomers: number;\n percentageOfRevenue: number;\n }>;\n /** LTV by cohort */\n byCohort: Array<{\n cohort: string;\n customerCount: number;\n averageLTV: MoneyValue;\n ltvProgression: number[];\n }>;\n /** LTV by acquisition channel */\n byChannel: Array<{\n channel: string;\n customers: number;\n averageLTV: MoneyValue;\n averageCAC: MoneyValue;\n ltvCacRatio: number;\n roi: number;\n }>;\n /** LTV distribution */\n distribution: Array<{\n range: string;\n count: number;\n percentage: number;\n }>;\n /** LTV trend over time */\n trendData: TimeSeriesData;\n}\n\n// ============================================================================\n// CUSTOMER LTV CLASS\n// ============================================================================\n\n/**\n * CustomerLTV - Calculate and track customer lifetime value.\n * \n * @extends FTRPC\n * \n * @description\n * Provides LTV tracking capabilities including:\n * - Customer value calculation\n * - Acquisition cost tracking\n * - LTV:CAC ratio analysis\n * - Customer segmentation by value\n * - Cohort-based LTV analysis\n * \n * @example\n * ```typescript\n * const ltv = new CustomerLTV(webId, endpoint, apiKey);\n * \n * // Get individual customer value\n * const value = await ltv.getCustomerValue('user_123');\n * console.log(`LTV: $${value.totalRevenue.amount / 100}`);\n * \n * // Record acquisition cost\n * await ltv.recordAcquisitionCost({\n * userId: 'user_123',\n * cost: { amount: 5000, currency: 'USD' },\n * channel: 'facebook_ads',\n * campaign: 'spring_campaign'\n * });\n * \n * // Get LTV analytics\n * const analytics = await ltv.getAnalytics();\n * console.log(`LTV:CAC Ratio: ${analytics.summary.ltvCacRatio}`);\n * ```\n */\nexport class CustomerLTV extends FTRPC {\n /**\n * Gets lifetime value data for a specific customer.\n * \n * @param userId - Customer/user identifier\n * @returns Promise resolving to customer value data\n * \n * @example\n * ```typescript\n * const value = await ltv.getCustomerValue('user_123');\n * \n * console.log(`Total Revenue: $${value.totalRevenue.amount / 100}`);\n * console.log(`Orders: ${value.orderCount}`);\n * console.log(`Segment: ${value.segment}`);\n * console.log(`Predicted LTV: $${value.predictedLTV.amount / 100}`);\n * ```\n */\n async getCustomerValue(userId: string): Promise<CustomerValueData> {\n return await this.init(\"get_customer_value\", {\n type: \"query\",\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Records customer acquisition cost.\n * \n * @param config - Acquisition cost configuration\n * @returns Promise resolving to LTV response\n * \n * @example\n * ```typescript\n * await ltv.recordAcquisitionCost({\n * userId: 'user_123',\n * cost: { amount: 2500, currency: 'USD' }, // $25.00\n * channel: 'google_ads',\n * campaign: 'brand_terms'\n * });\n * ```\n */\n async recordAcquisitionCost(config: AcquisitionCostConfig): Promise<LTVResponse> {\n return await this.init(\"record_acquisition_cost\", {\n type: \"acquisition_cost\",\n userId: config.userId,\n cost: config.cost,\n channel: config.channel,\n campaign: config.campaign,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates customer segment based on value.\n * \n * @param userId - Customer/user identifier\n * @param segment - New segment\n * @returns Promise resolving to LTV response\n */\n async updateSegment(\n userId: string,\n segment: 'low' | 'medium' | 'high' | 'vip'\n ): Promise<LTVResponse> {\n return await this.init(\"update_customer_segment\", {\n type: \"segment_update\",\n userId,\n segment,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets high-value customers.\n * \n * @param limit - Number of customers to return\n * @returns Promise resolving to list of high-value customers\n */\n async getTopCustomers(limit: number = 100): Promise<CustomerValueData[]> {\n return await this.init(\"get_top_customers\", {\n type: \"query\",\n limit,\n sortBy: \"totalRevenue\",\n sortOrder: \"desc\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves LTV analytics for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to LTV analytics\n * \n * @example\n * ```typescript\n * const analytics = await ltv.getAnalytics({ \n * range: 'last90days' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'Avg LTV', value: analytics.summary.averageLTV.amount },\n * { label: 'LTV:CAC', value: analytics.summary.ltvCacRatio },\n * { label: 'Avg AOV', value: analytics.summary.averageOrderValue.amount }\n * ];\n * \n * // Bar chart - LTV by channel\n * const channelChart = analytics.byChannel.map(c => ({\n * name: c.channel,\n * ltv: c.averageLTV.amount,\n * cac: c.averageCAC.amount\n * }));\n * \n * // Histogram - value distribution\n * const distribution = analytics.distribution.map(d => ({\n * range: d.range,\n * count: d.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<LTVAnalyticsData> {\n return await this.init(\"get_ltv_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last90days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default CustomerLTV;\n","/**\n * @fileoverview Ecommerce - Subscription & Recurring Revenue\n * @module features/ecommerce/subscriptions\n * \n * @description\n * Track subscription lifecycle events for SaaS and subscription\n * ecommerce businesses.\n * \n * @useCases\n * - Track subscription signups\n * - Monitor subscription changes (upgrades/downgrades)\n * - Track cancellations and churn\n * - Calculate MRR/ARR metrics\n * - Analyze subscription cohorts\n * \n * @metrics\n * - Monthly Recurring Revenue (MRR)\n * - Annual Recurring Revenue (ARR)\n * - Churn rate\n * - Expansion revenue\n * - Net revenue retention\n * \n * @chartData\n * - Line chart: MRR over time\n * - Waterfall: MRR movement\n * - Bar chart: Revenue by plan\n * - Cohort: Subscription retention\n * \n * @example\n * ```typescript\n * const subscriptions = new Subscriptions(webId, endpoint, apiKey);\n * \n * // Track subscription start\n * await subscriptions.start({\n * subscriptionId: 'sub_123',\n * userId: 'user_456',\n * plan: 'pro',\n * mrr: { amount: 4900, currency: 'USD' },\n * billingCycle: 'monthly'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { MoneyValue, CurrencyCode, DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Subscription start configuration.\n */\nexport interface SubscriptionStartConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Plan name */\n plan: string;\n /** Monthly recurring revenue */\n mrr: MoneyValue;\n /** Billing cycle */\n billingCycle: 'monthly' | 'quarterly' | 'yearly';\n /** Trial period (if applicable) */\n trialDays?: number;\n /** Coupon applied */\n coupon?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Subscription change configuration.\n */\nexport interface SubscriptionChangeConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Previous plan */\n previousPlan: string;\n /** New plan */\n newPlan: string;\n /** Previous MRR */\n previousMrr: MoneyValue;\n /** New MRR */\n newMrr: MoneyValue;\n /** Change type */\n changeType: 'upgrade' | 'downgrade' | 'cross_grade';\n}\n\n/**\n * Subscription cancellation configuration.\n */\nexport interface SubscriptionCancelConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Plan being cancelled */\n plan: string;\n /** Lost MRR */\n lostMrr: MoneyValue;\n /** Cancellation reason */\n reason?: string;\n /** Feedback provided */\n feedback?: string;\n /** Whether cancelled immediately or at period end */\n immediate: boolean;\n}\n\n/**\n * Subscription response from API.\n */\nexport interface SubscriptionResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n subscriptionId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Subscription analytics data.\n */\nexport interface SubscriptionAnalyticsData {\n /** Summary metrics */\n summary: {\n totalMrr: MoneyValue;\n totalArr: MoneyValue;\n activeSubscriptions: number;\n newSubscriptions: number;\n churnedSubscriptions: number;\n churnRate: number;\n expansionMrr: MoneyValue;\n contractionMrr: MoneyValue;\n netMrrMovement: MoneyValue;\n netRevenueRetention: number;\n avgRevenuePerUser: MoneyValue;\n };\n /** MRR by plan */\n byPlan: Array<{\n plan: string;\n subscriptions: number;\n mrr: MoneyValue;\n percentage: number;\n }>;\n /** MRR waterfall */\n mrrMovement: {\n startingMrr: MoneyValue;\n newMrr: MoneyValue;\n expansionMrr: MoneyValue;\n contractionMrr: MoneyValue;\n churnedMrr: MoneyValue;\n endingMrr: MoneyValue;\n };\n /** MRR trend */\n mrrTrend: TimeSeriesData;\n /** Churn by reason */\n churnByReason: Array<{\n reason: string;\n count: number;\n lostMrr: MoneyValue;\n }>;\n /** Trial conversion rate */\n trialMetrics: {\n trialsStarted: number;\n trialsConverted: number;\n conversionRate: number;\n };\n}\n\n// ============================================================================\n// SUBSCRIPTIONS CLASS\n// ============================================================================\n\n/**\n * Subscriptions - Track subscription lifecycle events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides subscription tracking including:\n * - Subscription starts (new MRR)\n * - Plan changes (expansion/contraction)\n * - Cancellations (churned MRR)\n * - Renewals\n * - Trial conversions\n * \n * @example\n * ```typescript\n * const subscriptions = new Subscriptions(webId, endpoint, apiKey);\n * \n * // New subscription\n * await subscriptions.start({\n * subscriptionId: 'sub_abc123',\n * userId: 'user_456',\n * plan: 'professional',\n * mrr: { amount: 9900, currency: 'USD' },\n * billingCycle: 'monthly',\n * trialDays: 14\n * });\n * \n * // Upgrade\n * await subscriptions.change({\n * subscriptionId: 'sub_abc123',\n * userId: 'user_456',\n * previousPlan: 'professional',\n * newPlan: 'enterprise',\n * previousMrr: { amount: 9900, currency: 'USD' },\n * newMrr: { amount: 29900, currency: 'USD' },\n * changeType: 'upgrade'\n * });\n * ```\n */\nexport class Subscriptions extends FTRPC {\n /**\n * Tracks subscription start.\n * \n * @param config - Subscription start configuration\n * @returns Promise resolving to subscription response\n */\n async start(config: SubscriptionStartConfig): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_start\", {\n type: \"subscription_start\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n plan: config.plan,\n mrr: config.mrr,\n billingCycle: config.billingCycle,\n trialDays: config.trialDays,\n coupon: config.coupon,\n isTrialing: (config.trialDays || 0) > 0,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription plan change.\n * \n * @param config - Subscription change configuration\n * @returns Promise resolving to subscription response\n */\n async change(config: SubscriptionChangeConfig): Promise<SubscriptionResponse> {\n const mrrDiff = config.newMrr.amount - config.previousMrr.amount;\n \n return await this.init(\"subscription_change\", {\n type: \"subscription_change\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n previousPlan: config.previousPlan,\n newPlan: config.newPlan,\n previousMrr: config.previousMrr,\n newMrr: config.newMrr,\n mrrChange: mrrDiff,\n changeType: config.changeType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription cancellation.\n * \n * @param config - Cancellation configuration\n * @returns Promise resolving to subscription response\n */\n async cancel(config: SubscriptionCancelConfig): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_cancel\", {\n type: \"subscription_cancel\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n plan: config.plan,\n lostMrr: config.lostMrr,\n reason: config.reason,\n feedback: config.feedback,\n immediate: config.immediate,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription renewal.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @param mrr - Renewed MRR\n * @returns Promise resolving to subscription response\n */\n async renew(\n subscriptionId: string,\n userId: string,\n mrr: MoneyValue\n ): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_renew\", {\n type: \"subscription_renew\",\n subscriptionId,\n userId,\n mrr,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks trial conversion to paid.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @param plan - Converted to plan\n * @param mrr - New MRR\n * @returns Promise resolving to subscription response\n */\n async trialConverted(\n subscriptionId: string,\n userId: string,\n plan: string,\n mrr: MoneyValue\n ): Promise<SubscriptionResponse> {\n return await this.init(\"trial_converted\", {\n type: \"trial_converted\",\n subscriptionId,\n userId,\n plan,\n mrr,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks trial expiration without conversion.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @returns Promise resolving to subscription response\n */\n async trialExpired(\n subscriptionId: string,\n userId: string\n ): Promise<SubscriptionResponse> {\n return await this.init(\"trial_expired\", {\n type: \"trial_expired\",\n subscriptionId,\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets subscription analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to subscription analytics\n * \n * @example\n * ```typescript\n * const analytics = await subscriptions.getAnalytics({ \n * range: 'thisMonth' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'MRR', value: analytics.summary.totalMrr.amount },\n * { label: 'Churn Rate', value: analytics.summary.churnRate },\n * { label: 'NRR', value: analytics.summary.netRevenueRetention }\n * ];\n * \n * // Waterfall chart\n * const waterfall = analytics.mrrMovement;\n * \n * // MRR trend line\n * const trend = analytics.mrrTrend.data;\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<SubscriptionAnalyticsData> {\n return await this.init(\"get_subscription_analytics\", {\n type: \"query\",\n filter: filter || { range: \"thisMonth\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Subscriptions;\n","/**\n * @fileoverview FlowGrid SDK - Next.js Client Components\n * @module frameworks/nextjs/client\n * \n * @description\n * Client-side components and hooks for Next.js.\n * All exports require 'use client' directive.\n * \n * @example\n * ```tsx\n * // app/providers.tsx\n * 'use client';\n * import { FlowGridProvider } from 'flowgrid-sdk/nextjs/client';\n * \n * export function Providers({ children }) {\n * return (\n * <FlowGridProvider\n * webId={process.env.NEXT_PUBLIC_FLOWGRID_WEB_ID!}\n * endpoint={process.env.NEXT_PUBLIC_FLOWGRID_ENDPOINT!}\n * apiKey={process.env.NEXT_PUBLIC_FLOWGRID_API_KEY!}\n * >\n * {children}\n * </FlowGridProvider>\n * );\n * }\n * ```\n */\n\n'use client';\n\nimport React, { \n createContext, \n useContext, \n useEffect, \n useRef, \n useCallback,\n useMemo,\n useState,\n type ReactNode \n} from 'react';\n\n// Next.js navigation hooks - imported dynamically to avoid type errors when Next.js isn't installed\n// These will be properly typed when used in a Next.js project\nlet usePathname: () => string;\nlet useSearchParams: () => URLSearchParams;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nav = require('next/navigation');\n usePathname = nav.usePathname;\n useSearchParams = nav.useSearchParams;\n} catch {\n // Fallback for non-Next.js environments or when types aren't available\n usePathname = () => typeof window !== 'undefined' ? window.location.pathname : '/';\n useSearchParams = () => typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : new URLSearchParams();\n}\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrackPageViews?: boolean;\n autoTrackSessions?: boolean;\n debug?: boolean;\n}\n\nexport interface FlowGridContextValue {\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n trackEvent: (name: string, properties?: Record<string, unknown>) => Promise<void>;\n identifyUser: (userId: string, traits?: Record<string, unknown>) => Promise<void>;\n isReady: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FlowGridContext = createContext<FlowGridContextValue | null>(null);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface FlowGridProviderProps extends FlowGridConfig {\n children: ReactNode;\n}\n\n/**\n * FlowGrid Provider for Next.js App Router.\n * Use in a Client Component wrapper.\n * \n * @example\n * ```tsx\n * // app/providers.tsx\n * 'use client';\n * \n * import { FlowGridProvider } from 'flowgrid-sdk/nextjs/client';\n * \n * export function Providers({ children }: { children: React.ReactNode }) {\n * return (\n * <FlowGridProvider\n * webId={process.env.NEXT_PUBLIC_FLOWGRID_WEB_ID!}\n * endpoint={process.env.NEXT_PUBLIC_FLOWGRID_ENDPOINT!}\n * apiKey={process.env.NEXT_PUBLIC_FLOWGRID_API_KEY!}\n * >\n * {children}\n * </FlowGridProvider>\n * );\n * }\n * \n * // app/layout.tsx\n * import { Providers } from './providers';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <Providers>{children}</Providers>\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport function FlowGridProvider({ \n children, \n webId, \n endpoint, \n apiKey,\n autoTrackPageViews = true,\n autoTrackSessions = true,\n debug = false\n}: FlowGridProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const sessionIdRef = useRef<string | null>(null);\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Initialize SDK instances\n const sdk = useMemo(() => ({\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n }), [webId, endpoint, apiKey]);\n\n // Helper functions\n const trackEvent = useCallback(async (name: string, properties?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Event:', name, properties);\n await sdk.events.track({ eventName: name, properties: properties || {} });\n }, [sdk.events, debug]);\n\n const identifyUser = useCallback(async (userId: string, traits?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Identify:', userId, traits);\n await sdk.identify.user({ userId, traits: traits || {} });\n }, [sdk.identify, debug]);\n\n // Auto-track sessions\n useEffect(() => {\n if (!autoTrackSessions) return;\n\n const startSession = async () => {\n try {\n const result = await sdk.sessions.start({\n referrer: document.referrer,\n landingPage: pathname,\n });\n sessionIdRef.current = result.response?.sessionId || null;\n setIsReady(true);\n if (debug) console.log('[FlowGrid] Session started:', sessionIdRef.current);\n } catch (err) {\n if (debug) console.error('[FlowGrid] Session start failed:', err);\n setIsReady(true);\n }\n };\n\n startSession();\n\n return () => {\n if (sessionIdRef.current) {\n sdk.sessions.end(sessionIdRef.current);\n }\n };\n }, [autoTrackSessions, sdk.sessions, pathname, debug]);\n\n // Auto-track page views on route change\n useEffect(() => {\n if (!autoTrackPageViews || !isReady) return;\n\n const url = searchParams.toString() \n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n sdk.pageViews.track({\n url: window.location.href,\n path: url,\n title: document.title,\n referrer: document.referrer,\n });\n\n if (debug) console.log('[FlowGrid] Page view:', url);\n }, [pathname, searchParams, autoTrackPageViews, isReady, sdk.pageViews, debug]);\n\n const value: FlowGridContextValue = {\n ...sdk,\n trackEvent,\n identifyUser,\n isReady,\n };\n\n return (\n <FlowGridContext.Provider value={value}>\n {children}\n </FlowGridContext.Provider>\n );\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n */\nexport function useFlowGrid(): FlowGridContextValue {\n const context = useContext(FlowGridContext);\n if (!context) {\n throw new Error('useFlowGrid must be used within a FlowGridProvider');\n }\n return context;\n}\n\n/**\n * Track an event.\n * \n * @example\n * ```tsx\n * 'use client';\n * \n * import { useTrackEvent } from 'flowgrid-sdk/nextjs/client';\n * \n * export function FeatureButton() {\n * const trackEvent = useTrackEvent();\n * \n * return (\n * <button onClick={() => trackEvent('feature_clicked', { id: 'cta' })}>\n * Click me\n * </button>\n * );\n * }\n * ```\n */\nexport function useTrackEvent() {\n const { trackEvent } = useFlowGrid();\n return trackEvent;\n}\n\n/**\n * Get experiment variant.\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const [variant, setVariant] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n experiment.trackExposure(experimentId, userId, 'control');\n setVariant('control');\n setIsLoading(false);\n }, [experiment, experimentId, userId]);\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n */\nexport function useFeatureFlag(flagKey: string, context?: { userId?: string }) {\n const { featureFlag } = useFlowGrid();\n const [isEnabled, setIsEnabled] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n featureFlag.trackEvaluation({\n flagKey,\n userId: context?.userId,\n result: false,\n reason: 'default'\n });\n setIsEnabled(false);\n setIsLoading(false);\n }, [featureFlag, flagKey, context?.userId]);\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Identify user.\n */\nexport function useIdentify(userId: string | null, traits?: Record<string, unknown>) {\n const { identifyUser, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady && userId) {\n identifyUser(userId, traits);\n }\n }, [isReady, userId, traits, identifyUser]);\n}\n\n/**\n * Ecommerce hooks.\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n });\n }, [products]);\n\n const trackAddToCart = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n }, [cart]);\n\n const trackPurchase = useCallback(async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n }, [purchases]);\n\n return { trackProductView, trackAddToCart, trackPurchase, products, cart, checkout, purchases };\n}\n\n// ============================================================================\n// PAGE VIEW COMPONENT\n// ============================================================================\n\n/**\n * Component to track page views in App Router.\n * Add to your root layout.\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { PageViewTracker } from 'flowgrid-sdk/nextjs/client';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <Providers>\n * <PageViewTracker />\n * {children}\n * </Providers>\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport function PageViewTracker() {\n const pathname = usePathname();\n const { pageViews, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (!isReady) return;\n\n pageViews.track({\n url: window.location.href,\n path: pathname,\n title: document.title,\n referrer: document.referrer,\n });\n }, [pathname, isReady, pageViews]);\n\n return null;\n}\n\nexport default {\n FlowGridProvider,\n useFlowGrid,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n PageViewTracker,\n};\n","/**\n * @fileoverview FlowGrid SDK - React Integration\n * @module frameworks/react\n * \n * @description\n * React hooks and context provider for FlowGrid SDK.\n * All hooks are client-side only (use 'use client' in Next.js App Router).\n * \n * @example\n * ```tsx\n * // App.tsx - Wrap your app\n * import { FlowGridProvider } from 'flowgrid-sdk/react';\n * \n * function App() {\n * return (\n * <FlowGridProvider \n * webId=\"your-web-id\"\n * endpoint=\"https://api.flowgrid.io\"\n * apiKey=\"your-api-key\"\n * >\n * <YourApp />\n * </FlowGridProvider>\n * );\n * }\n * ```\n */\n\n'use client'; // For Next.js App Router compatibility\n\nimport React, { \n createContext, \n useContext, \n useEffect, \n useRef, \n useCallback,\n useMemo,\n useState,\n type ReactNode \n} from 'react';\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n /** Auto-track page views (default: true) */\n autoTrackPageViews?: boolean;\n /** Auto-track sessions (default: true) */\n autoTrackSessions?: boolean;\n /** Enable debug mode (default: false) */\n debug?: boolean;\n}\n\nexport interface FlowGridContextValue {\n // Core\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n // Analytics\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n // Ecommerce\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n // Helpers\n trackEvent: (name: string, properties?: Record<string, unknown>) => Promise<void>;\n identifyUser: (userId: string, traits?: Record<string, unknown>) => Promise<void>;\n isReady: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FlowGridContext = createContext<FlowGridContextValue | null>(null);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface FlowGridProviderProps extends FlowGridConfig {\n children: ReactNode;\n}\n\n/**\n * FlowGrid Provider - Wrap your app to enable analytics.\n * \n * @example\n * ```tsx\n * <FlowGridProvider\n * webId=\"web_123\"\n * endpoint=\"https://api.flowgrid.io\"\n * apiKey=\"key_abc\"\n * autoTrackPageViews={true}\n * >\n * <App />\n * </FlowGridProvider>\n * ```\n */\nexport function FlowGridProvider({ \n children, \n webId, \n endpoint, \n apiKey,\n autoTrackPageViews = true,\n autoTrackSessions = true,\n debug = false\n}: FlowGridProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const sessionIdRef = useRef<string | null>(null);\n\n // Initialize SDK instances\n const sdk = useMemo(() => ({\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n }), [webId, endpoint, apiKey]);\n\n // Helper functions\n const trackEvent = useCallback(async (name: string, properties?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Event:', name, properties);\n await sdk.events.track({ eventName: name, properties: properties || {} });\n }, [sdk.events, debug]);\n\n const identifyUser = useCallback(async (userId: string, traits?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Identify:', userId, traits);\n await sdk.identify.user({ userId, traits: traits || {} });\n }, [sdk.identify, debug]);\n\n // Auto-track sessions\n useEffect(() => {\n if (!autoTrackSessions || typeof window === 'undefined') return;\n\n const startSession = async () => {\n try {\n const result = await sdk.sessions.start({\n referrer: document.referrer,\n landingPage: window.location.pathname,\n });\n sessionIdRef.current = result.response?.sessionId || null;\n if (debug) console.log('[FlowGrid] Session started:', sessionIdRef.current);\n } catch (err) {\n if (debug) console.error('[FlowGrid] Session start failed:', err);\n }\n };\n\n startSession();\n setIsReady(true);\n\n // End session on page unload\n const handleUnload = () => {\n if (sessionIdRef.current) {\n sdk.sessions.end(sessionIdRef.current);\n }\n };\n\n window.addEventListener('beforeunload', handleUnload);\n return () => window.removeEventListener('beforeunload', handleUnload);\n }, [autoTrackSessions, sdk.sessions, debug]);\n\n // Auto-track page views\n useEffect(() => {\n if (!autoTrackPageViews || typeof window === 'undefined') return;\n\n const trackPageView = () => {\n sdk.pageViews.track({\n url: window.location.href,\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n });\n if (debug) console.log('[FlowGrid] Page view:', window.location.pathname);\n };\n\n // Track initial page view\n trackPageView();\n\n // Track on route changes (for SPAs)\n const handlePopState = () => trackPageView();\n window.addEventListener('popstate', handlePopState);\n\n return () => window.removeEventListener('popstate', handlePopState);\n }, [autoTrackPageViews, sdk.pageViews, debug]);\n\n const value: FlowGridContextValue = {\n ...sdk,\n trackEvent,\n identifyUser,\n isReady,\n };\n\n return (\n <FlowGridContext.Provider value={value}>\n {children}\n </FlowGridContext.Provider>\n );\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n * Must be used within FlowGridProvider.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { trackEvent, events } = useFlowGrid();\n * \n * const handleClick = () => {\n * trackEvent('button_clicked', { buttonId: 'cta' });\n * };\n * \n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function useFlowGrid(): FlowGridContextValue {\n const context = useContext(FlowGridContext);\n if (!context) {\n throw new Error('useFlowGrid must be used within a FlowGridProvider');\n }\n return context;\n}\n\n/**\n * Track page views automatically on route changes.\n * Use in your root layout or App component.\n * \n * @example\n * ```tsx\n * function App() {\n * usePageView(); // Tracks on every route change\n * return <Routes />;\n * }\n * ```\n */\nexport function usePageView(pageName?: string) {\n const { pageViews, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (!isReady || typeof window === 'undefined') return;\n\n pageViews.track({\n url: window.location.href,\n path: window.location.pathname,\n title: pageName || document.title,\n referrer: document.referrer,\n });\n }, [pageViews, pageName, isReady]);\n}\n\n/**\n * Track an event when component mounts.\n * \n * @example\n * ```tsx\n * function PricingPage() {\n * useTrackEvent('pricing_page_viewed', { source: 'navbar' });\n * return <PricingContent />;\n * }\n * ```\n */\nexport function useTrackEvent(\n eventName: string, \n properties?: Record<string, unknown>,\n deps: React.DependencyList = []\n) {\n const { trackEvent, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady) {\n trackEvent(eventName, properties);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isReady, ...deps]);\n}\n\n/**\n * Get experiment variant for a user.\n * \n * @example\n * ```tsx\n * function CheckoutPage() {\n * const { variant, isLoading } = useExperiment('checkout_v2', 'user_123');\n * \n * if (isLoading) return <Loading />;\n * \n * return variant === 'treatment' \n * ? <NewCheckout /> \n * : <OldCheckout />;\n * }\n * ```\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const [variant, setVariant] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n // In real implementation, this would fetch from API\n // For now, just track exposure\n experiment.trackExposure(experimentId, userId, variant || 'control');\n setVariant('control'); // Default\n setIsLoading(false);\n }, [experiment, experimentId, userId, variant]);\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n * \n * @example\n * ```tsx\n * function Dashboard() {\n * const { isEnabled, isLoading } = useFeatureFlag('new_dashboard', { \n * userId: 'user_123' \n * });\n * \n * if (isLoading) return <Loading />;\n * \n * return isEnabled ? <NewDashboard /> : <OldDashboard />;\n * }\n * ```\n */\nexport function useFeatureFlag(\n flagKey: string, \n context?: { userId?: string; [key: string]: unknown }\n) {\n const { featureFlag } = useFlowGrid();\n const [isEnabled, setIsEnabled] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const evaluate = async () => {\n try {\n await featureFlag.trackEvaluation({\n flagKey,\n userId: context?.userId,\n context,\n result: false, // Would come from API\n reason: 'default'\n });\n setIsEnabled(false); // Would come from API\n } finally {\n setIsLoading(false);\n }\n };\n\n evaluate();\n }, [featureFlag, flagKey, context]);\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Track user identity.\n * \n * @example\n * ```tsx\n * function ProfilePage({ user }) {\n * useIdentify(user.id, { \n * email: user.email, \n * plan: user.plan \n * });\n * \n * return <Profile />;\n * }\n * ```\n */\nexport function useIdentify(userId: string, traits?: Record<string, unknown>) {\n const { identifyUser, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady && userId) {\n identifyUser(userId, traits);\n }\n }, [isReady, userId, traits, identifyUser]);\n}\n\n// ============================================================================\n// ECOMMERCE HOOKS\n// ============================================================================\n\n/**\n * Ecommerce tracking hooks.\n * \n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const { trackProductView, trackAddToCart } = useEcommerce();\n * \n * useEffect(() => {\n * trackProductView(product);\n * }, [product]);\n * \n * const handleAddToCart = () => {\n * trackAddToCart(product, 1);\n * };\n * \n * return <button onClick={handleAddToCart}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n category?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n category: product.category,\n });\n }, [products]);\n\n const trackAddToCart = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity: number = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n }, [cart]);\n\n const trackCheckoutStart = useCallback(async (cartItems: Array<{ productId: string; name: string; price: number; quantity: number }>) => {\n await checkout.begin({\n cart: {\n cartId: 'current',\n items: cartItems.map(i => ({\n productId: i.productId,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n discountTotal: 0,\n total: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n currency: 'USD' as any,\n itemCount: cartItems.length,\n },\n });\n }, [checkout]);\n\n const trackPurchase = useCallback(async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n }, [purchases]);\n\n return {\n trackProductView,\n trackAddToCart,\n trackCheckoutStart,\n trackPurchase,\n // Direct access\n products,\n cart,\n checkout,\n purchases,\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n FlowGridProvider,\n useFlowGrid,\n usePageView,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n};\n","/**\n * @fileoverview FlowGrid SDK - Vue 3 Integration\n * @module frameworks/vue\n * \n * @description\n * Vue 3 composables and plugin for FlowGrid SDK.\n * Uses Composition API for reactive state management.\n * \n * @example\n * ```ts\n * // main.ts\n * import { createApp } from 'vue';\n * import { FlowGridPlugin } from 'flowgrid-sdk/vue';\n * \n * const app = createApp(App);\n * app.use(FlowGridPlugin, {\n * webId: 'your-web-id',\n * endpoint: 'https://api.flowgrid.io',\n * apiKey: 'your-api-key'\n * });\n * app.mount('#app');\n * ```\n */\n\nimport { \n inject, \n provide, \n ref, \n computed, \n onMounted, \n onUnmounted,\n watch,\n type App, \n type InjectionKey,\n type Ref\n} from 'vue';\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrackPageViews?: boolean;\n autoTrackSessions?: boolean;\n debug?: boolean;\n}\n\nexport interface FlowGridInstance {\n // Core\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n // Analytics\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n // Ecommerce\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n // State\n isReady: Ref<boolean>;\n sessionId: Ref<string | null>;\n}\n\n// ============================================================================\n// INJECTION KEY\n// ============================================================================\n\nconst FlowGridKey: InjectionKey<FlowGridInstance> = Symbol('FlowGrid');\n\n// ============================================================================\n// PLUGIN\n// ============================================================================\n\n/**\n * Vue plugin for FlowGrid SDK.\n * \n * @example\n * ```ts\n * import { createApp } from 'vue';\n * import { FlowGridPlugin } from 'flowgrid-sdk/vue';\n * \n * createApp(App)\n * .use(FlowGridPlugin, {\n * webId: 'web_123',\n * endpoint: 'https://api.flowgrid.io',\n * apiKey: 'key_abc',\n * autoTrackPageViews: true\n * })\n * .mount('#app');\n * ```\n */\nexport const FlowGridPlugin = {\n install(app: App, options: FlowGridConfig) {\n const { webId, endpoint, apiKey, debug = false } = options;\n\n const isReady = ref(false);\n const sessionId = ref<string | null>(null);\n\n // Initialize SDK instances\n const instance: FlowGridInstance = {\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n isReady,\n sessionId,\n };\n\n // Auto-start session\n if (options.autoTrackSessions !== false && typeof window !== 'undefined') {\n instance.sessions.start({\n referrer: document.referrer,\n landingPage: window.location.pathname,\n }).then((result) => {\n sessionId.value = result.response?.sessionId || null;\n isReady.value = true;\n if (debug) console.log('[FlowGrid] Session started:', sessionId.value);\n });\n\n // End session on unload\n window.addEventListener('beforeunload', () => {\n if (sessionId.value) {\n instance.sessions.end(sessionId.value);\n }\n });\n } else {\n isReady.value = true;\n }\n\n // Provide globally\n app.provide(FlowGridKey, instance);\n\n // Also add to globalProperties for Options API\n app.config.globalProperties.$flowgrid = instance;\n }\n};\n\n// ============================================================================\n// COMPOSABLES\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useFlowGrid } from 'flowgrid-sdk/vue';\n * \n * const { events, trackEvent } = useFlowGrid();\n * \n * const handleClick = () => {\n * trackEvent('button_clicked', { id: 'cta' });\n * };\n * </script>\n * ```\n */\nexport function useFlowGrid() {\n const instance = inject(FlowGridKey);\n \n if (!instance) {\n throw new Error('FlowGrid plugin not installed. Call app.use(FlowGridPlugin, config) first.');\n }\n\n const trackEvent = async (name: string, properties?: Record<string, unknown>) => {\n await instance.events.track({ eventName: name, properties: properties || {} });\n };\n\n const identifyUser = async (userId: string, traits?: Record<string, unknown>) => {\n await instance.identify.user({ userId, traits: traits || {} });\n };\n\n return {\n ...instance,\n trackEvent,\n identifyUser,\n };\n}\n\n/**\n * Track page views with Vue Router integration.\n * \n * @example\n * ```vue\n * <script setup>\n * import { usePageView } from 'flowgrid-sdk/vue';\n * import { useRoute } from 'vue-router';\n * \n * const route = useRoute();\n * usePageView(() => route.path);\n * </script>\n * ```\n */\nexport function usePageView(pathGetter?: () => string) {\n const { pageViews, isReady } = useFlowGrid();\n\n const trackPage = () => {\n if (typeof window === 'undefined') return;\n \n pageViews.track({\n url: window.location.href,\n path: pathGetter ? pathGetter() : window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n });\n };\n\n onMounted(() => {\n if (isReady.value) {\n trackPage();\n }\n });\n\n // Watch for path changes if getter provided\n if (pathGetter) {\n watch(pathGetter, () => {\n if (isReady.value) {\n trackPage();\n }\n });\n }\n}\n\n/**\n * Track an event on component mount.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useTrackEvent } from 'flowgrid-sdk/vue';\n * \n * useTrackEvent('pricing_page_viewed', { source: 'navbar' });\n * </script>\n * ```\n */\nexport function useTrackEvent(eventName: string, properties?: Record<string, unknown>) {\n const { trackEvent, isReady } = useFlowGrid();\n\n onMounted(() => {\n if (isReady.value) {\n trackEvent(eventName, properties);\n }\n });\n}\n\n/**\n * Use an experiment variant.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useExperiment } from 'flowgrid-sdk/vue';\n * \n * const { variant, isLoading } = useExperiment('checkout_v2', 'user_123');\n * </script>\n * \n * <template>\n * <NewCheckout v-if=\"variant === 'treatment'\" />\n * <OldCheckout v-else />\n * </template>\n * ```\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const variant = ref<string | null>(null);\n const isLoading = ref(true);\n\n onMounted(async () => {\n try {\n await experiment.trackExposure(experimentId, userId, 'control');\n variant.value = 'control'; // Would come from API\n } finally {\n isLoading.value = false;\n }\n });\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useFeatureFlag } from 'flowgrid-sdk/vue';\n * \n * const { isEnabled, isLoading } = useFeatureFlag('new_dashboard');\n * </script>\n * \n * <template>\n * <NewDashboard v-if=\"isEnabled\" />\n * <OldDashboard v-else />\n * </template>\n * ```\n */\nexport function useFeatureFlag(flagKey: string, userId?: string) {\n const { featureFlag } = useFlowGrid();\n const isEnabled = ref(false);\n const isLoading = ref(true);\n\n onMounted(async () => {\n try {\n await featureFlag.trackEvaluation({\n flagKey,\n userId,\n result: false,\n reason: 'default'\n });\n isEnabled.value = false; // Would come from API\n } finally {\n isLoading.value = false;\n }\n });\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Identify a user.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useIdentify } from 'flowgrid-sdk/vue';\n * \n * const props = defineProps<{ userId: string; email: string }>();\n * \n * useIdentify(() => props.userId, () => ({ email: props.email }));\n * </script>\n * ```\n */\nexport function useIdentify(\n userIdGetter: () => string | null,\n traitsGetter?: () => Record<string, unknown>\n) {\n const { identifyUser, isReady } = useFlowGrid();\n\n watch(\n [userIdGetter, isReady],\n ([userId, ready]) => {\n if (ready && userId) {\n identifyUser(userId, traitsGetter?.() || {});\n }\n },\n { immediate: true }\n );\n}\n\n/**\n * Ecommerce composable.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useEcommerce } from 'flowgrid-sdk/vue';\n * \n * const { trackProductView, trackAddToCart } = useEcommerce();\n * \n * onMounted(() => {\n * trackProductView(product);\n * });\n * </script>\n * ```\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n });\n };\n\n const trackAddToCart = async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n };\n\n const trackCheckoutStart = async (cartItems: Array<{ productId: string; name: string; price: number; quantity: number }>) => {\n await checkout.begin({\n cart: {\n cartId: 'current',\n items: cartItems.map(i => ({\n productId: i.productId,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n discountTotal: 0,\n total: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n currency: 'USD' as any,\n itemCount: cartItems.length,\n },\n });\n };\n\n const trackPurchase = async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n };\n\n return {\n trackProductView,\n trackAddToCart,\n trackCheckoutStart,\n trackPurchase,\n products,\n cart,\n checkout,\n purchases,\n };\n}\n\n// ============================================================================\n// VUE ROUTER PLUGIN\n// ============================================================================\n\n/**\n * Vue Router plugin for automatic page view tracking.\n * \n * @example\n * ```ts\n * import { createRouter } from 'vue-router';\n * import { createRouterPlugin } from 'flowgrid-sdk/vue';\n * \n * const router = createRouter({ ... });\n * router.afterEach(createRouterPlugin());\n * ```\n */\nexport function createRouterPlugin() {\n return (to: { path: string; name?: string }, from: { path: string }) => {\n // This would be called from the consuming app after router is set up\n if (typeof window === 'undefined') return;\n \n // The app should call usePageView or manually track\n console.log('[FlowGrid] Route change:', from.path, '->', to.path);\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n FlowGridPlugin,\n useFlowGrid,\n usePageView,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n createRouterPlugin,\n};\n"],"names":["root","factory","exports","module","require","e","define","amd","this","__WEBPACK_EXTERNAL_MODULE__272__","__WEBPACK_EXTERNAL_MODULE__12__","__WEBPACK_EXTERNAL_MODULE__594__","__WEBPACK_EXTERNAL_MODULE__500__","Error","code","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","FTRPC","constructor","webId","endpoint","apiKey","length","init","eventName","properties","request","validateInput","url","type","body","JSON","stringify","web_id","event_name","controller","AbortController","timeoutId","setTimeout","abort","res","fetch","method","headers","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","TrackPrompt","trackSubmission","promptId","promptType","model","inputTokens","conversationId","trackResponse","responseTime","outputTokens","completed","qualityScore","trackFeedback","feedbackType","rating","comment","trackConversation","turnCount","totalDuration","Experiment","track","variant","assign","experimentId","variantId","trackConversion","metricName","value","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","count","trackClick","trackForm","trackSearch","query","resultsCount","resultClicked","clickedPosition","filters","trackError","message","stack","errorType","fatal","userAction","Identify","anonymousId","traits","updateTraits","alias","previousId","group","groupId","reset","Funnels","funnelId","description","steps","trackStep","step","stepNumber","trackComplete","trackAbandon","lastStep","analyze","compare","baselineFilter","comparisonFilter","list","Products","view","product","productId","brand","price","currency","imageUrl","reviewCount","stockStatus","attributes","searchQuery","impression","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","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","CustomerLTV","getCustomerValue","recordAcquisitionCost","channel","updateSegment","segment","getTopCustomers","sortBy","sortOrder","Subscriptions","subscriptionId","plan","mrr","billingCycle","trialDays","coupon","isTrialing","change","mrrDiff","newMrr","amount","previousMrr","previousPlan","newPlan","mrrChange","changeType","cancel","lostMrr","feedback","immediate","renew","trialConverted","trialExpired","usePathname","useSearchParams","createContext","Symbol","nav","pathname","URLSearchParams","search"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://FlowGridSDK/webpack/universalModuleDefinition","webpack://FlowGridSDK/external umd \"next/navigation\"","webpack://FlowGridSDK/external umd \"react/jsx-runtime\"","webpack://FlowGridSDK/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"react\",\"root\":\"React\"}","webpack://FlowGridSDK/external umd {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"amd\":\"vue\",\"root\":\"Vue\"}","webpack://FlowGridSDK/webpack/bootstrap","webpack://FlowGridSDK/webpack/runtime/define property getters","webpack://FlowGridSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FlowGridSDK/./src/lib/client/ftrpc.ts","webpack://FlowGridSDK/./src/lib/features/core/activation.ts","webpack://FlowGridSDK/./src/lib/features/core/track-feature.ts","webpack://FlowGridSDK/./src/lib/features/core/track-prompt.ts","webpack://FlowGridSDK/./src/lib/features/core/experiment.ts","webpack://FlowGridSDK/./src/lib/features/core/feature-flag.ts","webpack://FlowGridSDK/./src/lib/features/analytics/page-views.ts","webpack://FlowGridSDK/./src/lib/features/analytics/sessions.ts","webpack://FlowGridSDK/./src/lib/features/analytics/events.ts","webpack://FlowGridSDK/./src/lib/features/analytics/identify.ts","webpack://FlowGridSDK/./src/lib/features/analytics/funnels.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/products.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/cart.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/checkout.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/purchases.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/ltv.ts","webpack://FlowGridSDK/./src/lib/features/ecommerce/subscriptions.ts","webpack://FlowGridSDK/./src/lib/frameworks/nextjs/client.tsx","webpack://FlowGridSDK/./src/lib/frameworks/react/index.tsx","webpack://FlowGridSDK/./src/lib/frameworks/vue/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react/jsx-runtime\"), require(\"react\"), require(\"vue\"), (function webpackLoadOptionalExternalModule() { try { return require(\"next/navigation\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react/jsx-runtime\", \"react\", \"vue\", \"next/navigation\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FlowGridSDK\"] = factory(require(\"react/jsx-runtime\"), require(\"react\"), require(\"vue\"), (function webpackLoadOptionalExternalModule() { try { return require(\"next/navigation\"); } catch(e) {} }()));\n\telse\n\t\troot[\"FlowGridSDK\"] = factory(root[\"react/jsx-runtime\"], root[\"React\"], root[\"Vue\"], root[\"next/navigation\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__272__, __WEBPACK_EXTERNAL_MODULE__12__, __WEBPACK_EXTERNAL_MODULE__594__, __WEBPACK_EXTERNAL_MODULE__500__) => {\nreturn ","if(typeof __WEBPACK_EXTERNAL_MODULE__500__ === 'undefined') { var e = new Error(\"Cannot find module 'next/navigation'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__500__;","module.exports = __WEBPACK_EXTERNAL_MODULE__272__;","module.exports = __WEBPACK_EXTERNAL_MODULE__12__;","module.exports = __WEBPACK_EXTERNAL_MODULE__594__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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))","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 - Prompt & AI Interaction Tracking\n * @module features/core/track-prompt\n * \n * @description\n * Track AI prompt interactions, completions, and user feedback\n * for AI-powered features.\n * \n * @useCases\n * - Track AI prompt submissions\n * - Monitor response quality\n * - Measure user satisfaction\n * - Analyze prompt patterns\n * - Optimize AI features\n * \n * @metrics\n * - Prompts per user\n * - Response acceptance rate\n * - Average response time\n * - User satisfaction score\n * - Token usage\n * \n * @chartData\n * - Line chart: Prompts over time\n * - Bar chart: Prompts by category\n * - Histogram: Response time distribution\n * - Gauge: Satisfaction score\n * \n * @example\n * ```typescript\n * const trackPrompt = new TrackPrompt(webId, endpoint, apiKey);\n * \n * await trackPrompt.create({\n * eventName: 'ai_completion',\n * properties: { \n * promptType: 'code_suggestion',\n * accepted: true \n * }\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 prompt events.\n */\nexport interface PromptConfig {\n /** Event name */\n eventName: string;\n /** Event properties */\n properties: Record<string, unknown>;\n}\n\n/**\n * AI prompt submission configuration.\n */\nexport interface PromptSubmissionConfig {\n /** Prompt ID */\n promptId: string;\n /** User ID */\n userId?: string;\n /** Prompt text (may be truncated/hashed for privacy) */\n promptText?: string;\n /** Prompt category/type */\n promptType: string;\n /** Model used */\n model?: string;\n /** Input token count */\n inputTokens?: number;\n /** Session/conversation ID */\n conversationId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * AI response configuration.\n */\nexport interface PromptResponseConfig {\n /** Prompt ID */\n promptId: string;\n /** Response time (ms) */\n responseTime: number;\n /** Output token count */\n outputTokens?: number;\n /** Whether response completed */\n completed: boolean;\n /** Error if any */\n error?: string;\n /** Response quality (if auto-detected) */\n qualityScore?: number;\n}\n\n/**\n * User feedback on AI response.\n */\nexport interface PromptFeedbackConfig {\n /** Prompt ID */\n promptId: string;\n /** User ID */\n userId?: string;\n /** Feedback type */\n feedbackType: 'accepted' | 'rejected' | 'edited' | 'thumbs_up' | 'thumbs_down';\n /** Rating (1-5) */\n rating?: number;\n /** User comment */\n comment?: string;\n}\n\n/**\n * Prompt tracking response.\n */\nexport interface PromptResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n promptId?: string;\n };\n timestamp: string;\n}\n\n/**\n * Prompt analytics data.\n */\nexport interface PromptAnalyticsData {\n /** Summary metrics */\n summary: {\n totalPrompts: number;\n uniqueUsers: number;\n avgResponseTime: number;\n acceptanceRate: number;\n avgSatisfactionScore: number;\n totalTokensUsed: number;\n errorRate: number;\n };\n /** Usage by prompt type */\n byType: Array<{\n promptType: string;\n count: number;\n acceptanceRate: number;\n avgResponseTime: number;\n avgTokens: number;\n }>;\n /** Usage by model */\n byModel: Array<{\n model: string;\n count: number;\n avgResponseTime: number;\n errorRate: number;\n }>;\n /** Feedback breakdown */\n feedback: {\n accepted: number;\n rejected: number;\n edited: number;\n thumbsUp: number;\n thumbsDown: number;\n };\n /** Trends */\n trends: TimeSeriesData;\n}\n\n// ============================================================================\n// TRACK PROMPT CLASS\n// ============================================================================\n\n/**\n * TrackPrompt - Track AI prompt interactions.\n * \n * @extends FTRPC\n * \n * @description\n * Provides prompt tracking including:\n * - Prompt submissions\n * - Response tracking\n * - User feedback\n * - Quality metrics\n * - Usage analytics\n * \n * @example\n * ```typescript\n * const trackPrompt = new TrackPrompt(webId, endpoint, apiKey);\n * \n * // Track prompt submission\n * await trackPrompt.trackSubmission({\n * promptId: 'prompt_123',\n * userId: 'user_456',\n * promptType: 'code_completion',\n * model: 'gpt-4',\n * inputTokens: 150\n * });\n * \n * // Track response\n * await trackPrompt.trackResponse({\n * promptId: 'prompt_123',\n * responseTime: 1200,\n * outputTokens: 300,\n * completed: true\n * });\n * \n * // Track user feedback\n * await trackPrompt.trackFeedback({\n * promptId: 'prompt_123',\n * feedbackType: 'accepted',\n * rating: 5\n * });\n * ```\n */\nexport class TrackPrompt extends FTRPC {\n /**\n * Creates and tracks a prompt event.\n * \n * @param config - Prompt configuration\n * @returns Promise resolving to prompt response\n */\n async create(config: PromptConfig): Promise<PromptResponse> {\n return await this.init(config.eventName, {\n ...config.properties,\n type: \"prompt\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a prompt submission.\n * \n * @param config - Prompt submission configuration\n * @returns Promise resolving to prompt response\n */\n async trackSubmission(config: PromptSubmissionConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_submitted\", {\n type: \"prompt\",\n subtype: \"submission\",\n promptId: config.promptId,\n userId: config.userId,\n promptType: config.promptType,\n model: config.model,\n inputTokens: config.inputTokens,\n conversationId: config.conversationId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a prompt response.\n * \n * @param config - Prompt response configuration\n * @returns Promise resolving to prompt response\n */\n async trackResponse(config: PromptResponseConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_response\", {\n type: \"prompt\",\n subtype: \"response\",\n promptId: config.promptId,\n responseTime: config.responseTime,\n outputTokens: config.outputTokens,\n completed: config.completed,\n error: config.error,\n qualityScore: config.qualityScore,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks user feedback on a prompt response.\n * \n * @param config - Prompt feedback configuration\n * @returns Promise resolving to prompt response\n */\n async trackFeedback(config: PromptFeedbackConfig): Promise<PromptResponse> {\n return await this.init(\"prompt_feedback\", {\n type: \"prompt\",\n subtype: \"feedback\",\n promptId: config.promptId,\n userId: config.userId,\n feedbackType: config.feedbackType,\n rating: config.rating,\n comment: config.comment,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a conversation/multi-turn prompt session.\n * \n * @param conversationId - Conversation ID\n * @param userId - User ID\n * @param turnCount - Number of turns\n * @param totalDuration - Total conversation duration (ms)\n * @returns Promise resolving to prompt response\n */\n async trackConversation(\n conversationId: string,\n userId: string,\n turnCount: number,\n totalDuration: number\n ): Promise<PromptResponse> {\n return await this.init(\"prompt_conversation\", {\n type: \"prompt\",\n subtype: \"conversation\",\n conversationId,\n userId,\n turnCount,\n totalDuration,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets prompt analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to prompt analytics\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<PromptAnalyticsData> {\n return await this.init(\"get_prompt_analytics\", {\n type: \"query\",\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default TrackPrompt;\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 Product Analytics - Funnel Analysis\n * @module features/analytics/funnels\n * \n * @description\n * Define and analyze conversion funnels to understand user journeys,\n * identify drop-off points, and optimize conversion rates.\n * \n * @useCases\n * - Track signup/onboarding completion rates\n * - Analyze checkout funnel performance\n * - Identify where users drop off in key flows\n * - Compare funnel performance across segments\n * - A/B test different funnel variations\n * \n * @metrics\n * - Step-by-step conversion rates\n * - Drop-off rates at each step\n * - Time to complete each step\n * - Overall funnel conversion rate\n * - Funnel completion time\n * \n * @chartData\n * - Funnel chart: Step-by-step visualization\n * - Bar chart: Conversion by step\n * - Line chart: Funnel performance over time\n * - Comparison: Funnel variants side-by-side\n * \n * @example\n * ```typescript\n * const funnels = new Funnels(webId, endpoint, apiKey);\n * \n * // Track funnel step\n * await funnels.trackStep({\n * funnelId: 'checkout_funnel',\n * step: 'add_payment',\n * stepNumber: 3,\n * userId: 'user_123'\n * });\n * \n * // Get funnel analysis\n * const analysis = await funnels.analyze('checkout_funnel');\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n FunnelStep,\n FunnelAnalysis,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Funnel definition configuration.\n */\nexport interface FunnelDefinition {\n /** Unique funnel identifier */\n funnelId: string;\n /** Funnel name for display */\n name: string;\n /** Funnel description */\n description?: string;\n /** Ordered list of step definitions */\n steps: Array<{\n /** Step name */\n name: string;\n /** Event(s) that trigger this step */\n events: string[];\n /** Step description */\n description?: string;\n /** Whether step is optional */\n optional?: boolean;\n }>;\n}\n\n/**\n * Configuration for tracking a funnel step.\n */\nexport interface FunnelStepConfig {\n /** Funnel identifier */\n funnelId: string;\n /** Step name or event */\n step: string;\n /** Step number (1-indexed) */\n stepNumber: number;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Funnel step response from API.\n */\nexport interface FunnelStepResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n funnelId: string;\n step: string;\n tracked: boolean;\n previousStep?: string;\n timeFromPrevious?: number;\n };\n timestamp: string;\n}\n\n/**\n * Funnel analytics data for charts.\n */\nexport interface FunnelAnalyticsData {\n /** Funnel definition */\n funnel: FunnelDefinition;\n /** Analysis results */\n analysis: FunnelAnalysis;\n /** Step-by-step data for visualization */\n visualization: Array<{\n step: string;\n entered: number;\n completed: number;\n conversionRate: number;\n dropOffRate: number;\n avgTime: number;\n }>;\n /** Performance over time */\n trendData: TimeSeriesData;\n}\n\n/**\n * Funnel comparison data.\n */\nexport interface FunnelComparisonData {\n /** Base funnel data */\n baseline: FunnelAnalyticsData;\n /** Comparison funnel data */\n comparison: FunnelAnalyticsData;\n /** Step-by-step comparison */\n stepComparison: Array<{\n step: string;\n baselineRate: number;\n comparisonRate: number;\n difference: number;\n significant: boolean;\n }>;\n}\n\n// ============================================================================\n// FUNNELS CLASS\n// ============================================================================\n\n/**\n * Funnels - Define and analyze conversion funnels.\n * \n * @extends FTRPC\n * \n * @description\n * Provides funnel analysis capabilities including:\n * - Funnel definition and management\n * - Step-by-step event tracking\n * - Conversion and drop-off analysis\n * - Time-to-completion tracking\n * - Segment-based funnel comparison\n * \n * @example\n * ```typescript\n * const funnels = new Funnels(webId, endpoint, apiKey);\n * \n * // Define a signup funnel\n * await funnels.define({\n * funnelId: 'signup_funnel',\n * name: 'User Signup',\n * steps: [\n * { name: 'Visit Landing', events: ['page_view_landing'] },\n * { name: 'Click Signup', events: ['signup_clicked'] },\n * { name: 'Submit Form', events: ['signup_submitted'] },\n * { name: 'Verify Email', events: ['email_verified'] }\n * ]\n * });\n * \n * // Analyze funnel performance\n * const analysis = await funnels.analyze('signup_funnel', {\n * range: 'last30days'\n * });\n * ```\n */\nexport class Funnels extends FTRPC {\n /**\n * Defines a new funnel or updates existing.\n * \n * @param config - Funnel definition\n * @returns Promise resolving to definition response\n * \n * @example\n * ```typescript\n * await funnels.define({\n * funnelId: 'checkout_funnel',\n * name: 'Checkout Flow',\n * steps: [\n * { name: 'View Cart', events: ['view_cart'] },\n * { name: 'Begin Checkout', events: ['begin_checkout'] },\n * { name: 'Add Shipping', events: ['add_shipping_info'] },\n * { name: 'Add Payment', events: ['add_payment_info'] },\n * { name: 'Purchase', events: ['purchase'] }\n * ]\n * });\n * ```\n */\n async define(config: FunnelDefinition): Promise<FunnelStepResponse> {\n return await this.init(\"define_funnel\", {\n type: \"define_funnel\",\n funnelId: config.funnelId,\n name: config.name,\n description: config.description,\n steps: config.steps,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks a funnel step completion.\n * \n * @param config - Funnel step configuration\n * @returns Promise resolving to step response\n * \n * @example\n * ```typescript\n * // Track user progressing through checkout\n * await funnels.trackStep({\n * funnelId: 'checkout_funnel',\n * step: 'add_shipping_info',\n * stepNumber: 3,\n * userId: 'user_123',\n * properties: { shippingMethod: 'express' }\n * });\n * ```\n */\n async trackStep(config: FunnelStepConfig): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_step\", {\n type: \"funnel_step\",\n funnelId: config.funnelId,\n step: config.step,\n stepNumber: config.stepNumber,\n userId: config.userId,\n sessionId: config.sessionId,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks funnel completion.\n * \n * @param funnelId - Funnel identifier\n * @param userId - User who completed\n * @param properties - Completion properties\n * @returns Promise resolving to completion response\n */\n async trackComplete(\n funnelId: string,\n userId?: string,\n properties?: Record<string, unknown>\n ): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_complete\", {\n type: \"funnel_complete\",\n funnelId,\n userId,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks funnel abandonment.\n * \n * @param funnelId - Funnel identifier\n * @param lastStep - Last completed step\n * @param userId - User who abandoned\n * @param reason - Optional abandonment reason\n * @returns Promise resolving to abandonment response\n */\n async trackAbandon(\n funnelId: string,\n lastStep: string,\n userId?: string,\n reason?: string\n ): Promise<FunnelStepResponse> {\n return await this.init(\"funnel_abandon\", {\n type: \"funnel_abandon\",\n funnelId,\n lastStep,\n userId,\n reason,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Analyzes funnel performance.\n * \n * @param funnelId - Funnel identifier\n * @param filter - Date range filter\n * @returns Promise resolving to funnel analytics\n * \n * @example\n * ```typescript\n * const analysis = await funnels.analyze('checkout_funnel', {\n * range: 'last7days'\n * });\n * \n * // Funnel visualization data\n * const funnelData = analysis.visualization.map(step => ({\n * name: step.step,\n * value: step.entered,\n * conversion: step.conversionRate\n * }));\n * \n * // Overall conversion rate\n * console.log(`Conversion: ${analysis.analysis.overallConversionRate}%`);\n * ```\n */\n async analyze(\n funnelId: string,\n filter?: DateRangeFilter\n ): Promise<FunnelAnalyticsData> {\n return await this.init(\"analyze_funnel\", {\n type: \"query\",\n funnelId,\n filter: filter || { range: \"last30days\" },\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Compares two funnel periods or segments.\n * \n * @param funnelId - Funnel identifier\n * @param baselineFilter - Baseline period filter\n * @param comparisonFilter - Comparison period filter\n * @returns Promise resolving to comparison data\n * \n * @example\n * ```typescript\n * const comparison = await funnels.compare(\n * 'checkout_funnel',\n * { range: 'last30days' },\n * { range: 'last60days' }\n * );\n * \n * // Side-by-side comparison chart\n * const comparisonData = comparison.stepComparison.map(s => ({\n * step: s.step,\n * baseline: s.baselineRate,\n * comparison: s.comparisonRate\n * }));\n * ```\n */\n async compare(\n funnelId: string,\n baselineFilter: DateRangeFilter,\n comparisonFilter: DateRangeFilter\n ): Promise<FunnelComparisonData> {\n return await this.init(\"compare_funnel\", {\n type: \"query\",\n funnelId,\n baselineFilter,\n comparisonFilter,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Lists all defined funnels.\n * \n * @returns Promise resolving to funnel list\n */\n async list(): Promise<FunnelDefinition[]> {\n return await this.init(\"list_funnels\", {\n type: \"query\",\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Funnels;\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 Ecommerce - Customer Lifetime Value (LTV)\n * @module features/ecommerce/ltv\n * \n * @description\n * Calculate and track customer lifetime value to understand\n * customer worth and optimize acquisition costs.\n * \n * @useCases\n * - Calculate customer LTV\n * - Segment customers by value\n * - Track LTV trends over time\n * - Identify high-value customers\n * - Optimize acquisition spend (LTV:CAC)\n * \n * @metrics\n * - Average LTV\n * - LTV by cohort\n * - LTV by segment\n * - LTV:CAC ratio\n * - Customer value distribution\n * \n * @chartData\n * - Line chart: LTV by cohort over time\n * - Bar chart: LTV by segment\n * - Histogram: Customer value distribution\n * - KPI: Average LTV, LTV:CAC\n * \n * @example\n * ```typescript\n * const ltv = new CustomerLTV(webId, endpoint, apiKey);\n * \n * // Get customer LTV\n * const customerValue = await ltv.getCustomerValue('user_123');\n * \n * // Get LTV analytics\n * const analytics = await ltv.getAnalytics({ range: 'last90days' });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { \n MoneyValue,\n CurrencyCode,\n DateRangeFilter,\n TimeSeriesData\n} from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Customer value data.\n */\nexport interface CustomerValueData {\n /** Customer/user ID */\n userId: string;\n /** Total revenue from customer */\n totalRevenue: MoneyValue;\n /** Number of orders */\n orderCount: number;\n /** Average order value */\n averageOrderValue: MoneyValue;\n /** Predicted future value */\n predictedLTV: MoneyValue;\n /** Customer segment */\n segment: 'low' | 'medium' | 'high' | 'vip';\n /** Days since first purchase */\n customerAge: number;\n /** Days since last purchase */\n daysSinceLastPurchase: number;\n /** Purchase frequency (orders per month) */\n purchaseFrequency: number;\n}\n\n/**\n * Configuration for recording acquisition cost.\n */\nexport interface AcquisitionCostConfig {\n /** Customer/user ID */\n userId: string;\n /** Acquisition cost */\n cost: MoneyValue;\n /** Acquisition channel */\n channel: string;\n /** Campaign (if applicable) */\n campaign?: string;\n}\n\n/**\n * LTV event response from API.\n */\nexport interface LTVResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n userId: string;\n ltv: number;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * LTV analytics data for charts.\n */\nexport interface LTVAnalyticsData {\n /** Summary metrics */\n summary: {\n averageLTV: MoneyValue;\n medianLTV: MoneyValue;\n totalCustomerValue: MoneyValue;\n averageCAC: MoneyValue;\n ltvCacRatio: number;\n averageOrderValue: MoneyValue;\n averageOrdersPerCustomer: number;\n };\n /** LTV by customer segment */\n bySegment: Array<{\n segment: string;\n customerCount: number;\n averageLTV: MoneyValue;\n totalRevenue: MoneyValue;\n percentageOfCustomers: number;\n percentageOfRevenue: number;\n }>;\n /** LTV by cohort */\n byCohort: Array<{\n cohort: string;\n customerCount: number;\n averageLTV: MoneyValue;\n ltvProgression: number[];\n }>;\n /** LTV by acquisition channel */\n byChannel: Array<{\n channel: string;\n customers: number;\n averageLTV: MoneyValue;\n averageCAC: MoneyValue;\n ltvCacRatio: number;\n roi: number;\n }>;\n /** LTV distribution */\n distribution: Array<{\n range: string;\n count: number;\n percentage: number;\n }>;\n /** LTV trend over time */\n trendData: TimeSeriesData;\n}\n\n// ============================================================================\n// CUSTOMER LTV CLASS\n// ============================================================================\n\n/**\n * CustomerLTV - Calculate and track customer lifetime value.\n * \n * @extends FTRPC\n * \n * @description\n * Provides LTV tracking capabilities including:\n * - Customer value calculation\n * - Acquisition cost tracking\n * - LTV:CAC ratio analysis\n * - Customer segmentation by value\n * - Cohort-based LTV analysis\n * \n * @example\n * ```typescript\n * const ltv = new CustomerLTV(webId, endpoint, apiKey);\n * \n * // Get individual customer value\n * const value = await ltv.getCustomerValue('user_123');\n * console.log(`LTV: $${value.totalRevenue.amount / 100}`);\n * \n * // Record acquisition cost\n * await ltv.recordAcquisitionCost({\n * userId: 'user_123',\n * cost: { amount: 5000, currency: 'USD' },\n * channel: 'facebook_ads',\n * campaign: 'spring_campaign'\n * });\n * \n * // Get LTV analytics\n * const analytics = await ltv.getAnalytics();\n * console.log(`LTV:CAC Ratio: ${analytics.summary.ltvCacRatio}`);\n * ```\n */\nexport class CustomerLTV extends FTRPC {\n /**\n * Gets lifetime value data for a specific customer.\n * \n * @param userId - Customer/user identifier\n * @returns Promise resolving to customer value data\n * \n * @example\n * ```typescript\n * const value = await ltv.getCustomerValue('user_123');\n * \n * console.log(`Total Revenue: $${value.totalRevenue.amount / 100}`);\n * console.log(`Orders: ${value.orderCount}`);\n * console.log(`Segment: ${value.segment}`);\n * console.log(`Predicted LTV: $${value.predictedLTV.amount / 100}`);\n * ```\n */\n async getCustomerValue(userId: string): Promise<CustomerValueData> {\n return await this.init(\"get_customer_value\", {\n type: \"ecommerce\",\n subtype: \"get_customer_value\",\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Records customer acquisition cost.\n * \n * @param config - Acquisition cost configuration\n * @returns Promise resolving to LTV response\n * \n * @example\n * ```typescript\n * await ltv.recordAcquisitionCost({\n * userId: 'user_123',\n * cost: { amount: 2500, currency: 'USD' }, // $25.00\n * channel: 'google_ads',\n * campaign: 'brand_terms'\n * });\n * ```\n */\n async recordAcquisitionCost(config: AcquisitionCostConfig): Promise<LTVResponse> {\n return await this.init(\"record_acquisition_cost\", {\n type: \"ecommerce\",\n subtype: \"acquisition_cost\",\n userId: config.userId,\n cost: config.cost,\n channel: config.channel,\n campaign: config.campaign,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Updates customer segment based on value.\n * \n * @param userId - Customer/user identifier\n * @param segment - New segment\n * @returns Promise resolving to LTV response\n */\n async updateSegment(\n userId: string,\n segment: 'low' | 'medium' | 'high' | 'vip'\n ): Promise<LTVResponse> {\n return await this.init(\"update_customer_segment\", {\n type: \"ecommerce\",\n subtype: \"update_customer_segment\",\n userId,\n segment,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets high-value customers.\n * \n * @param limit - Number of customers to return\n * @returns Promise resolving to list of high-value customers\n */\n async getTopCustomers(limit: number = 100): Promise<CustomerValueData[]> {\n return await this.init(\"get_top_customers\", {\n type: \"ecommerce\",\n subtype: \"get_top_customers\",\n limit,\n sortBy: \"totalRevenue\",\n sortOrder: \"desc\",\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Retrieves LTV analytics for dashboards and charts.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to LTV analytics\n * \n * @example\n * ```typescript\n * const analytics = await ltv.getAnalytics({ \n * range: 'last90days' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'Avg LTV', value: analytics.summary.averageLTV.amount },\n * { label: 'LTV:CAC', value: analytics.summary.ltvCacRatio },\n * { label: 'Avg AOV', value: analytics.summary.averageOrderValue.amount }\n * ];\n * \n * // Bar chart - LTV by channel\n * const channelChart = analytics.byChannel.map(c => ({\n * name: c.channel,\n * ltv: c.averageLTV.amount,\n * cac: c.averageCAC.amount\n * }));\n * \n * // Histogram - value distribution\n * const distribution = analytics.distribution.map(d => ({\n * range: d.range,\n * count: d.count\n * }));\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<LTVAnalyticsData> {\n return await this.init(\"get_ltv_analytics\", {\n type: \"ecommerce\",\n subtype: \"get_ltv_analytics\",\n filter: filter || { range: \"last90days\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default CustomerLTV;\n","/**\n * @fileoverview Ecommerce - Subscription & Recurring Revenue\n * @module features/ecommerce/subscriptions\n * \n * @description\n * Track subscription lifecycle events for SaaS and subscription\n * ecommerce businesses.\n * \n * @useCases\n * - Track subscription signups\n * - Monitor subscription changes (upgrades/downgrades)\n * - Track cancellations and churn\n * - Calculate MRR/ARR metrics\n * - Analyze subscription cohorts\n * \n * @metrics\n * - Monthly Recurring Revenue (MRR)\n * - Annual Recurring Revenue (ARR)\n * - Churn rate\n * - Expansion revenue\n * - Net revenue retention\n * \n * @chartData\n * - Line chart: MRR over time\n * - Waterfall: MRR movement\n * - Bar chart: Revenue by plan\n * - Cohort: Subscription retention\n * \n * @example\n * ```typescript\n * const subscriptions = new Subscriptions(webId, endpoint, apiKey);\n * \n * // Track subscription start\n * await subscriptions.start({\n * subscriptionId: 'sub_123',\n * userId: 'user_456',\n * plan: 'pro',\n * mrr: { amount: 4900, currency: 'USD' },\n * billingCycle: 'monthly'\n * });\n * ```\n */\n\nimport { FTRPC } from \"../../client/ftrpc\";\nimport { MoneyValue, CurrencyCode, DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Subscription start configuration.\n */\nexport interface SubscriptionStartConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Plan name */\n plan: string;\n /** Monthly recurring revenue */\n mrr: MoneyValue;\n /** Billing cycle */\n billingCycle: 'monthly' | 'quarterly' | 'yearly';\n /** Trial period (if applicable) */\n trialDays?: number;\n /** Coupon applied */\n coupon?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Subscription change configuration.\n */\nexport interface SubscriptionChangeConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Previous plan */\n previousPlan: string;\n /** New plan */\n newPlan: string;\n /** Previous MRR */\n previousMrr: MoneyValue;\n /** New MRR */\n newMrr: MoneyValue;\n /** Change type */\n changeType: 'upgrade' | 'downgrade' | 'cross_grade';\n}\n\n/**\n * Subscription cancellation configuration.\n */\nexport interface SubscriptionCancelConfig {\n /** Subscription ID */\n subscriptionId: string;\n /** User ID */\n userId: string;\n /** Plan being cancelled */\n plan: string;\n /** Lost MRR */\n lostMrr: MoneyValue;\n /** Cancellation reason */\n reason?: string;\n /** Feedback provided */\n feedback?: string;\n /** Whether cancelled immediately or at period end */\n immediate: boolean;\n}\n\n/**\n * Subscription response from API.\n */\nexport interface SubscriptionResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n subscriptionId: string;\n tracked: boolean;\n };\n timestamp: string;\n}\n\n/**\n * Subscription analytics data.\n */\nexport interface SubscriptionAnalyticsData {\n /** Summary metrics */\n summary: {\n totalMrr: MoneyValue;\n totalArr: MoneyValue;\n activeSubscriptions: number;\n newSubscriptions: number;\n churnedSubscriptions: number;\n churnRate: number;\n expansionMrr: MoneyValue;\n contractionMrr: MoneyValue;\n netMrrMovement: MoneyValue;\n netRevenueRetention: number;\n avgRevenuePerUser: MoneyValue;\n };\n /** MRR by plan */\n byPlan: Array<{\n plan: string;\n subscriptions: number;\n mrr: MoneyValue;\n percentage: number;\n }>;\n /** MRR waterfall */\n mrrMovement: {\n startingMrr: MoneyValue;\n newMrr: MoneyValue;\n expansionMrr: MoneyValue;\n contractionMrr: MoneyValue;\n churnedMrr: MoneyValue;\n endingMrr: MoneyValue;\n };\n /** MRR trend */\n mrrTrend: TimeSeriesData;\n /** Churn by reason */\n churnByReason: Array<{\n reason: string;\n count: number;\n lostMrr: MoneyValue;\n }>;\n /** Trial conversion rate */\n trialMetrics: {\n trialsStarted: number;\n trialsConverted: number;\n conversionRate: number;\n };\n}\n\n// ============================================================================\n// SUBSCRIPTIONS CLASS\n// ============================================================================\n\n/**\n * Subscriptions - Track subscription lifecycle events.\n * \n * @extends FTRPC\n * \n * @description\n * Provides subscription tracking including:\n * - Subscription starts (new MRR)\n * - Plan changes (expansion/contraction)\n * - Cancellations (churned MRR)\n * - Renewals\n * - Trial conversions\n * \n * @example\n * ```typescript\n * const subscriptions = new Subscriptions(webId, endpoint, apiKey);\n * \n * // New subscription\n * await subscriptions.start({\n * subscriptionId: 'sub_abc123',\n * userId: 'user_456',\n * plan: 'professional',\n * mrr: { amount: 9900, currency: 'USD' },\n * billingCycle: 'monthly',\n * trialDays: 14\n * });\n * \n * // Upgrade\n * await subscriptions.change({\n * subscriptionId: 'sub_abc123',\n * userId: 'user_456',\n * previousPlan: 'professional',\n * newPlan: 'enterprise',\n * previousMrr: { amount: 9900, currency: 'USD' },\n * newMrr: { amount: 29900, currency: 'USD' },\n * changeType: 'upgrade'\n * });\n * ```\n */\nexport class Subscriptions extends FTRPC {\n /**\n * Tracks subscription start.\n * \n * @param config - Subscription start configuration\n * @returns Promise resolving to subscription response\n */\n async start(config: SubscriptionStartConfig): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_start\", {\n type: \"ecommerce\",\n subtype: \"subscription_start\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n plan: config.plan,\n mrr: config.mrr,\n billingCycle: config.billingCycle,\n trialDays: config.trialDays,\n coupon: config.coupon,\n isTrialing: (config.trialDays || 0) > 0,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription plan change.\n * \n * @param config - Subscription change configuration\n * @returns Promise resolving to subscription response\n */\n async change(config: SubscriptionChangeConfig): Promise<SubscriptionResponse> {\n const mrrDiff = config.newMrr.amount - config.previousMrr.amount;\n \n return await this.init(\"subscription_change\", {\n type: \"ecommerce\",\n subtype: \"subscription_change\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n previousPlan: config.previousPlan,\n newPlan: config.newPlan,\n previousMrr: config.previousMrr,\n newMrr: config.newMrr,\n mrrChange: mrrDiff,\n changeType: config.changeType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription cancellation.\n * \n * @param config - Cancellation configuration\n * @returns Promise resolving to subscription response\n */\n async cancel(config: SubscriptionCancelConfig): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_cancel\", {\n type: \"ecommerce\",\n subtype: \"subscription_cancel\",\n subscriptionId: config.subscriptionId,\n userId: config.userId,\n plan: config.plan,\n lostMrr: config.lostMrr,\n reason: config.reason,\n feedback: config.feedback,\n immediate: config.immediate,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks subscription renewal.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @param mrr - Renewed MRR\n * @returns Promise resolving to subscription response\n */\n async renew(\n subscriptionId: string,\n userId: string,\n mrr: MoneyValue\n ): Promise<SubscriptionResponse> {\n return await this.init(\"subscription_renew\", {\n type: \"ecommerce\",\n subtype: \"subscription_renew\",\n subscriptionId,\n userId,\n mrr,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks trial conversion to paid.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @param plan - Converted to plan\n * @param mrr - New MRR\n * @returns Promise resolving to subscription response\n */\n async trialConverted(\n subscriptionId: string,\n userId: string,\n plan: string,\n mrr: MoneyValue\n ): Promise<SubscriptionResponse> {\n return await this.init(\"trial_converted\", {\n type: \"ecommerce\",\n subtype: \"trial_converted\",\n subscriptionId,\n userId,\n plan,\n mrr,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Tracks trial expiration without conversion.\n * \n * @param subscriptionId - Subscription ID\n * @param userId - User ID\n * @returns Promise resolving to subscription response\n */\n async trialExpired(\n subscriptionId: string,\n userId: string\n ): Promise<SubscriptionResponse> {\n return await this.init(\"trial_expired\", {\n type: \"ecommerce\",\n subtype: \"trial_expired\",\n subscriptionId,\n userId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Gets subscription analytics for dashboards.\n * \n * @param filter - Date range filter\n * @returns Promise resolving to subscription analytics\n * \n * @example\n * ```typescript\n * const analytics = await subscriptions.getAnalytics({ \n * range: 'thisMonth' \n * });\n * \n * // KPI cards\n * const kpis = [\n * { label: 'MRR', value: analytics.summary.totalMrr.amount },\n * { label: 'Churn Rate', value: analytics.summary.churnRate },\n * { label: 'NRR', value: analytics.summary.netRevenueRetention }\n * ];\n * \n * // Waterfall chart\n * const waterfall = analytics.mrrMovement;\n * \n * // MRR trend line\n * const trend = analytics.mrrTrend.data;\n * ```\n */\n async getAnalytics(filter?: DateRangeFilter): Promise<SubscriptionAnalyticsData> {\n return await this.init(\"get_subscription_analytics\", {\n type: \"ecommerce\",\n subtype: \"get_subscription_analytics\",\n filter: filter || { range: \"thisMonth\" },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport default Subscriptions;\n","/**\n * @fileoverview FlowGrid SDK - Next.js Client Components\n * @module frameworks/nextjs/client\n * \n * @description\n * Client-side components and hooks for Next.js.\n * All exports require 'use client' directive.\n * \n * @example\n * ```tsx\n * // app/providers.tsx\n * 'use client';\n * import { FlowGridProvider } from 'flowgrid-sdk/nextjs/client';\n * \n * export function Providers({ children }) {\n * return (\n * <FlowGridProvider\n * webId={process.env.NEXT_PUBLIC_FLOWGRID_WEB_ID!}\n * endpoint={process.env.NEXT_PUBLIC_FLOWGRID_ENDPOINT!}\n * apiKey={process.env.NEXT_PUBLIC_FLOWGRID_API_KEY!}\n * >\n * {children}\n * </FlowGridProvider>\n * );\n * }\n * ```\n */\n\n'use client';\n\nimport React, { \n createContext, \n useContext, \n useEffect, \n useRef, \n useCallback,\n useMemo,\n useState,\n type ReactNode \n} from 'react';\n\n// Next.js navigation hooks - imported dynamically to avoid type errors when Next.js isn't installed\n// These will be properly typed when used in a Next.js project\nlet usePathname: () => string;\nlet useSearchParams: () => URLSearchParams;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nav = require('next/navigation');\n usePathname = nav.usePathname;\n useSearchParams = nav.useSearchParams;\n} catch {\n // Fallback for non-Next.js environments or when types aren't available\n usePathname = () => typeof window !== 'undefined' ? window.location.pathname : '/';\n useSearchParams = () => typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : new URLSearchParams();\n}\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrackPageViews?: boolean;\n autoTrackSessions?: boolean;\n debug?: boolean;\n}\n\nexport interface FlowGridContextValue {\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n trackEvent: (name: string, properties?: Record<string, unknown>) => Promise<void>;\n identifyUser: (userId: string, traits?: Record<string, unknown>) => Promise<void>;\n isReady: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FlowGridContext = createContext<FlowGridContextValue | null>(null);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface FlowGridProviderProps extends FlowGridConfig {\n children: ReactNode;\n}\n\n/**\n * FlowGrid Provider for Next.js App Router.\n * Use in a Client Component wrapper.\n * \n * @example\n * ```tsx\n * // app/providers.tsx\n * 'use client';\n * \n * import { FlowGridProvider } from 'flowgrid-sdk/nextjs/client';\n * \n * export function Providers({ children }: { children: React.ReactNode }) {\n * return (\n * <FlowGridProvider\n * webId={process.env.NEXT_PUBLIC_FLOWGRID_WEB_ID!}\n * endpoint={process.env.NEXT_PUBLIC_FLOWGRID_ENDPOINT!}\n * apiKey={process.env.NEXT_PUBLIC_FLOWGRID_API_KEY!}\n * >\n * {children}\n * </FlowGridProvider>\n * );\n * }\n * \n * // app/layout.tsx\n * import { Providers } from './providers';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <Providers>{children}</Providers>\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport function FlowGridProvider({ \n children, \n webId, \n endpoint, \n apiKey,\n autoTrackPageViews = true,\n autoTrackSessions = true,\n debug = false\n}: FlowGridProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const sessionIdRef = useRef<string | null>(null);\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Initialize SDK instances\n const sdk = useMemo(() => ({\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n }), [webId, endpoint, apiKey]);\n\n // Helper functions\n const trackEvent = useCallback(async (name: string, properties?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Event:', name, properties);\n await sdk.events.track({ eventName: name, properties: properties || {} });\n }, [sdk.events, debug]);\n\n const identifyUser = useCallback(async (userId: string, traits?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Identify:', userId, traits);\n await sdk.identify.user({ userId, traits: traits || {} });\n }, [sdk.identify, debug]);\n\n // Auto-track sessions\n useEffect(() => {\n if (!autoTrackSessions) return;\n\n const startSession = async () => {\n try {\n const result = await sdk.sessions.start({\n referrer: document.referrer,\n landingPage: pathname,\n });\n sessionIdRef.current = result.response?.sessionId || null;\n setIsReady(true);\n if (debug) console.log('[FlowGrid] Session started:', sessionIdRef.current);\n } catch (err) {\n if (debug) console.error('[FlowGrid] Session start failed:', err);\n setIsReady(true);\n }\n };\n\n startSession();\n\n return () => {\n if (sessionIdRef.current) {\n sdk.sessions.end(sessionIdRef.current);\n }\n };\n }, [autoTrackSessions, sdk.sessions, pathname, debug]);\n\n // Auto-track page views on route change\n useEffect(() => {\n if (!autoTrackPageViews || !isReady) return;\n\n const url = searchParams.toString() \n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n sdk.pageViews.track({\n url: window.location.href,\n path: url,\n title: document.title,\n referrer: document.referrer,\n });\n\n if (debug) console.log('[FlowGrid] Page view:', url);\n }, [pathname, searchParams, autoTrackPageViews, isReady, sdk.pageViews, debug]);\n\n const value: FlowGridContextValue = {\n ...sdk,\n trackEvent,\n identifyUser,\n isReady,\n };\n\n return (\n <FlowGridContext.Provider value={value}>\n {children}\n </FlowGridContext.Provider>\n );\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n */\nexport function useFlowGrid(): FlowGridContextValue {\n const context = useContext(FlowGridContext);\n if (!context) {\n throw new Error('useFlowGrid must be used within a FlowGridProvider');\n }\n return context;\n}\n\n/**\n * Track an event.\n * \n * @example\n * ```tsx\n * 'use client';\n * \n * import { useTrackEvent } from 'flowgrid-sdk/nextjs/client';\n * \n * export function FeatureButton() {\n * const trackEvent = useTrackEvent();\n * \n * return (\n * <button onClick={() => trackEvent('feature_clicked', { id: 'cta' })}>\n * Click me\n * </button>\n * );\n * }\n * ```\n */\nexport function useTrackEvent() {\n const { trackEvent } = useFlowGrid();\n return trackEvent;\n}\n\n/**\n * Get experiment variant.\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const [variant, setVariant] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n experiment.trackExposure(experimentId, userId, 'control');\n setVariant('control');\n setIsLoading(false);\n }, [experiment, experimentId, userId]);\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n */\nexport function useFeatureFlag(flagKey: string, context?: { userId?: string }) {\n const { featureFlag } = useFlowGrid();\n const [isEnabled, setIsEnabled] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n featureFlag.trackEvaluation({\n flagKey,\n userId: context?.userId,\n result: false,\n reason: 'default'\n });\n setIsEnabled(false);\n setIsLoading(false);\n }, [featureFlag, flagKey, context?.userId]);\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Identify user.\n */\nexport function useIdentify(userId: string | null, traits?: Record<string, unknown>) {\n const { identifyUser, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady && userId) {\n identifyUser(userId, traits);\n }\n }, [isReady, userId, traits, identifyUser]);\n}\n\n/**\n * Ecommerce hooks.\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n });\n }, [products]);\n\n const trackAddToCart = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n }, [cart]);\n\n const trackPurchase = useCallback(async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n }, [purchases]);\n\n return { trackProductView, trackAddToCart, trackPurchase, products, cart, checkout, purchases };\n}\n\n// ============================================================================\n// PAGE VIEW COMPONENT\n// ============================================================================\n\n/**\n * Component to track page views in App Router.\n * Add to your root layout.\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { PageViewTracker } from 'flowgrid-sdk/nextjs/client';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <Providers>\n * <PageViewTracker />\n * {children}\n * </Providers>\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport function PageViewTracker() {\n const pathname = usePathname();\n const { pageViews, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (!isReady) return;\n\n pageViews.track({\n url: window.location.href,\n path: pathname,\n title: document.title,\n referrer: document.referrer,\n });\n }, [pathname, isReady, pageViews]);\n\n return null;\n}\n\nexport default {\n FlowGridProvider,\n useFlowGrid,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n PageViewTracker,\n};\n","/**\n * @fileoverview FlowGrid SDK - React Integration\n * @module frameworks/react\n * \n * @description\n * React hooks and context provider for FlowGrid SDK.\n * All hooks are client-side only (use 'use client' in Next.js App Router).\n * \n * @example\n * ```tsx\n * // App.tsx - Wrap your app\n * import { FlowGridProvider } from 'flowgrid-sdk/react';\n * \n * function App() {\n * return (\n * <FlowGridProvider \n * webId=\"your-web-id\"\n * endpoint=\"https://api.flowgrid.io\"\n * apiKey=\"your-api-key\"\n * >\n * <YourApp />\n * </FlowGridProvider>\n * );\n * }\n * ```\n */\n\n'use client'; // For Next.js App Router compatibility\n\nimport React, { \n createContext, \n useContext, \n useEffect, \n useRef, \n useCallback,\n useMemo,\n useState,\n type ReactNode \n} from 'react';\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n /** Auto-track page views (default: true) */\n autoTrackPageViews?: boolean;\n /** Auto-track sessions (default: true) */\n autoTrackSessions?: boolean;\n /** Enable debug mode (default: false) */\n debug?: boolean;\n}\n\nexport interface FlowGridContextValue {\n // Core\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n // Analytics\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n // Ecommerce\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n // Helpers\n trackEvent: (name: string, properties?: Record<string, unknown>) => Promise<void>;\n identifyUser: (userId: string, traits?: Record<string, unknown>) => Promise<void>;\n isReady: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FlowGridContext = createContext<FlowGridContextValue | null>(null);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface FlowGridProviderProps extends FlowGridConfig {\n children: ReactNode;\n}\n\n/**\n * FlowGrid Provider - Wrap your app to enable analytics.\n * \n * @example\n * ```tsx\n * <FlowGridProvider\n * webId=\"web_123\"\n * endpoint=\"https://api.flowgrid.io\"\n * apiKey=\"key_abc\"\n * autoTrackPageViews={true}\n * >\n * <App />\n * </FlowGridProvider>\n * ```\n */\nexport function FlowGridProvider({ \n children, \n webId, \n endpoint, \n apiKey,\n autoTrackPageViews = true,\n autoTrackSessions = true,\n debug = false\n}: FlowGridProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const sessionIdRef = useRef<string | null>(null);\n\n // Initialize SDK instances\n const sdk = useMemo(() => ({\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n }), [webId, endpoint, apiKey]);\n\n // Helper functions\n const trackEvent = useCallback(async (name: string, properties?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Event:', name, properties);\n await sdk.events.track({ eventName: name, properties: properties || {} });\n }, [sdk.events, debug]);\n\n const identifyUser = useCallback(async (userId: string, traits?: Record<string, unknown>) => {\n if (debug) console.log('[FlowGrid] Identify:', userId, traits);\n await sdk.identify.user({ userId, traits: traits || {} });\n }, [sdk.identify, debug]);\n\n // Auto-track sessions\n useEffect(() => {\n if (!autoTrackSessions || typeof window === 'undefined') return;\n\n const startSession = async () => {\n try {\n const result = await sdk.sessions.start({\n referrer: document.referrer,\n landingPage: window.location.pathname,\n });\n sessionIdRef.current = result.response?.sessionId || null;\n if (debug) console.log('[FlowGrid] Session started:', sessionIdRef.current);\n } catch (err) {\n if (debug) console.error('[FlowGrid] Session start failed:', err);\n }\n };\n\n startSession();\n setIsReady(true);\n\n // End session on page unload\n const handleUnload = () => {\n if (sessionIdRef.current) {\n sdk.sessions.end(sessionIdRef.current);\n }\n };\n\n window.addEventListener('beforeunload', handleUnload);\n return () => window.removeEventListener('beforeunload', handleUnload);\n }, [autoTrackSessions, sdk.sessions, debug]);\n\n // Auto-track page views\n useEffect(() => {\n if (!autoTrackPageViews || typeof window === 'undefined') return;\n\n const trackPageView = () => {\n sdk.pageViews.track({\n url: window.location.href,\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n });\n if (debug) console.log('[FlowGrid] Page view:', window.location.pathname);\n };\n\n // Track initial page view\n trackPageView();\n\n // Track on route changes (for SPAs)\n const handlePopState = () => trackPageView();\n window.addEventListener('popstate', handlePopState);\n\n return () => window.removeEventListener('popstate', handlePopState);\n }, [autoTrackPageViews, sdk.pageViews, debug]);\n\n const value: FlowGridContextValue = {\n ...sdk,\n trackEvent,\n identifyUser,\n isReady,\n };\n\n return (\n <FlowGridContext.Provider value={value}>\n {children}\n </FlowGridContext.Provider>\n );\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n * Must be used within FlowGridProvider.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { trackEvent, events } = useFlowGrid();\n * \n * const handleClick = () => {\n * trackEvent('button_clicked', { buttonId: 'cta' });\n * };\n * \n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function useFlowGrid(): FlowGridContextValue {\n const context = useContext(FlowGridContext);\n if (!context) {\n throw new Error('useFlowGrid must be used within a FlowGridProvider');\n }\n return context;\n}\n\n/**\n * Track page views automatically on route changes.\n * Use in your root layout or App component.\n * \n * @example\n * ```tsx\n * function App() {\n * usePageView(); // Tracks on every route change\n * return <Routes />;\n * }\n * ```\n */\nexport function usePageView(pageName?: string) {\n const { pageViews, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (!isReady || typeof window === 'undefined') return;\n\n pageViews.track({\n url: window.location.href,\n path: window.location.pathname,\n title: pageName || document.title,\n referrer: document.referrer,\n });\n }, [pageViews, pageName, isReady]);\n}\n\n/**\n * Track an event when component mounts.\n * \n * @example\n * ```tsx\n * function PricingPage() {\n * useTrackEvent('pricing_page_viewed', { source: 'navbar' });\n * return <PricingContent />;\n * }\n * ```\n */\nexport function useTrackEvent(\n eventName: string, \n properties?: Record<string, unknown>,\n deps: React.DependencyList = []\n) {\n const { trackEvent, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady) {\n trackEvent(eventName, properties);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isReady, ...deps]);\n}\n\n/**\n * Get experiment variant for a user.\n * \n * @example\n * ```tsx\n * function CheckoutPage() {\n * const { variant, isLoading } = useExperiment('checkout_v2', 'user_123');\n * \n * if (isLoading) return <Loading />;\n * \n * return variant === 'treatment' \n * ? <NewCheckout /> \n * : <OldCheckout />;\n * }\n * ```\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const [variant, setVariant] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n // In real implementation, this would fetch from API\n // For now, just track exposure\n experiment.trackExposure(experimentId, userId, variant || 'control');\n setVariant('control'); // Default\n setIsLoading(false);\n }, [experiment, experimentId, userId, variant]);\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n * \n * @example\n * ```tsx\n * function Dashboard() {\n * const { isEnabled, isLoading } = useFeatureFlag('new_dashboard', { \n * userId: 'user_123' \n * });\n * \n * if (isLoading) return <Loading />;\n * \n * return isEnabled ? <NewDashboard /> : <OldDashboard />;\n * }\n * ```\n */\nexport function useFeatureFlag(\n flagKey: string, \n context?: { userId?: string; [key: string]: unknown }\n) {\n const { featureFlag } = useFlowGrid();\n const [isEnabled, setIsEnabled] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const evaluate = async () => {\n try {\n await featureFlag.trackEvaluation({\n flagKey,\n userId: context?.userId,\n context,\n result: false, // Would come from API\n reason: 'default'\n });\n setIsEnabled(false); // Would come from API\n } finally {\n setIsLoading(false);\n }\n };\n\n evaluate();\n }, [featureFlag, flagKey, context]);\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Track user identity.\n * \n * @example\n * ```tsx\n * function ProfilePage({ user }) {\n * useIdentify(user.id, { \n * email: user.email, \n * plan: user.plan \n * });\n * \n * return <Profile />;\n * }\n * ```\n */\nexport function useIdentify(userId: string, traits?: Record<string, unknown>) {\n const { identifyUser, isReady } = useFlowGrid();\n\n useEffect(() => {\n if (isReady && userId) {\n identifyUser(userId, traits);\n }\n }, [isReady, userId, traits, identifyUser]);\n}\n\n// ============================================================================\n// ECOMMERCE HOOKS\n// ============================================================================\n\n/**\n * Ecommerce tracking hooks.\n * \n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const { trackProductView, trackAddToCart } = useEcommerce();\n * \n * useEffect(() => {\n * trackProductView(product);\n * }, [product]);\n * \n * const handleAddToCart = () => {\n * trackAddToCart(product, 1);\n * };\n * \n * return <button onClick={handleAddToCart}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n category?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n category: product.category,\n });\n }, [products]);\n\n const trackAddToCart = useCallback(async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity: number = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n }, [cart]);\n\n const trackCheckoutStart = useCallback(async (cartItems: Array<{ productId: string; name: string; price: number; quantity: number }>) => {\n await checkout.begin({\n cart: {\n cartId: 'current',\n items: cartItems.map(i => ({\n productId: i.productId,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n discountTotal: 0,\n total: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n currency: 'USD' as any,\n itemCount: cartItems.length,\n },\n });\n }, [checkout]);\n\n const trackPurchase = useCallback(async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n }, [purchases]);\n\n return {\n trackProductView,\n trackAddToCart,\n trackCheckoutStart,\n trackPurchase,\n // Direct access\n products,\n cart,\n checkout,\n purchases,\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n FlowGridProvider,\n useFlowGrid,\n usePageView,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n};\n","/**\n * @fileoverview FlowGrid SDK - Vue 3 Integration\n * @module frameworks/vue\n * \n * @description\n * Vue 3 composables and plugin for FlowGrid SDK.\n * Uses Composition API for reactive state management.\n * \n * @example\n * ```ts\n * // main.ts\n * import { createApp } from 'vue';\n * import { FlowGridPlugin } from 'flowgrid-sdk/vue';\n * \n * const app = createApp(App);\n * app.use(FlowGridPlugin, {\n * webId: 'your-web-id',\n * endpoint: 'https://api.flowgrid.io',\n * apiKey: 'your-api-key'\n * });\n * app.mount('#app');\n * ```\n */\n\nimport { \n inject, \n provide, \n ref, \n computed, \n onMounted, \n onUnmounted,\n watch,\n type App, \n type InjectionKey,\n type Ref\n} from 'vue';\n\n// Import core SDK\nimport {\n Activation,\n TrackFeature,\n TrackPrompt,\n Experiment,\n FeatureFlag,\n PageViews,\n Sessions,\n Events,\n Identify,\n Funnels,\n Products,\n CartTracking,\n Checkout,\n Purchases\n} from '../../../index';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FlowGridConfig {\n webId: string;\n endpoint: string;\n apiKey: string;\n autoTrackPageViews?: boolean;\n autoTrackSessions?: boolean;\n debug?: boolean;\n}\n\nexport interface FlowGridInstance {\n // Core\n activation: Activation;\n trackFeature: TrackFeature;\n trackPrompt: TrackPrompt;\n experiment: Experiment;\n featureFlag: FeatureFlag;\n // Analytics\n pageViews: PageViews;\n sessions: Sessions;\n events: Events;\n identify: Identify;\n funnels: Funnels;\n // Ecommerce\n products: Products;\n cart: CartTracking;\n checkout: Checkout;\n purchases: Purchases;\n // State\n isReady: Ref<boolean>;\n sessionId: Ref<string | null>;\n}\n\n// ============================================================================\n// INJECTION KEY\n// ============================================================================\n\nconst FlowGridKey: InjectionKey<FlowGridInstance> = Symbol('FlowGrid');\n\n// ============================================================================\n// PLUGIN\n// ============================================================================\n\n/**\n * Vue plugin for FlowGrid SDK.\n * \n * @example\n * ```ts\n * import { createApp } from 'vue';\n * import { FlowGridPlugin } from 'flowgrid-sdk/vue';\n * \n * createApp(App)\n * .use(FlowGridPlugin, {\n * webId: 'web_123',\n * endpoint: 'https://api.flowgrid.io',\n * apiKey: 'key_abc',\n * autoTrackPageViews: true\n * })\n * .mount('#app');\n * ```\n */\nexport const FlowGridPlugin = {\n install(app: App, options: FlowGridConfig) {\n const { webId, endpoint, apiKey, debug = false } = options;\n\n const isReady = ref(false);\n const sessionId = ref<string | null>(null);\n\n // Initialize SDK instances\n const instance: FlowGridInstance = {\n activation: new Activation(webId, endpoint, apiKey),\n trackFeature: new TrackFeature(webId, endpoint, apiKey),\n trackPrompt: new TrackPrompt(webId, endpoint, apiKey),\n experiment: new Experiment(webId, endpoint, apiKey),\n featureFlag: new FeatureFlag(webId, endpoint, apiKey),\n pageViews: new PageViews(webId, endpoint, apiKey),\n sessions: new Sessions(webId, endpoint, apiKey),\n events: new Events(webId, endpoint, apiKey),\n identify: new Identify(webId, endpoint, apiKey),\n funnels: new Funnels(webId, endpoint, apiKey),\n products: new Products(webId, endpoint, apiKey),\n cart: new CartTracking(webId, endpoint, apiKey),\n checkout: new Checkout(webId, endpoint, apiKey),\n purchases: new Purchases(webId, endpoint, apiKey),\n isReady,\n sessionId,\n };\n\n // Auto-start session\n if (options.autoTrackSessions !== false && typeof window !== 'undefined') {\n instance.sessions.start({\n referrer: document.referrer,\n landingPage: window.location.pathname,\n }).then((result) => {\n sessionId.value = result.response?.sessionId || null;\n isReady.value = true;\n if (debug) console.log('[FlowGrid] Session started:', sessionId.value);\n });\n\n // End session on unload\n window.addEventListener('beforeunload', () => {\n if (sessionId.value) {\n instance.sessions.end(sessionId.value);\n }\n });\n } else {\n isReady.value = true;\n }\n\n // Provide globally\n app.provide(FlowGridKey, instance);\n\n // Also add to globalProperties for Options API\n app.config.globalProperties.$flowgrid = instance;\n }\n};\n\n// ============================================================================\n// COMPOSABLES\n// ============================================================================\n\n/**\n * Access the FlowGrid SDK instance.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useFlowGrid } from 'flowgrid-sdk/vue';\n * \n * const { events, trackEvent } = useFlowGrid();\n * \n * const handleClick = () => {\n * trackEvent('button_clicked', { id: 'cta' });\n * };\n * </script>\n * ```\n */\nexport function useFlowGrid() {\n const instance = inject(FlowGridKey);\n \n if (!instance) {\n throw new Error('FlowGrid plugin not installed. Call app.use(FlowGridPlugin, config) first.');\n }\n\n const trackEvent = async (name: string, properties?: Record<string, unknown>) => {\n await instance.events.track({ eventName: name, properties: properties || {} });\n };\n\n const identifyUser = async (userId: string, traits?: Record<string, unknown>) => {\n await instance.identify.user({ userId, traits: traits || {} });\n };\n\n return {\n ...instance,\n trackEvent,\n identifyUser,\n };\n}\n\n/**\n * Track page views with Vue Router integration.\n * \n * @example\n * ```vue\n * <script setup>\n * import { usePageView } from 'flowgrid-sdk/vue';\n * import { useRoute } from 'vue-router';\n * \n * const route = useRoute();\n * usePageView(() => route.path);\n * </script>\n * ```\n */\nexport function usePageView(pathGetter?: () => string) {\n const { pageViews, isReady } = useFlowGrid();\n\n const trackPage = () => {\n if (typeof window === 'undefined') return;\n \n pageViews.track({\n url: window.location.href,\n path: pathGetter ? pathGetter() : window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n });\n };\n\n onMounted(() => {\n if (isReady.value) {\n trackPage();\n }\n });\n\n // Watch for path changes if getter provided\n if (pathGetter) {\n watch(pathGetter, () => {\n if (isReady.value) {\n trackPage();\n }\n });\n }\n}\n\n/**\n * Track an event on component mount.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useTrackEvent } from 'flowgrid-sdk/vue';\n * \n * useTrackEvent('pricing_page_viewed', { source: 'navbar' });\n * </script>\n * ```\n */\nexport function useTrackEvent(eventName: string, properties?: Record<string, unknown>) {\n const { trackEvent, isReady } = useFlowGrid();\n\n onMounted(() => {\n if (isReady.value) {\n trackEvent(eventName, properties);\n }\n });\n}\n\n/**\n * Use an experiment variant.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useExperiment } from 'flowgrid-sdk/vue';\n * \n * const { variant, isLoading } = useExperiment('checkout_v2', 'user_123');\n * </script>\n * \n * <template>\n * <NewCheckout v-if=\"variant === 'treatment'\" />\n * <OldCheckout v-else />\n * </template>\n * ```\n */\nexport function useExperiment(experimentId: string, userId: string) {\n const { experiment } = useFlowGrid();\n const variant = ref<string | null>(null);\n const isLoading = ref(true);\n\n onMounted(async () => {\n try {\n await experiment.trackExposure(experimentId, userId, 'control');\n variant.value = 'control'; // Would come from API\n } finally {\n isLoading.value = false;\n }\n });\n\n return { variant, isLoading };\n}\n\n/**\n * Evaluate a feature flag.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useFeatureFlag } from 'flowgrid-sdk/vue';\n * \n * const { isEnabled, isLoading } = useFeatureFlag('new_dashboard');\n * </script>\n * \n * <template>\n * <NewDashboard v-if=\"isEnabled\" />\n * <OldDashboard v-else />\n * </template>\n * ```\n */\nexport function useFeatureFlag(flagKey: string, userId?: string) {\n const { featureFlag } = useFlowGrid();\n const isEnabled = ref(false);\n const isLoading = ref(true);\n\n onMounted(async () => {\n try {\n await featureFlag.trackEvaluation({\n flagKey,\n userId,\n result: false,\n reason: 'default'\n });\n isEnabled.value = false; // Would come from API\n } finally {\n isLoading.value = false;\n }\n });\n\n return { isEnabled, isLoading };\n}\n\n/**\n * Identify a user.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useIdentify } from 'flowgrid-sdk/vue';\n * \n * const props = defineProps<{ userId: string; email: string }>();\n * \n * useIdentify(() => props.userId, () => ({ email: props.email }));\n * </script>\n * ```\n */\nexport function useIdentify(\n userIdGetter: () => string | null,\n traitsGetter?: () => Record<string, unknown>\n) {\n const { identifyUser, isReady } = useFlowGrid();\n\n watch(\n [userIdGetter, isReady],\n ([userId, ready]) => {\n if (ready && userId) {\n identifyUser(userId, traitsGetter?.() || {});\n }\n },\n { immediate: true }\n );\n}\n\n/**\n * Ecommerce composable.\n * \n * @example\n * ```vue\n * <script setup>\n * import { useEcommerce } from 'flowgrid-sdk/vue';\n * \n * const { trackProductView, trackAddToCart } = useEcommerce();\n * \n * onMounted(() => {\n * trackProductView(product);\n * });\n * </script>\n * ```\n */\nexport function useEcommerce() {\n const { products, cart, checkout, purchases } = useFlowGrid();\n\n const trackProductView = async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }) => {\n await products.view({\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n });\n };\n\n const trackAddToCart = async (product: {\n id: string;\n name: string;\n price: number;\n currency?: string;\n }, quantity = 1) => {\n await cart.addItem({\n product: {\n productId: product.id,\n name: product.name,\n price: product.price,\n currency: (product.currency || 'USD') as any,\n },\n quantity,\n cartId: 'current',\n });\n };\n\n const trackCheckoutStart = async (cartItems: Array<{ productId: string; name: string; price: number; quantity: number }>) => {\n await checkout.begin({\n cart: {\n cartId: 'current',\n items: cartItems.map(i => ({\n productId: i.productId,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n discountTotal: 0,\n total: cartItems.reduce((sum, i) => sum + i.price * i.quantity, 0),\n currency: 'USD' as any,\n itemCount: cartItems.length,\n },\n });\n };\n\n const trackPurchase = async (orderData: {\n orderId: string;\n revenue: number;\n items: Array<{ id: string; name: string; price: number; quantity: number }>;\n }) => {\n await purchases.track({\n order: {\n orderId: orderData.orderId,\n items: orderData.items.map(i => ({\n productId: i.id,\n name: i.name,\n price: i.price,\n quantity: i.quantity,\n lineTotal: i.price * i.quantity,\n currency: 'USD' as any,\n })),\n subtotal: orderData.revenue,\n discountTotal: 0,\n shippingTotal: 0,\n taxTotal: 0,\n total: orderData.revenue,\n currency: 'USD' as any,\n },\n });\n };\n\n return {\n trackProductView,\n trackAddToCart,\n trackCheckoutStart,\n trackPurchase,\n products,\n cart,\n checkout,\n purchases,\n };\n}\n\n// ============================================================================\n// VUE ROUTER PLUGIN\n// ============================================================================\n\n/**\n * Vue Router plugin for automatic page view tracking.\n * \n * @example\n * ```ts\n * import { createRouter } from 'vue-router';\n * import { createRouterPlugin } from 'flowgrid-sdk/vue';\n * \n * const router = createRouter({ ... });\n * router.afterEach(createRouterPlugin());\n * ```\n */\nexport function createRouterPlugin() {\n return (to: { path: string; name?: string }, from: { path: string }) => {\n // This would be called from the consuming app after router is set up\n if (typeof window === 'undefined') return;\n \n // The app should call usePageView or manually track\n console.log('[FlowGrid] Route change:', from.path, '->', to.path);\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n FlowGridPlugin,\n useFlowGrid,\n usePageView,\n useTrackEvent,\n useExperiment,\n useFeatureFlag,\n useIdentify,\n useEcommerce,\n createRouterPlugin,\n};\n"],"names":["root","factory","exports","module","require","e","define","amd","this","__WEBPACK_EXTERNAL_MODULE__272__","__WEBPACK_EXTERNAL_MODULE__12__","__WEBPACK_EXTERNAL_MODULE__594__","__WEBPACK_EXTERNAL_MODULE__500__","Error","code","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","FTRPC","constructor","webId","endpoint","apiKey","trim","normalizeEndpoint","init","eventName","properties","method","validateInput","callType","type","url","encodeURIComponent","body","JSON","stringify","web_id","event_name","executeRequest","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","TrackPrompt","trackSubmission","promptId","promptType","model","inputTokens","conversationId","trackResponse","responseTime","outputTokens","completed","qualityScore","trackFeedback","feedbackType","rating","comment","trackConversation","turnCount","totalDuration","Experiment","track","variant","assign","experimentId","variantId","trackConversion","metricName","value","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","count","trackClick","trackForm","trackSearch","query","resultsCount","resultClicked","clickedPosition","filters","trackError","stack","errorType","fatal","userAction","Identify","anonymousId","traits","updateTraits","alias","previousId","group","groupId","reset","Funnels","funnelId","description","steps","trackStep","step","stepNumber","trackComplete","trackAbandon","lastStep","analyze","compare","baselineFilter","comparisonFilter","list","Products","view","product","productId","brand","price","currency","imageUrl","reviewCount","stockStatus","attributes","searchQuery","impression","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","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","CustomerLTV","getCustomerValue","recordAcquisitionCost","channel","updateSegment","segment","getTopCustomers","sortBy","sortOrder","Subscriptions","subscriptionId","plan","mrr","billingCycle","trialDays","coupon","isTrialing","change","mrrDiff","newMrr","amount","previousMrr","previousPlan","newPlan","mrrChange","changeType","cancel","lostMrr","feedback","immediate","renew","trialConverted","trialExpired","usePathname","useSearchParams","createContext","Symbol","nav","pathname","URLSearchParams","search"],"sourceRoot":""}