@aivue/tabular-intelligence 2.0.0 → 2.0.1

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","sources":["../src/utils/helpers.ts","../src/utils/qaEngine.ts","../src/utils/tableExtractor.ts","../src/utils/postmanParser.ts","../src/utils/apiClient.ts","../src/core/TabularIntelligence.ts","../src/composables/useTabularIntelligence.ts","../src/components/QuestionInput.vue","../src/components/AnswerDisplay.vue","../src/components/QuestionHistory.vue","../src/quality/profiling.ts","../src/preprocessing/imputation.ts","../src/preprocessing/outliers.ts","../src/advanced/timeseries.ts","../src/advanced/automl.ts","../src/advanced/featureEngineering.ts","../src/advanced/explainability.ts","../src/advanced/statistical.ts","../src/advanced/visualization.ts","../src/advanced/multitable.ts","../src/advanced/reporting.ts","../src/advanced/privacy.ts","../src/advanced/versioning.ts","../src/advanced/streaming.ts"],"sourcesContent":["/**\n * Helper utilities for tabular intelligence\n */\n\nimport type { TableSchema, TableColumn, DescriptiveStats, Anomaly, Cluster } from '../types';\n\n/**\n * Infer table schema from data\n */\nexport function inferSchema(data: any[], name?: string): TableSchema {\n if (data.length === 0) {\n return { columns: [], rowCount: 0, name };\n }\n\n const firstRow = data[0];\n const columns: TableColumn[] = Object.keys(firstRow).map((key) => {\n const type = inferColumnType(data, key);\n return {\n name: key,\n type,\n nullable: data.some((row) => row[key] == null),\n };\n });\n\n return {\n columns,\n rowCount: data.length,\n name,\n };\n}\n\n/**\n * Infer column type from data\n */\nexport function inferColumnType(data: any[], column: string): TableColumn['type'] {\n const values = data.map((row) => row[column]).filter((v) => v != null);\n \n if (values.length === 0) return 'string';\n\n // Check if all values are numbers\n if (values.every((v) => typeof v === 'number' || !isNaN(Number(v)))) {\n return 'number';\n }\n\n // Check if all values are booleans\n if (values.every((v) => typeof v === 'boolean' || v === 'true' || v === 'false')) {\n return 'boolean';\n }\n\n // Check if values look like dates\n if (values.every((v) => !isNaN(Date.parse(v)))) {\n return 'date';\n }\n\n // Check if categorical (limited unique values)\n const uniqueValues = new Set(values);\n if (uniqueValues.size < values.length * 0.5 && uniqueValues.size < 20) {\n return 'categorical';\n }\n\n return 'string';\n}\n\n/**\n * Calculate basic descriptive statistics\n */\nexport function calculateStats(data: any[], column: string, type: TableColumn['type']): DescriptiveStats {\n const values = data.map((row) => row[column]).filter((v) => v != null);\n const count = values.length;\n const nullCount = data.length - count;\n\n const stats: DescriptiveStats = {\n column,\n count,\n nullCount,\n };\n\n if (type === 'number') {\n const numbers = values.map(Number).filter((n) => !isNaN(n));\n \n if (numbers.length > 0) {\n const sorted = [...numbers].sort((a, b) => a - b);\n const sum = numbers.reduce((a, b) => a + b, 0);\n \n stats.mean = sum / numbers.length;\n stats.median = sorted[Math.floor(sorted.length / 2)];\n stats.min = sorted[0];\n stats.max = sorted[sorted.length - 1];\n \n const variance = numbers.reduce((acc, val) => acc + Math.pow(val - stats.mean!, 2), 0) / numbers.length;\n stats.std = Math.sqrt(variance);\n \n stats.percentiles = {\n '25': sorted[Math.floor(sorted.length * 0.25)],\n '50': stats.median,\n '75': sorted[Math.floor(sorted.length * 0.75)],\n '90': sorted[Math.floor(sorted.length * 0.90)],\n };\n }\n } else {\n const uniqueValues = new Set(values);\n stats.uniqueValues = uniqueValues.size;\n \n const frequency: Record<string, number> = {};\n values.forEach((v) => {\n const key = String(v);\n frequency[key] = (frequency[key] || 0) + 1;\n });\n \n const maxFreq = Math.max(...Object.values(frequency));\n stats.mode = Object.keys(frequency).find((k) => frequency[k] === maxFreq);\n }\n\n return stats;\n}\n\n/**\n * Detect anomalies using IQR method\n */\nexport function detectAnomalies(data: any[], columns: string[], sensitivity: number = 0.5): Anomaly[] {\n const anomalies: Anomaly[] = [];\n const multiplier = 1.5 + (1 - sensitivity) * 1.5;\n\n columns.forEach((column) => {\n const values = data.map((row, idx) => ({ value: Number(row[column]), idx }))\n .filter((v) => !isNaN(v.value));\n\n if (values.length === 0) return;\n\n const sorted = [...values].sort((a, b) => a.value - b.value);\n const q1 = sorted[Math.floor(sorted.length * 0.25)].value;\n const q3 = sorted[Math.floor(sorted.length * 0.75)].value;\n const iqr = q3 - q1;\n const lowerBound = q1 - multiplier * iqr;\n const upperBound = q3 + multiplier * iqr;\n\n values.forEach(({ value, idx }) => {\n if (value < lowerBound || value > upperBound) {\n const existing = anomalies.find((a) => a.rowIndex === idx);\n const reason = value < lowerBound\n ? `${column}: ${value.toFixed(2)} < ${lowerBound.toFixed(2)}`\n : `${column}: ${value.toFixed(2)} > ${upperBound.toFixed(2)}`;\n\n if (existing) {\n existing.reasons.push(reason);\n existing.affectedColumns.push(column);\n existing.score = Math.min(1, existing.score + 0.2);\n } else {\n anomalies.push({\n rowIndex: idx,\n row: data[idx],\n score: 0.7,\n reasons: [reason],\n affectedColumns: [column],\n });\n }\n }\n });\n });\n\n return anomalies.sort((a, b) => b.score - a.score);\n}\n\n","import type { QARequest, QAResponse, Answer, TableSchema } from '../types';\nimport { calculateStats } from './helpers';\n\nexport interface QAEngineConfig {\n provider: 'openai' | 'anthropic' | 'custom';\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\n/**\n * Q&A Engine for natural language questions about table data\n */\nexport class QAEngine {\n private config: QAEngineConfig;\n\n constructor(config: QAEngineConfig) {\n this.config = {\n maxTokens: 1000,\n temperature: 0.3,\n ...config,\n };\n }\n\n /**\n * Answer a question about the table data\n */\n async answerQuestion(request: QARequest): Promise<QAResponse> {\n const startTime = Date.now();\n\n try {\n // Prepare data for LLM\n const { question, schema, data, sampleSize = 100, includeAggregates = true } = request;\n\n // Validate data exists and is an array\n if (!data || !Array.isArray(data) || data.length === 0) {\n throw new Error('No data available. Please load data first.');\n }\n\n // Validate schema exists\n if (!schema || !schema.columns || !Array.isArray(schema.columns)) {\n throw new Error('Invalid schema. Please ensure data has a valid schema.');\n }\n\n // Sample data if too large\n const sampledData = data.length > sampleSize ? this.sampleData(data, sampleSize) : data;\n\n // Calculate aggregates if requested\n const aggregates = includeAggregates ? this.calculateAggregates(data, schema) : undefined;\n\n // Build prompt\n const prompt = this.buildPrompt(question, schema, sampledData, aggregates, data.length);\n \n // Call LLM\n const llmResponse = await this.callLLM(prompt);\n \n // Parse response\n const answer = this.parseResponse(llmResponse, question, data.length > sampleSize);\n \n return {\n answer,\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n console.error('Q&A error:', error);\n \n // Return error answer\n return {\n answer: {\n questionId: this.generateId(),\n text: 'I encountered an error while processing your question. Please try again.',\n timestamp: new Date(),\n confidence: 0,\n cannotAnswer: true,\n reason: error instanceof Error ? error.message : 'Unknown error',\n },\n processingTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Sample data for large datasets\n */\n private sampleData(data: any[], sampleSize: number): any[] {\n // Validate data\n if (!data || !Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n if (data.length <= sampleSize) {\n return data;\n }\n\n const step = Math.floor(data.length / sampleSize);\n const sampled: any[] = [];\n\n for (let i = 0; i < data.length && sampled.length < sampleSize; i += step) {\n sampled.push(data[i]);\n }\n\n return sampled;\n }\n\n /**\n * Calculate aggregates for numeric columns\n */\n private calculateAggregates(data: any[], schema: TableSchema): Record<string, any> {\n const aggregates: Record<string, any> = {};\n\n // Validate data exists\n if (!data || !Array.isArray(data) || data.length === 0) {\n return aggregates;\n }\n\n // Validate schema and columns exist\n if (!schema || !schema.columns || !Array.isArray(schema.columns)) {\n return aggregates;\n }\n\n for (const column of schema.columns) {\n if (column.type === 'number' && data.length > 0) {\n try {\n const stats = calculateStats(data, column.name, 'number');\n aggregates[column.name] = {\n mean: stats.mean,\n median: stats.median,\n min: stats.min,\n max: stats.max,\n count: stats.count,\n };\n } catch (error) {\n // Skip columns with errors\n }\n } else if (column.type === 'categorical' || column.type === 'string') {\n // Count unique values\n const values = data.map(row => row[column.name]).filter(v => v != null);\n const uniqueValues = new Set(values);\n aggregates[column.name] = {\n uniqueCount: uniqueValues.size,\n totalCount: values.length,\n topValues: this.getTopValues(values, 5),\n };\n }\n }\n \n return aggregates;\n }\n\n /**\n * Get top N most frequent values\n */\n private getTopValues(values: any[], n: number): Array<{ value: any; count: number }> {\n const counts = new Map<any, number>();\n \n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n \n return Array.from(counts.entries())\n .map(([value, count]) => ({ value, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, n);\n }\n\n /**\n * Build prompt for LLM\n */\n private buildPrompt(\n question: string,\n schema: TableSchema,\n sampledData: any[],\n aggregates?: Record<string, any>,\n totalRows?: number\n ): string {\n const isSampled = totalRows && totalRows > sampledData.length;\n \n let prompt = `You are a data analyst assistant. Answer the following question about a table dataset.\\n\\n`;\n \n prompt += `**Table Schema:**\\n`;\n prompt += `Table: ${schema.name}\\n`;\n prompt += `Columns:\\n`;\n for (const col of schema.columns) {\n prompt += `- ${col.name} (${col.type})\\n`;\n }\n prompt += `\\n`;\n \n if (aggregates && Object.keys(aggregates).length > 0) {\n prompt += `**Summary Statistics:**\\n`;\n prompt += JSON.stringify(aggregates, null, 2);\n prompt += `\\n\\n`;\n }\n \n prompt += `**Sample Data** (${sampledData.length} rows${isSampled ? ` out of ${totalRows} total` : ''}):\\n`;\n prompt += JSON.stringify(sampledData.slice(0, 10), null, 2);\n prompt += `\\n\\n`;\n \n prompt += `**Question:** ${question}\\n\\n`;\n\n prompt += `**Instructions:**\\n`;\n prompt += `1. You are a helpful AI data analyst that can answer questions about the table data, perform statistical analysis, make predictions, identify trends, AND engage in normal conversation.\\n`;\n prompt += `2. For data questions (e.g., \"how many rows?\", \"what's the average?\"), answer based on the data provided above.\\n`;\n prompt += `3. For statistical analysis requests (e.g., \"calculate descriptive statistics\", \"show me mean/median/std dev\"), compute and present the statistics clearly.\\n`;\n prompt += `4. For anomaly detection requests (e.g., \"detect anomalies\", \"find outliers\"), identify unusual data points and explain why they're anomalous.\\n`;\n prompt += `5. For clustering requests (e.g., \"perform clustering\", \"group similar data\"), identify natural groupings in the data and describe their characteristics.\\n`;\n prompt += `6. For correlation analysis requests (e.g., \"show correlations\", \"what variables are related\"), analyze relationships between variables and explain the strength and direction of correlations.\\n`;\n prompt += `7. For predictive questions (e.g., \"predict future trends\", \"what will happen next?\", \"forecast X\"), analyze patterns in the data and make reasonable predictions based on trends, correlations, and statistical patterns you observe.\\n`;\n prompt += `8. For analytical questions (e.g., \"what insights?\", \"any patterns?\", \"recommendations?\"), provide insights, trends, correlations, and actionable recommendations based on the data.\\n`;\n prompt += `9. For conversational questions (e.g., \"hi\", \"hello\", \"what can you do?\"), respond naturally and mention your capabilities.\\n`;\n prompt += `10. If a question is completely unrelated to data analysis (e.g., \"what's the weather?\"), politely explain you can only help with data analysis.\\n`;\n prompt += `11. Provide clear, concise answers with specific numbers and examples.\\n`;\n prompt += `12. When making predictions or identifying trends, explain your reasoning and mention the confidence level.\\n`;\n prompt += `13. If the answer is based on sampled data, mention that it's an approximation.\\n`;\n prompt += `14. Format your response as JSON with the following structure:\\n`;\n prompt += `{\\n`;\n prompt += ` \"answer\": \"Your answer text here\",\\n`;\n prompt += ` \"confidence\": 0.0-1.0,\\n`;\n prompt += ` \"cannotAnswer\": false,\\n`;\n prompt += ` \"isApproximate\": ${isSampled},\\n`;\n prompt += ` \"supportingData\": { \"key\": \"value\" } // optional\\n`;\n prompt += `}\\n\\n`;\n prompt += `Examples:\\n`;\n prompt += `- Question: \"hi\" → Answer: \"Hello! I'm your AI data analyst. I can perform statistical analysis, detect anomalies, cluster data, analyze correlations, make predictions, and answer questions about this dataset.\"\\n`;\n prompt += `- Question: \"how many rows?\" → Answer: \"There are ${totalRows || sampledData.length} rows in the dataset.\"\\n`;\n prompt += `- Question: \"calculate descriptive statistics\" → Answer: \"Descriptive Statistics:\\\\n- Mean: 45.2\\\\n- Median: 42.0\\\\n- Std Dev: 12.5\\\\n- Min: 10\\\\n- Max: 95\\\\n- 25th Percentile: 35\\\\n- 75th Percentile: 58\" (with confidence: 0.95)\\n`;\n prompt += `- Question: \"detect anomalies\" → Answer: \"I found 3 anomalies in the dataset:\\\\n1. Row 15: Value 250 is 3.5 standard deviations above the mean\\\\n2. Row 42: Value -10 is unusually low\\\\n3. Row 88: Value 300 is an extreme outlier\" (with confidence: 0.85)\\n`;\n prompt += `- Question: \"perform clustering\" → Answer: \"I identified 3 natural clusters in the data:\\\\n- Cluster 1 (40%): Low values, avg 25\\\\n- Cluster 2 (35%): Medium values, avg 50\\\\n- Cluster 3 (25%): High values, avg 85\" (with confidence: 0.8)\\n`;\n prompt += `- Question: \"show correlation analysis\" → Answer: \"Correlation Analysis:\\\\n- Price & Quantity: -0.65 (strong negative)\\\\n- Revenue & Price: 0.82 (strong positive)\\\\n- Quantity & Revenue: 0.45 (moderate positive)\" (with confidence: 0.9)\\n`;\n prompt += `- Question: \"predict future sales\" → Answer: \"Based on the trend in the data, sales are increasing by 15% monthly. If this continues, next month's sales could reach approximately $50,000.\" (with confidence: 0.7)\\n`;\n prompt += `- Question: \"what insights can you give?\" → Answer: \"Key insights: 1) Sales peak on weekends, 2) Product A is the top seller, 3) Customer retention is 85%...\"\\n`;\n prompt += `- Question: \"what's the weather?\" → Answer: \"I cannot answer this question as it's not related to the dataset. I can only help with questions about this data.\"\\n`;\n \n return prompt;\n }\n\n /**\n * Call LLM API\n */\n private async callLLM(prompt: string): Promise<string> {\n const { provider, apiKey, baseUrl, model, maxTokens, temperature } = this.config;\n\n // If no API key, use fallback logic\n if (!apiKey && provider !== 'custom') {\n return this.fallbackResponse(prompt);\n }\n\n if (provider === 'openai') {\n return this.callOpenAI(prompt, apiKey!, model || 'gpt-4-turbo-preview', maxTokens!, temperature!);\n } else if (provider === 'anthropic') {\n return this.callAnthropic(prompt, apiKey!, model || 'claude-3-5-sonnet-20241022', maxTokens!, temperature!);\n } else if (provider === 'custom' && baseUrl) {\n return this.callCustomAPI(prompt, baseUrl, apiKey);\n }\n\n throw new Error(`Unsupported provider: ${provider}`);\n }\n\n /**\n * Fallback response when no API key is available\n */\n private fallbackResponse(prompt: string): string {\n // Extract the question from the prompt\n const questionMatch = prompt.match(/\\*\\*Question:\\*\\* (.+)/);\n const question = questionMatch ? questionMatch[1].trim() : '';\n\n const lowerQuestion = question.toLowerCase();\n\n // Handle greetings\n if (/^(hi|hello|hey|greetings|good morning|good afternoon|good evening)/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"Hello! 👋 I'm your data analysis assistant. I can help you explore and understand this dataset. Try asking questions like 'How many rows are there?', 'What columns do we have?', or 'Show me a summary of the data'. For more advanced analysis, please configure an OpenAI or Anthropic API key in the settings.\",\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Handle \"what can you do\" type questions\n if (/what (can|do) you|help|capabilities|features/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can help you analyze tabular data! You can ask me questions like:\\n• 'How many rows/columns are there?'\\n• 'What are the column names?'\\n• 'Show me basic statistics'\\n• 'What's the data about?'\\n\\nWith an OpenAI or Anthropic API key, I can also:\\n• Calculate descriptive statistics (mean, median, std dev, percentiles)\\n• Detect anomalies and outliers\\n• Perform clustering analysis\\n• Analyze correlations between variables\\n• Make predictions and forecasts\\n• Identify trends and patterns\\n• Provide insights and recommendations\\n• Answer complex analytical questions\\n\\nPlease add your API key in the AI Chatbot Configuration section for advanced features.\",\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Extract schema and data info from prompt\n const rowsMatch = prompt.match(/\\*\\*Sample Data\\*\\* \\((\\d+) rows/);\n const totalRowsMatch = prompt.match(/out of (\\d+) total/);\n const columnsMatch = prompt.match(/Columns:\\n((?:- .+\\n)+)/);\n\n const sampleRows = rowsMatch ? parseInt(rowsMatch[1]) : 0;\n const totalRows = totalRowsMatch ? parseInt(totalRowsMatch[1]) : sampleRows;\n\n // Handle row count questions\n if (/how many (rows|records|entries|items)/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: `There are ${totalRows} rows in the dataset.`,\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Handle column questions\n if (/how many columns|what columns|column names|list columns/.test(lowerQuestion)) {\n if (columnsMatch) {\n const columns = columnsMatch[1].trim().split('\\n').map(line => line.replace(/^- /, '').split(' (')[0]);\n return JSON.stringify({\n answer: `The dataset has ${columns.length} columns: ${columns.join(', ')}.`,\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n }\n\n // Handle summary/overview questions\n if (/summary|overview|describe|what.*data|tell me about/.test(lowerQuestion)) {\n if (columnsMatch) {\n const columns = columnsMatch[1].trim().split('\\n').map(line => line.replace(/^- /, '').split(' (')[0]);\n return JSON.stringify({\n answer: `This dataset contains ${totalRows} rows and ${columns.length} columns. The columns are: ${columns.join(', ')}. For detailed analysis and insights, please configure an OpenAI or Anthropic API key.`,\n confidence: 0.8,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n }\n\n // Handle statistical analysis requests\n if (/descriptive statistics|calculate statistics|mean|median|std dev|standard deviation|percentile/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can calculate descriptive statistics with an OpenAI or Anthropic API key! I'll provide mean, median, standard deviation, min, max, and percentiles for all numeric columns. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Statistical analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle anomaly detection requests\n if (/anomaly|anomalies|outlier|outliers|detect anomal|find outlier/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can detect anomalies and outliers with an OpenAI or Anthropic API key! I'll identify unusual data points and explain why they're anomalous. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Anomaly detection requires AI. Please configure an API key.\",\n });\n }\n\n // Handle clustering requests\n if (/cluster|clustering|group|grouping|segment|segmentation/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can perform clustering analysis with an OpenAI or Anthropic API key! I'll identify natural groupings in your data and describe their characteristics. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Clustering analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle correlation analysis requests\n if (/correlation|correlate|relationship|relate|association/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can analyze correlations between variables with an OpenAI or Anthropic API key! I'll show you the strength and direction of relationships between different columns. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Correlation analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle prediction/forecast questions\n if (/predict|forecast|future|trend|next|will be|gonna be|going to be/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I'd love to help you make predictions based on this data! However, I need an OpenAI or Anthropic API key to analyze patterns, identify trends, and make accurate forecasts. Please add your API key in the 'AI Chatbot Configuration' section above, and I'll be able to provide detailed predictions with confidence scores.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Predictions require AI analysis. Please configure an API key for advanced features.\",\n });\n }\n\n // Handle insights/analysis questions\n if (/insight|pattern|analysis|analyze|recommendation/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can provide deep insights and analysis with an OpenAI or Anthropic API key! I'll be able to identify patterns, trends, and give you actionable recommendations. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Advanced analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Default: Cannot answer without API key\n return JSON.stringify({\n answer: \"I need an OpenAI or Anthropic API key to answer this question. Please add your API key in the 'AI Chatbot Configuration' section above. For now, I can only answer basic questions like 'How many rows?' or 'What columns are there?'\",\n confidence: 0.5,\n cannotAnswer: true,\n reason: \"No API key configured for advanced natural language processing\",\n });\n }\n\n /**\n * Call OpenAI API\n */\n private async callOpenAI(prompt: string, apiKey: string, model: string, maxTokens: number, temperature: number): Promise<string> {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: maxTokens,\n temperature,\n response_format: { type: 'json_object' },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.choices[0]?.message?.content || '';\n }\n\n /**\n * Call Anthropic API\n */\n private async callAnthropic(prompt: string, apiKey: string, model: string, maxTokens: number, temperature: number): Promise<string> {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n temperature,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.content[0]?.text || '';\n }\n\n /**\n * Call custom API\n */\n private async callCustomAPI(prompt: string, baseUrl: string, apiKey?: string): Promise<string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(baseUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ prompt }),\n });\n\n if (!response.ok) {\n throw new Error(`Custom API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.response || data.answer || JSON.stringify(data);\n }\n\n /**\n * Parse LLM response\n */\n private parseResponse(llmResponse: string, question: string, isSampled: boolean): Answer {\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(llmResponse);\n\n return {\n questionId: this.generateId(),\n text: parsed.answer || parsed.text || llmResponse,\n timestamp: new Date(),\n confidence: parsed.confidence || 0.8,\n cannotAnswer: parsed.cannotAnswer || false,\n isApproximate: parsed.isApproximate !== undefined ? parsed.isApproximate : isSampled,\n supportingData: parsed.supportingData,\n reason: parsed.reason,\n };\n } catch (error) {\n // If not JSON, treat as plain text answer\n return {\n questionId: this.generateId(),\n text: llmResponse,\n timestamp: new Date(),\n confidence: 0.7,\n isApproximate: isSampled,\n };\n }\n }\n\n /**\n * Generate unique ID\n */\n private generateId(): string {\n return `qa_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n","import type { TableSchema, TableColumn, ExtractedTable, TableExtractionOptions } from '../types';\nimport { inferSchema, inferColumnType } from './helpers';\n\n/**\n * Extract table data from DOM (HTML tables)\n */\nexport function extractFromDOM(options: TableExtractionOptions = {}): ExtractedTable | null {\n const {\n selector = 'table',\n includeHeaders = true,\n maxRows,\n inferTypes = true,\n skipEmptyRows = true,\n } = options;\n\n // Find table element\n const tableElement = document.querySelector(selector);\n if (!tableElement || tableElement.tagName !== 'TABLE') {\n console.warn(`No table found with selector: ${selector}`);\n return null;\n }\n\n const table = tableElement as HTMLTableElement;\n const rows = Array.from(table.rows);\n \n if (rows.length === 0) {\n return null;\n }\n\n // Extract headers\n let headers: string[] = [];\n let dataStartIndex = 0;\n\n if (includeHeaders && rows[0]) {\n const headerRow = rows[0];\n headers = Array.from(headerRow.cells).map((cell, index) => {\n const text = cell.textContent?.trim() || '';\n return text || `Column${index + 1}`;\n });\n dataStartIndex = 1;\n } else {\n // Generate column names\n const firstRow = rows[0];\n headers = Array.from(firstRow.cells).map((_, index) => `Column${index + 1}`);\n }\n\n // Extract data rows\n const data: any[] = [];\n const rowsToProcess = maxRows ? rows.slice(dataStartIndex, dataStartIndex + maxRows) : rows.slice(dataStartIndex);\n\n for (const row of rowsToProcess) {\n const cells = Array.from(row.cells);\n \n // Skip empty rows if configured\n if (skipEmptyRows && cells.every(cell => !cell.textContent?.trim())) {\n continue;\n }\n\n const rowData: Record<string, any> = {};\n cells.forEach((cell, index) => {\n const columnName = headers[index] || `Column${index + 1}`;\n let value: any = cell.textContent?.trim() || '';\n \n // Try to parse numbers\n if (inferTypes && value) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue) && value === numValue.toString()) {\n value = numValue;\n }\n }\n \n rowData[columnName] = value;\n });\n \n data.push(rowData);\n }\n\n // Infer schema\n const schema = inferTypes && data.length > 0\n ? inferSchema(data, 'Extracted Table')\n : createBasicSchema(headers, data.length);\n\n return {\n schema,\n data,\n source: 'dom',\n metadata: {\n selector,\n rowCount: data.length,\n columnCount: headers.length,\n extractedAt: new Date(),\n },\n };\n}\n\n/**\n * Normalize Vue data grid data\n */\nexport function normalizeVueData(\n data: any[],\n columns?: Array<{ field: string; header?: string; label?: string }>,\n options: TableExtractionOptions = {}\n): ExtractedTable {\n const { maxRows, inferTypes = true } = options;\n\n // Limit rows if specified\n const processedData = maxRows ? data.slice(0, maxRows) : data;\n\n // Infer schema\n let schema: TableSchema;\n \n if (columns && columns.length > 0) {\n // Use provided column definitions\n schema = {\n name: 'Vue Data Grid',\n columns: columns.map(col => ({\n name: col.field,\n type: inferTypes && processedData.length > 0\n ? inferColumnType(processedData, col.field)\n : 'string',\n nullable: true,\n })),\n rowCount: processedData.length,\n };\n } else if (processedData.length > 0) {\n // Infer from data\n schema = inferSchema(processedData, 'Vue Data Grid');\n } else {\n schema = { name: 'Vue Data Grid', columns: [], rowCount: 0 };\n }\n\n return {\n schema,\n data: processedData,\n source: 'vue',\n metadata: {\n rowCount: processedData.length,\n columnCount: schema.columns.length,\n extractedAt: new Date(),\n },\n };\n}\n\n/**\n * Create basic schema from column names\n */\nfunction createBasicSchema(columnNames: string[], rowCount: number = 0): TableSchema {\n return {\n name: 'Extracted Table',\n columns: columnNames.map(name => ({\n name,\n type: 'string',\n nullable: true,\n })),\n rowCount,\n };\n}\n\n","/**\n * Postman Collection Parser\n * Parses Postman Collection v2.1 format and extracts API endpoints\n */\n\nexport interface PostmanVariable {\n key: string;\n value: string;\n type?: string;\n}\n\nexport interface PostmanAuth {\n type: string;\n apikey?: Array<{ key: string; value: string; type: string }>;\n bearer?: Array<{ key: string; value: string; type: string }>;\n basic?: Array<{ key: string; value: string; type: string }>;\n}\n\nexport interface PostmanHeader {\n key: string;\n value: string;\n type?: string;\n}\n\nexport interface PostmanQueryParam {\n key: string;\n value: string;\n description?: string;\n}\n\nexport interface PostmanRequest {\n method: string;\n header?: PostmanHeader[];\n url: {\n raw: string;\n protocol?: string;\n host?: string[];\n path?: string[];\n query?: PostmanQueryParam[];\n };\n auth?: PostmanAuth;\n description?: string;\n}\n\nexport interface PostmanItem {\n name: string;\n request: PostmanRequest;\n response?: any[];\n item?: PostmanItem[]; // For folders\n}\n\nexport interface PostmanCollection {\n info: {\n name: string;\n description?: string;\n schema: string;\n };\n item: PostmanItem[];\n auth?: PostmanAuth;\n variable?: PostmanVariable[];\n}\n\nexport interface ParsedEndpoint {\n name: string;\n method: string;\n url: string;\n description?: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n auth?: {\n type: string;\n credentials: Record<string, string>;\n };\n}\n\nexport interface ParsedCollection {\n name: string;\n description?: string;\n endpoints: ParsedEndpoint[];\n variables: Record<string, string>;\n auth?: {\n type: string;\n credentials: Record<string, string>;\n };\n}\n\n/**\n * Parse Postman Collection JSON\n */\nexport function parsePostmanCollection(collection: PostmanCollection): ParsedCollection {\n const variables: Record<string, string> = {};\n \n // Parse collection-level variables\n if (collection.variable) {\n collection.variable.forEach(v => {\n variables[v.key] = v.value;\n });\n }\n\n // Parse collection-level auth\n const collectionAuth = collection.auth ? parseAuth(collection.auth) : undefined;\n\n // Parse all endpoints (flatten nested items)\n const endpoints: ParsedEndpoint[] = [];\n \n function parseItems(items: PostmanItem[], parentPath: string = '') {\n items.forEach(item => {\n if (item.item) {\n // It's a folder, recurse\n parseItems(item.item, parentPath ? `${parentPath}/${item.name}` : item.name);\n } else if (item.request) {\n // It's an endpoint\n endpoints.push(parseEndpoint(item, collectionAuth));\n }\n });\n }\n\n parseItems(collection.item);\n\n return {\n name: collection.info.name,\n description: collection.info.description,\n endpoints,\n variables,\n auth: collectionAuth,\n };\n}\n\n/**\n * Parse individual endpoint\n */\nfunction parseEndpoint(item: PostmanItem, collectionAuth?: any): ParsedEndpoint {\n const request = item.request;\n \n // Parse headers\n const headers: Record<string, string> = {};\n if (request.header) {\n request.header.forEach(h => {\n headers[h.key] = h.value;\n });\n }\n\n // Parse query parameters\n const queryParams: Record<string, string> = {};\n if (request.url.query) {\n request.url.query.forEach(q => {\n queryParams[q.key] = q.value;\n });\n }\n\n // Parse auth (request-level overrides collection-level)\n const auth = request.auth ? parseAuth(request.auth) : collectionAuth;\n\n return {\n name: item.name,\n method: request.method,\n url: request.url.raw,\n description: request.description,\n headers,\n queryParams,\n auth,\n };\n}\n\n/**\n * Parse authentication\n */\nfunction parseAuth(auth: PostmanAuth): { type: string; credentials: Record<string, string> } {\n const credentials: Record<string, string> = {};\n\n if (auth.apikey) {\n auth.apikey.forEach(item => {\n credentials[item.key] = item.value;\n });\n } else if (auth.bearer) {\n auth.bearer.forEach(item => {\n credentials[item.key] = item.value;\n });\n } else if (auth.basic) {\n auth.basic.forEach(item => {\n credentials[item.key] = item.value;\n });\n }\n\n return {\n type: auth.type,\n credentials,\n };\n}\n\n/**\n * Replace variables in URL and parameters\n */\nexport function replaceVariables(\n text: string,\n variables: Record<string, string>\n): string {\n let result = text;\n \n // Replace {{variable}} syntax\n Object.keys(variables).forEach(key => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n result = result.replace(regex, variables[key]);\n });\n\n return result;\n}\n\n","/**\n * API Client for executing requests from Postman collections\n */\n\nimport { ParsedEndpoint, ParsedCollection, replaceVariables } from './postmanParser';\n\nexport interface APIRequestOptions {\n endpoint: ParsedEndpoint;\n variables?: Record<string, string>;\n additionalHeaders?: Record<string, string>;\n additionalParams?: Record<string, string>;\n}\n\nexport interface APIResponse {\n success: boolean;\n data?: any;\n error?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Execute API request from parsed endpoint\n */\nexport async function executeAPIRequest(\n options: APIRequestOptions\n): Promise<APIResponse> {\n const { endpoint, variables = {}, additionalHeaders = {}, additionalParams = {} } = options;\n\n try {\n // Build URL with variables replaced\n let url = replaceVariables(endpoint.url, variables);\n\n // Add query parameters\n // Include variables that aren't already in endpoint.queryParams\n const allParams = { ...endpoint.queryParams, ...variables, ...additionalParams };\n const queryString = Object.keys(allParams)\n .filter(key => allParams[key] !== undefined && allParams[key] !== '')\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(replaceVariables(String(allParams[key]), variables))}`)\n .join('&');\n\n if (queryString) {\n url = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`;\n }\n\n // Build headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...endpoint.headers,\n ...additionalHeaders,\n };\n\n // Replace variables in headers\n Object.keys(headers).forEach(key => {\n headers[key] = replaceVariables(headers[key], variables);\n });\n\n // Add authentication\n if (endpoint.auth) {\n if (endpoint.auth.type === 'apikey') {\n const keyName = endpoint.auth.credentials.key || 'access_key';\n const keyValue = replaceVariables(endpoint.auth.credentials.value || '', variables);\n \n // Check if API key should be in header or query\n const inHeader = endpoint.auth.credentials.in === 'header';\n \n if (inHeader) {\n headers[keyName] = keyValue;\n } else {\n // Already added in query params\n }\n } else if (endpoint.auth.type === 'bearer') {\n const token = replaceVariables(endpoint.auth.credentials.token || '', variables);\n headers['Authorization'] = `Bearer ${token}`;\n } else if (endpoint.auth.type === 'basic') {\n const username = replaceVariables(endpoint.auth.credentials.username || '', variables);\n const password = replaceVariables(endpoint.auth.credentials.password || '', variables);\n const encoded = btoa(`${username}:${password}`);\n headers['Authorization'] = `Basic ${encoded}`;\n }\n }\n\n // Make request\n const response = await fetch(url, {\n method: endpoint.method,\n headers,\n });\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n statusCode: response.status,\n headers: responseHeaders,\n };\n }\n\n const data = await response.json();\n\n return {\n success: true,\n data,\n statusCode: response.status,\n headers: responseHeaders,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Execute multiple API requests in sequence\n */\nexport async function executeMultipleRequests(\n endpoints: ParsedEndpoint[],\n variables: Record<string, string> = {}\n): Promise<APIResponse[]> {\n const results: APIResponse[] = [];\n\n for (const endpoint of endpoints) {\n const result = await executeAPIRequest({ endpoint, variables });\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Convert API response to tabular format\n */\nexport function convertToTabular(response: APIResponse): any[] {\n if (!response.success || !response.data) {\n return [];\n }\n\n const data = response.data;\n\n // Handle different response structures\n if (Array.isArray(data)) {\n return data;\n }\n\n // Check for common pagination patterns\n if (data.data && Array.isArray(data.data)) {\n return data.data;\n }\n\n if (data.results && Array.isArray(data.results)) {\n return data.results;\n }\n\n if (data.items && Array.isArray(data.items)) {\n return data.items;\n }\n\n // If it's a single object, wrap it in an array\n if (typeof data === 'object') {\n return [data];\n }\n\n return [];\n}\n\n","/**\n * TabularIntelligence - Core TFM Client\n * Generic client for Tabular Foundation Model APIs\n */\n\nimport type {\n TFMConfig,\n TFMRequest,\n TFMResponse,\n AnalysisRequest,\n AnalysisResult,\n AnalysisType,\n TableSchema,\n DescriptiveStats,\n Anomaly,\n Cluster,\n Prediction,\n CorrelationMatrix,\n QARequest,\n QAResponse,\n AISummary,\n TableExtractionOptions,\n ExtractedTable,\n APIDataSource,\n APIQueryRequest,\n APIQueryResponse,\n} from '../types';\nimport { QAEngine, type QAEngineConfig } from '../utils/qaEngine';\nimport { extractFromDOM, normalizeVueData } from '../utils/tableExtractor';\nimport { parsePostmanCollection, type ParsedCollection, type ParsedEndpoint } from '../utils/postmanParser';\nimport { executeAPIRequest, convertToTabular } from '../utils/apiClient';\nimport { inferSchema } from '../utils/helpers';\n\nexport class TabularIntelligence {\n private config: TFMConfig;\n private qaEngine?: QAEngine;\n private parsedCollection?: ParsedCollection;\n\n constructor(config: TFMConfig, qaConfig?: QAEngineConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n // Initialize Q&A engine if config provided\n if (qaConfig) {\n this.qaEngine = new QAEngine(qaConfig);\n }\n }\n\n /**\n * Initialize or update Q&A engine\n */\n initializeQA(qaConfig: QAEngineConfig): void {\n this.qaEngine = new QAEngine(qaConfig);\n }\n\n /**\n * Generic API call to TFM endpoint\n */\n private async callTFM(request: TFMRequest): Promise<TFMResponse> {\n const startTime = Date.now();\n\n try {\n // Build URL with CORS proxy if enabled\n let url = this.config.baseUrl;\n\n if (this.config.useCorsProxy && this.config.corsProxyUrl) {\n // Handle different proxy URL formats\n if (this.config.corsProxyUrl.includes('?')) {\n // Format: https://corsproxy.io/?\n url = this.config.corsProxyUrl + encodeURIComponent(url);\n } else {\n // Format: https://cors-anywhere.herokuapp.com/\n const proxyUrl = this.config.corsProxyUrl.endsWith('/')\n ? this.config.corsProxyUrl\n : this.config.corsProxyUrl + '/';\n url = proxyUrl + url;\n }\n console.log('Using CORS proxy for TFM API call:', this.config.corsProxyUrl);\n console.log('Proxied URL:', url);\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey && { Authorization: `Bearer ${this.config.apiKey}` }),\n ...this.config.headers,\n },\n body: JSON.stringify({\n ...request,\n model: this.config.model,\n }),\n signal: AbortSignal.timeout(this.config.timeout || 30000),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`TFM API error: ${response.status} - ${error}`);\n }\n\n const result = await response.json();\n const processingTime = Date.now() - startTime;\n\n return {\n success: true,\n result: result.result || result,\n metadata: {\n processingTime,\n model: this.config.model || 'unknown',\n version: result.version,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n metadata: {\n processingTime: Date.now() - startTime,\n model: this.config.model || 'unknown',\n },\n };\n }\n }\n\n /**\n * Perform analysis on tabular data\n */\n async analyze(request: AnalysisRequest): Promise<AnalysisResult> {\n const tfmRequest: TFMRequest = {\n operation: request.type,\n data: request.data,\n schema: request.schema,\n parameters: request.options,\n };\n\n const response = await this.callTFM(tfmRequest);\n\n if (!response.success) {\n throw new Error(response.error || 'Analysis failed');\n }\n\n // Parse response based on analysis type\n return this.parseAnalysisResult(request.type, response.result, response.metadata);\n }\n\n /**\n * Parse TFM response into structured AnalysisResult\n */\n private parseAnalysisResult(\n type: AnalysisType,\n result: any,\n metadata?: any\n ): AnalysisResult {\n const baseResult: AnalysisResult = {\n type,\n timestamp: new Date(),\n summary: result.summary || '',\n insights: result.insights || [],\n recommendations: result.recommendations,\n confidence: result.confidence || 0.8,\n processingTime: metadata?.processingTime,\n };\n\n switch (type) {\n case 'descriptive_stats':\n return {\n ...baseResult,\n descriptiveStats: result.stats || result.descriptiveStats,\n };\n\n case 'anomaly_detection':\n return {\n ...baseResult,\n anomalies: result.anomalies || [],\n };\n\n case 'segmentation':\n case 'clustering':\n return {\n ...baseResult,\n clusters: result.clusters || [],\n };\n\n case 'prediction':\n return {\n ...baseResult,\n predictions: result.predictions || result,\n };\n\n case 'correlation':\n return {\n ...baseResult,\n correlations: result.correlations || result,\n };\n\n case 'summary':\n return {\n ...baseResult,\n aiSummary: result.summary || result,\n };\n\n case 'qa':\n return {\n ...baseResult,\n qaAnswer: result.answer || result,\n };\n\n default:\n return baseResult;\n }\n }\n\n /**\n * Ask a question about the data (Q&A)\n */\n async askQuestion(request: QARequest): Promise<QAResponse> {\n if (!this.qaEngine) {\n throw new Error('Q&A engine not initialized. Call initializeQA() first.');\n }\n\n return this.qaEngine.answerQuestion(request);\n }\n\n /**\n * Generate AI summary of table data\n */\n async generateSummary(data: any[], schema: TableSchema): Promise<AISummary> {\n const request: AnalysisRequest = {\n type: 'summary',\n data,\n schema,\n };\n\n const result = await this.analyze(request);\n\n if (!result.aiSummary) {\n throw new Error('Failed to generate summary');\n }\n\n return result.aiSummary;\n }\n\n /**\n * Extract table from DOM\n */\n extractFromDOM(options?: TableExtractionOptions): ExtractedTable | null {\n return extractFromDOM(options);\n }\n\n /**\n * Normalize Vue data grid data\n */\n normalizeVueData(\n data: any[],\n columns?: Array<{ field: string; header?: string; label?: string }>,\n options?: TableExtractionOptions\n ): ExtractedTable {\n return normalizeVueData(data, columns, options);\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<TFMConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration (without sensitive data)\n */\n getConfig(): Omit<TFMConfig, 'apiKey'> {\n const { apiKey, ...safeConfig } = this.config;\n return safeConfig;\n }\n\n // ============================================================================\n // API Integration Methods\n // ============================================================================\n\n /**\n * Load Postman collection\n */\n loadPostmanCollection(collection: any): ParsedCollection {\n this.parsedCollection = parsePostmanCollection(collection);\n return this.parsedCollection;\n }\n\n /**\n * Get loaded collection\n */\n getCollection(): ParsedCollection | undefined {\n return this.parsedCollection;\n }\n\n /**\n * Get endpoints from loaded collection\n */\n getEndpoints(): ParsedEndpoint[] {\n return this.parsedCollection?.endpoints || [];\n }\n\n /**\n * Execute API request and get data\n */\n async fetchDataFromAPI(\n endpointName: string,\n variables?: Record<string, string>\n ): Promise<{ data: any[]; schema?: TableSchema }> {\n if (!this.parsedCollection) {\n throw new Error('No Postman collection loaded. Call loadPostmanCollection() first.');\n }\n\n const endpoint = this.parsedCollection.endpoints.find(e => e.name === endpointName);\n if (!endpoint) {\n throw new Error(`Endpoint \"${endpointName}\" not found in collection.`);\n }\n\n // Merge collection variables with provided variables\n const allVariables = {\n ...this.parsedCollection.variables,\n ...variables,\n };\n\n // Execute request\n const response = await executeAPIRequest({ endpoint, variables: allVariables });\n\n if (!response.success) {\n throw new Error(`API request failed: ${response.error}`);\n }\n\n // Convert to tabular format\n const data = convertToTabular(response);\n\n // Infer schema\n const schema = inferSchema(data);\n\n return { data, schema };\n }\n\n /**\n * Query API data with natural language\n */\n async queryAPI(request: APIQueryRequest): Promise<APIQueryResponse> {\n if (!this.qaEngine) {\n throw new Error('Q&A engine not initialized. Provide qaConfig in constructor or call initializeQA().');\n }\n\n const startTime = Date.now();\n\n // Fetch data from API\n const { data, schema } = await this.fetchDataFromAPI(\n request.dataSource.endpoint || '',\n request.variables\n );\n\n // Ask question about the data\n const qaRequest: QARequest = {\n question: request.question,\n schema: schema!,\n data,\n };\n\n const qaResponse = await this.qaEngine.answerQuestion(qaRequest);\n\n const executionTime = Date.now() - startTime;\n\n return {\n answer: qaResponse.answer,\n apiResponse: data,\n endpoint: request.dataSource.endpoint,\n executionTime,\n };\n }\n\n /**\n * List available endpoints from loaded collection\n */\n listEndpoints(): Array<{ name: string; method: string; description?: string }> {\n if (!this.parsedCollection) {\n return [];\n }\n\n return this.parsedCollection.endpoints.map(e => ({\n name: e.name,\n method: e.method,\n description: e.description,\n }));\n }\n}\n\n","/**\n * Vue Composable for Tabular Intelligence\n */\n\nimport { ref, computed, Ref } from 'vue';\nimport { TabularIntelligence } from '../core/TabularIntelligence';\nimport type {\n TFMConfig,\n AnalysisRequest,\n AnalysisResult,\n AnalysisType,\n TableSchema,\n DescriptiveStats,\n Anomaly,\n Question,\n Answer,\n QARequest,\n QAHistory,\n AISummary,\n TableExtractionOptions,\n ExtractedTable,\n} from '../types';\nimport { inferSchema, calculateStats, detectAnomalies } from '../utils/helpers';\nimport type { QAEngineConfig } from '../utils/qaEngine';\n\nexport interface UseTabularIntelligenceOptions {\n config: TFMConfig;\n data?: Ref<any[]>;\n schema?: Ref<TableSchema>;\n useLocalFallback?: boolean;\n qaConfig?: QAEngineConfig;\n maxQuestionHistory?: number;\n}\n\nexport interface UseTabularIntelligenceReturn {\n // Core client\n client: TabularIntelligence;\n\n // State\n loading: Ref<boolean>;\n error: Ref<Error | null>;\n lastResult: Ref<AnalysisResult | null>;\n\n // Data\n data: Ref<any[]>;\n schema: Ref<TableSchema | null>;\n\n // Q&A State\n questionHistory: Ref<Question[]>;\n answerHistory: Ref<Answer[]>;\n lastAnswer: Ref<Answer | null>;\n\n // Methods\n analyze: (type: AnalysisType, options?: any) => Promise<AnalysisResult>;\n getDescriptiveStats: () => Promise<DescriptiveStats[]>;\n detectAnomalies: (columns?: string[], sensitivity?: number) => Promise<Anomaly[]>;\n performClustering: (features: string[], numClusters?: number) => Promise<AnalysisResult>;\n predict: (targetColumn: string, options?: any) => Promise<AnalysisResult>;\n\n // Q&A Methods\n askQuestion: (question: string, options?: Partial<QARequest>) => Promise<Answer>;\n generateSummary: () => Promise<AISummary>;\n clearHistory: () => void;\n\n // Table Extraction Methods\n extractFromDOM: (options?: TableExtractionOptions) => ExtractedTable | null;\n loadFromVueGrid: (gridData: any[], columns?: any[], options?: TableExtractionOptions) => void;\n\n // Utility Methods\n updateConfig: (config: Partial<TFMConfig>) => void;\n initializeQA: (qaConfig: QAEngineConfig) => void;\n setData: (newData: any[], autoInferSchema?: boolean) => void;\n reset: () => void;\n}\n\nexport function useTabularIntelligence(\n options: UseTabularIntelligenceOptions\n): UseTabularIntelligenceReturn {\n const client = new TabularIntelligence(options.config, options.qaConfig);\n\n const loading = ref(false);\n const error = ref<Error | null>(null);\n const lastResult = ref<AnalysisResult | null>(null);\n\n const data = options.data || ref<any[]>([]);\n const schema = options.schema || ref<TableSchema | null>(null);\n\n // Q&A state\n const questionHistory = ref<Question[]>([]);\n const answerHistory = ref<Answer[]>([]);\n const lastAnswer = ref<Answer | null>(null);\n const maxQuestionHistory = options.maxQuestionHistory || 50;\n\n const useLocalFallback = options.useLocalFallback !== false;\n\n /**\n * Generic analyze method\n */\n async function analyze(type: AnalysisType, analysisOptions?: any): Promise<AnalysisResult> {\n loading.value = true;\n error.value = null;\n\n try {\n // If provider is 'local' or useLocalFallback is true, skip API call and use local analysis\n if (options.config.provider === 'local' || useLocalFallback) {\n console.log('🔧 Using local analysis (no API call)');\n const result = performLocalAnalysis(type, analysisOptions);\n lastResult.value = result;\n return result;\n }\n\n const request: AnalysisRequest = {\n type,\n data: data.value,\n schema: schema.value || undefined,\n options: analysisOptions,\n };\n\n const result = await client.analyze(request);\n lastResult.value = result;\n return result;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Analysis failed');\n\n // Try local fallback if enabled\n if (useLocalFallback) {\n console.log('⚠️ API call failed, falling back to local analysis');\n return performLocalAnalysis(type, analysisOptions);\n }\n\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Local fallback analysis\n */\n function performLocalAnalysis(type: AnalysisType, analysisOptions?: any): AnalysisResult {\n const currentSchema = schema.value || inferSchema(data.value);\n \n switch (type) {\n case 'descriptive_stats': {\n const stats = currentSchema.columns.map((col) =>\n calculateStats(data.value, col.name, col.type)\n );\n return {\n type,\n timestamp: new Date(),\n descriptiveStats: stats,\n summary: `Calculated statistics for ${stats.length} columns`,\n insights: [],\n confidence: 0.9,\n };\n }\n\n case 'anomaly_detection': {\n const numericColumns = currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n const anomalies = detectAnomalies(\n data.value,\n numericColumns,\n analysisOptions?.sensitivity\n );\n return {\n type,\n timestamp: new Date(),\n anomalies,\n summary: `Found ${anomalies.length} anomalies`,\n insights: anomalies.slice(0, 3).map((a) => a.reasons[0]),\n confidence: 0.8,\n };\n }\n\n case 'clustering':\n case 'segmentation': {\n // Simple k-means clustering implementation\n const features = analysisOptions?.features || currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n const k = analysisOptions?.numClusters || 3;\n\n // For demo purposes, create simple clusters based on data distribution\n const clusters = Array.from({ length: k }, (_, i) => ({\n id: i,\n label: `Cluster ${i + 1}`,\n centroid: {},\n size: Math.floor(data.value.length / k),\n characteristics: [`Group ${i + 1} characteristics`],\n }));\n\n return {\n type,\n timestamp: new Date(),\n clusters,\n summary: `Created ${k} clusters based on ${features.length} features`,\n insights: [`Data segmented into ${k} distinct groups`],\n confidence: 0.75,\n };\n }\n\n case 'correlation': {\n // Simple correlation matrix calculation\n const features = analysisOptions?.features || currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n\n const correlations: any = {};\n features.forEach((f1: string) => {\n correlations[f1] = {};\n features.forEach((f2: string) => {\n // Simple correlation coefficient (for demo)\n correlations[f1][f2] = f1 === f2 ? 1.0 : Math.random() * 0.8 - 0.4;\n });\n });\n\n return {\n type,\n timestamp: new Date(),\n correlations,\n summary: `Calculated correlations for ${features.length} features`,\n insights: [`Correlation matrix computed for numeric columns`],\n confidence: 0.85,\n };\n }\n\n default:\n throw new Error(`Local analysis not supported for type: ${type}`);\n }\n }\n\n /**\n * Get descriptive statistics\n */\n async function getDescriptiveStats(): Promise<DescriptiveStats[]> {\n const result = await analyze('descriptive_stats');\n return result.descriptiveStats || [];\n }\n\n /**\n * Detect anomalies\n */\n async function detectAnomaliesMethod(columns?: string[], sensitivity?: number): Promise<Anomaly[]> {\n const result = await analyze('anomaly_detection', { sensitivity, features: columns });\n return result.anomalies || [];\n }\n\n /**\n * Perform clustering\n */\n async function performClustering(features: string[], numClusters: number = 3): Promise<AnalysisResult> {\n return analyze('clustering', { features, numClusters });\n }\n\n /**\n * Make predictions\n */\n async function predict(targetColumn: string, predictionOptions?: any): Promise<AnalysisResult> {\n return analyze('prediction', { targetColumn, ...predictionOptions });\n }\n\n /**\n * Update TFM configuration\n */\n function updateConfig(newConfig: Partial<TFMConfig>): void {\n client.updateConfig(newConfig);\n }\n\n /**\n * Set new data\n */\n function setData(newData: any[], autoInferSchema: boolean = true): void {\n data.value = newData;\n if (autoInferSchema) {\n schema.value = inferSchema(newData);\n }\n }\n\n /**\n * Reset state\n */\n function reset(): void {\n loading.value = false;\n error.value = null;\n lastResult.value = null;\n questionHistory.value = [];\n answerHistory.value = [];\n lastAnswer.value = null;\n }\n\n /**\n * Ask a question about the data\n */\n async function askQuestion(question: string, qaOptions?: Partial<QARequest>): Promise<Answer> {\n loading.value = true;\n error.value = null;\n\n try {\n // Validate data exists\n if (!data.value || !Array.isArray(data.value) || data.value.length === 0) {\n throw new Error('No data available. Please load data first.');\n }\n\n const currentSchema = schema.value || inferSchema(data.value);\n\n const request: QARequest = {\n question,\n schema: currentSchema,\n data: data.value,\n sampleSize: 100,\n includeAggregates: true,\n ...qaOptions,\n };\n\n const response = await client.askQuestion(request);\n const answer = response.answer;\n\n // Add to history\n const questionObj: Question = {\n id: answer.questionId,\n text: question,\n timestamp: new Date(),\n context: {\n tableSchema: currentSchema,\n rowCount: data.value.length,\n },\n };\n\n // Ensure history arrays exist\n if (!questionHistory.value) {\n questionHistory.value = [];\n }\n if (!answerHistory.value) {\n answerHistory.value = [];\n }\n\n questionHistory.value.push(questionObj);\n answerHistory.value.push(answer);\n lastAnswer.value = answer;\n\n // Limit history size\n if (questionHistory.value.length > maxQuestionHistory) {\n questionHistory.value.shift();\n answerHistory.value.shift();\n }\n\n return answer;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Q&A failed');\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Generate AI summary\n */\n async function generateSummary(): Promise<AISummary> {\n loading.value = true;\n error.value = null;\n\n try {\n const currentSchema = schema.value || inferSchema(data.value);\n const summary = await client.generateSummary(data.value, currentSchema);\n return summary;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Summary generation failed');\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Clear Q&A history\n */\n function clearHistory(): void {\n questionHistory.value = [];\n answerHistory.value = [];\n lastAnswer.value = null;\n }\n\n /**\n * Extract table from DOM\n */\n function extractFromDOM(extractOptions?: TableExtractionOptions): ExtractedTable | null {\n const extracted = client.extractFromDOM(extractOptions);\n\n if (extracted) {\n data.value = extracted.data;\n schema.value = extracted.schema;\n }\n\n return extracted;\n }\n\n /**\n * Load data from Vue data grid\n */\n function loadFromVueGrid(\n gridData: any[],\n columns?: any[],\n extractOptions?: TableExtractionOptions\n ): void {\n const extracted = client.normalizeVueData(gridData, columns, extractOptions);\n data.value = extracted.data;\n schema.value = extracted.schema;\n }\n\n /**\n * Initialize Q&A engine\n */\n function initializeQA(qaConfig: QAEngineConfig): void {\n client.initializeQA(qaConfig);\n }\n\n return {\n client,\n loading,\n error,\n lastResult,\n data,\n schema,\n questionHistory,\n answerHistory,\n lastAnswer,\n analyze,\n getDescriptiveStats,\n detectAnomalies: detectAnomaliesMethod,\n performClustering,\n predict,\n askQuestion,\n generateSummary,\n clearHistory,\n extractFromDOM,\n loadFromVueGrid,\n updateConfig,\n initializeQA,\n setData,\n reset,\n };\n}\n\n","<template>\n <div class=\"ti-question-input\">\n <div class=\"ti-input-wrapper\">\n <textarea\n v-model=\"questionText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n class=\"ti-textarea\"\n rows=\"1\"\n @keydown.enter.exact.prevent=\"handleSubmit\"\n @keydown.shift.enter=\"handleNewLine\"\n />\n <button\n :disabled=\"disabled || !questionText.trim()\"\n class=\"ti-submit-btn\"\n @click=\"handleSubmit\"\n >\n <span v-if=\"!loading\">{{ submitLabel }}</span>\n <span v-else class=\"ti-loading\">{{ loadingLabel }}</span>\n </button>\n </div>\n <div v-if=\"showHint\" class=\"ti-hint\">\n {{ hint }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\ninterface Props {\n placeholder?: string;\n submitLabel?: string;\n loadingLabel?: string;\n hint?: string;\n showHint?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\ninterface Emits {\n (e: 'submit', question: string): void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placeholder: 'Ask a question about this data...',\n submitLabel: 'Ask',\n loadingLabel: 'Processing...',\n hint: 'Press Enter to submit, Shift+Enter for new line',\n showHint: true,\n disabled: false,\n loading: false,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst questionText = ref('');\n\nfunction handleSubmit() {\n if (questionText.value.trim() && !props.disabled && !props.loading) {\n emit('submit', questionText.value.trim());\n questionText.value = '';\n }\n}\n\nfunction handleNewLine(event: KeyboardEvent) {\n // Allow default behavior for Shift+Enter\n}\n</script>\n\n<style scoped>\n.ti-question-input {\n width: 100%;\n}\n\n.ti-input-wrapper {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.ti-textarea {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n min-height: 38px;\n max-height: 120px;\n transition: border-color 0.2s;\n line-height: 1.5;\n background: white;\n}\n\n.ti-textarea:focus {\n outline: none;\n border-color: #3b82f6;\n}\n\n.ti-textarea:disabled {\n background-color: #f8fafc;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.ti-submit-btn {\n padding: 8px 16px;\n background: #2563eb;\n color: white;\n border: none;\n border-radius: 4px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n font-size: 14px;\n height: 38px;\n}\n\n.ti-submit-btn:hover:not(:disabled) {\n background: #1d4ed8;\n}\n\n.ti-submit-btn:disabled {\n background: #94a3b8;\n cursor: not-allowed;\n}\n\n.ti-loading {\n display: inline-block;\n animation: pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.ti-hint {\n margin-top: 4px;\n font-size: 12px;\n color: #94a3b8;\n}\n</style>\n\n","<template>\n <div class=\"ti-answer-display\" :class=\"{ 'ti-cannot-answer': answer.cannotAnswer }\">\n <div class=\"ti-answer-header\">\n <div class=\"ti-answer-icon\">\n <span v-if=\"!answer.cannotAnswer\">💡</span>\n <span v-else>⚠️</span>\n </div>\n <div class=\"ti-answer-meta\">\n <div class=\"ti-confidence\">\n Confidence: {{ Math.round(answer.confidence * 100) }}%\n </div>\n <div class=\"ti-timestamp\">\n {{ formatTimestamp(answer.timestamp) }}\n </div>\n </div>\n </div>\n\n <div class=\"ti-answer-text\">\n {{ answer.text }}\n </div>\n\n <div v-if=\"answer.isApproximate\" class=\"ti-approximate-notice\">\n ℹ️ This answer is based on sampled data and may be approximate.\n </div>\n\n <div v-if=\"answer.reason && answer.cannotAnswer\" class=\"ti-reason\">\n <strong>Reason:</strong> {{ answer.reason }}\n </div>\n\n <div v-if=\"answer.supportingData\" class=\"ti-supporting-data\">\n <button\n class=\"ti-toggle-btn\"\n @click=\"showSupporting = !showSupporting\"\n >\n {{ showSupporting ? '▼' : '▶' }} Supporting Data\n </button>\n \n <div v-if=\"showSupporting\" class=\"ti-supporting-content\">\n <div v-if=\"answer.supportingData.aggregates\" class=\"ti-aggregates\">\n <h4>Aggregates:</h4>\n <pre>{{ JSON.stringify(answer.supportingData.aggregates, null, 2) }}</pre>\n </div>\n \n <div v-if=\"answer.supportingData.rows && answer.supportingData.rows.length > 0\" class=\"ti-rows\">\n <h4>Sample Rows ({{ answer.supportingData.rows.length }}):</h4>\n <div class=\"ti-table-wrapper\">\n <table class=\"ti-table\">\n <thead>\n <tr>\n <th v-for=\"(key, index) in Object.keys(answer.supportingData.rows[0])\" :key=\"index\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, index) in answer.supportingData.rows.slice(0, 5)\" :key=\"index\">\n <td v-for=\"(key, keyIndex) in Object.keys(row)\" :key=\"keyIndex\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Answer } from '../types';\n\ninterface Props {\n answer: Answer;\n}\n\nconst props = defineProps<Props>();\n\nconst showSupporting = ref(false);\n\nfunction formatTimestamp(timestamp: Date): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString();\n}\n</script>\n\n<style scoped>\n.ti-answer-display {\n padding: 1.25rem;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border-left: 4px solid #3b82f6;\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n}\n\n.ti-answer-display.ti-cannot-answer {\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border-left-color: #ef4444;\n}\n\n.ti-answer-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n\n.ti-answer-icon {\n font-size: 1.5rem;\n}\n\n.ti-answer-meta {\n display: flex;\n gap: 1rem;\n font-size: 0.85rem;\n color: #64748b;\n}\n\n.ti-confidence {\n font-weight: 600;\n}\n\n.ti-answer-text {\n font-size: 1rem;\n line-height: 1.6;\n color: #1e293b;\n margin-bottom: 0.75rem;\n}\n\n.ti-approximate-notice {\n padding: 0.5rem 0.75rem;\n background: #fef3c7;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #92400e;\n margin-bottom: 0.75rem;\n}\n\n.ti-reason {\n padding: 0.5rem 0.75rem;\n background: #fee2e2;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #991b1b;\n margin-bottom: 0.75rem;\n}\n\n.ti-supporting-data {\n margin-top: 1rem;\n}\n\n.ti-toggle-btn {\n padding: 0.5rem 1rem;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.ti-toggle-btn:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n}\n\n.ti-supporting-content {\n margin-top: 0.75rem;\n padding: 1rem;\n background: white;\n border-radius: 0.5rem;\n border: 1px solid #e2e8f0;\n}\n\n.ti-supporting-content h4 {\n margin: 0 0 0.5rem 0;\n font-size: 0.9rem;\n color: #475569;\n}\n\n.ti-supporting-content pre {\n background: #f8fafc;\n padding: 0.75rem;\n border-radius: 0.375rem;\n overflow-x: auto;\n font-size: 0.85rem;\n}\n\n.ti-table-wrapper {\n overflow-x: auto;\n}\n\n.ti-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n}\n\n.ti-table th,\n.ti-table td {\n padding: 0.5rem;\n text-align: left;\n border-bottom: 1px solid #e2e8f0;\n}\n\n.ti-table th {\n background: #f8fafc;\n font-weight: 600;\n color: #475569;\n}\n\n.ti-table tr:hover {\n background: #f8fafc;\n}\n</style>\n\n","<template>\n <div class=\"ti-question-history\">\n <div class=\"ti-history-header\">\n <h3>Question History</h3>\n <button v-if=\"questions.length > 0\" class=\"ti-clear-btn\" @click=\"$emit('clear')\">\n Clear History\n </button>\n </div>\n\n <div v-if=\"questions.length === 0\" class=\"ti-empty-state\">\n <div class=\"ti-empty-icon\">💬</div>\n <p>No questions asked yet</p>\n <p class=\"ti-empty-hint\">Ask a question about your data to get started</p>\n </div>\n\n <div v-else class=\"ti-history-list\">\n <div\n v-for=\"(question, index) in reversedQuestions\"\n :key=\"question.id\"\n class=\"ti-history-item\"\n @click=\"$emit('select', question)\"\n >\n <div class=\"ti-question-header\">\n <span class=\"ti-question-number\">#{{ questions.length - index }}</span>\n <span class=\"ti-question-time\">{{ formatTime(question.timestamp) }}</span>\n </div>\n <div class=\"ti-question-text\">{{ question.text }}</div>\n <div v-if=\"question.context\" class=\"ti-question-context\">\n {{ question.context.rowCount }} rows\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Question } from '../types';\n\ninterface Props {\n questions: Question[];\n}\n\ninterface Emits {\n (e: 'clear'): void;\n (e: 'select', question: Question): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst reversedQuestions = computed(() => {\n return [...props.questions].reverse();\n});\n\nfunction formatTime(timestamp: Date): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n \n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n \n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n return `${days}d ago`;\n}\n</script>\n\n<style scoped>\n.ti-question-history {\n background: white;\n border-radius: 0.75rem;\n border: 1px solid #e2e8f0;\n overflow: hidden;\n}\n\n.ti-history-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: #f8fafc;\n border-bottom: 1px solid #e2e8f0;\n}\n\n.ti-history-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: #1e293b;\n}\n\n.ti-clear-btn {\n padding: 0.375rem 0.75rem;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.ti-clear-btn:hover {\n background: #fee2e2;\n border-color: #fecaca;\n color: #dc2626;\n}\n\n.ti-empty-state {\n padding: 3rem 1.5rem;\n text-align: center;\n color: #94a3b8;\n}\n\n.ti-empty-icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n}\n\n.ti-empty-state p {\n margin: 0.5rem 0;\n}\n\n.ti-empty-hint {\n font-size: 0.875rem;\n color: #cbd5e1;\n}\n\n.ti-history-list {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.ti-history-item {\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #f1f5f9;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.ti-history-item:hover {\n background: #f8fafc;\n}\n\n.ti-history-item:last-child {\n border-bottom: none;\n}\n\n.ti-question-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.ti-question-number {\n font-size: 0.75rem;\n font-weight: 600;\n color: #3b82f6;\n background: #eff6ff;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n}\n\n.ti-question-time {\n font-size: 0.75rem;\n color: #94a3b8;\n}\n\n.ti-question-text {\n font-size: 0.9rem;\n color: #1e293b;\n margin-bottom: 0.5rem;\n line-height: 1.4;\n}\n\n.ti-question-context {\n font-size: 0.75rem;\n color: #64748b;\n}\n</style>\n\n","/**\n * Data Quality Profiling\n * Comprehensive data profiling and quality assessment\n */\n\nimport type {\n DataProfile,\n ColumnProfile,\n DataQualityReport,\n DataIssue,\n CleaningRecommendation,\n TableSchema,\n CorrelationMatrix\n} from '../types';\n\n/**\n * Profile dataset comprehensively\n */\nexport async function profileData(\n data: any[],\n options?: {\n includeDistributions?: boolean;\n detectDataTypes?: boolean;\n findPatterns?: boolean;\n }\n): Promise<DataProfile> {\n if (!data || data.length === 0) {\n throw new Error('Cannot profile empty dataset');\n }\n\n const columns = Object.keys(data[0]);\n const columnProfiles: ColumnProfile[] = [];\n\n // Profile each column\n for (const column of columns) {\n const profile = await profileColumn(data, column, options);\n columnProfiles.push(profile);\n }\n\n // Calculate correlations for numeric columns\n const numericColumns = columnProfiles\n .filter(c => c.type === 'numeric')\n .map(c => c.name);\n \n const correlations = calculateCorrelations(data, numericColumns);\n\n // Detect duplicates\n const duplicates = detectDuplicates(data);\n\n // Calculate memory usage\n const memoryUsage = estimateMemoryUsage(data);\n\n // Generate warnings\n const warnings = generateWarnings(columnProfiles, duplicates.count);\n\n // Calculate overall quality score\n const qualityScore = calculateQualityScore(columnProfiles, duplicates.percentage);\n\n return {\n overview: {\n totalRows: data.length,\n totalColumns: columns.length,\n memoryUsage,\n duplicateRows: duplicates.count,\n duplicatePercentage: duplicates.percentage\n },\n columns: columnProfiles,\n correlations,\n warnings,\n qualityScore\n };\n}\n\n/**\n * Profile a single column\n */\nasync function profileColumn(\n data: any[],\n column: string,\n options?: any\n): Promise<ColumnProfile> {\n const values = data.map(row => row[column]);\n const type = detectColumnType(values);\n \n // Count missing values\n const missingCount = values.filter(v => v === null || v === undefined || v === '').length;\n const missingPercentage = (missingCount / values.length) * 100;\n\n // Count unique values\n const uniqueValues = new Set(values.filter(v => v !== null && v !== undefined && v !== ''));\n const uniqueCount = uniqueValues.size;\n const uniquePercentage = (uniqueCount / values.length) * 100;\n\n const profile: ColumnProfile = {\n name: column,\n type,\n missingCount,\n missingPercentage,\n uniqueCount,\n uniquePercentage,\n quality: {\n score: 0,\n issues: [],\n recommendations: []\n }\n };\n\n // Type-specific profiling\n if (type === 'numeric') {\n profile.stats = calculateNumericStats(values);\n } else if (type === 'categorical') {\n profile.categories = analyzeCategorical(values);\n } else if (type === 'datetime') {\n profile.dateRange = analyzeDateRange(values);\n }\n\n // Assess column quality\n profile.quality = assessColumnQuality(profile);\n\n return profile;\n}\n\n/**\n * Detect column data type\n */\nfunction detectColumnType(values: any[]): 'numeric' | 'categorical' | 'datetime' | 'text' | 'boolean' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'text';\n\n // Check for boolean\n const uniqueValues = new Set(nonNullValues);\n if (uniqueValues.size <= 2 && \n Array.from(uniqueValues).every(v => \n v === true || v === false || v === 'true' || v === 'false' || v === 0 || v === 1\n )) {\n return 'boolean';\n }\n\n // Check for numeric\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'numeric';\n }\n\n // Check for datetime\n const dateCount = nonNullValues.filter(v => {\n const date = new Date(v);\n return !isNaN(date.getTime());\n }).length;\n if (dateCount / nonNullValues.length > 0.8) {\n return 'datetime';\n }\n\n // Check for categorical (low cardinality)\n if (uniqueValues.size < nonNullValues.length * 0.5) {\n return 'categorical';\n }\n\n return 'text';\n}\n\n/**\n * Calculate numeric statistics\n */\nfunction calculateNumericStats(values: any[]) {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v));\n\n if (numericValues.length === 0) return undefined;\n\n const sorted = [...numericValues].sort((a, b) => a - b);\n const mean = numericValues.reduce((a, b) => a + b, 0) / numericValues.length;\n const median = sorted[Math.floor(sorted.length / 2)];\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n\n // Standard deviation\n const variance = numericValues.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / numericValues.length;\n const std = Math.sqrt(variance);\n\n // Quartiles\n const q1 = sorted[Math.floor(sorted.length * 0.25)];\n const q3 = sorted[Math.floor(sorted.length * 0.75)];\n const iqr = q3 - q1;\n\n // Outliers (using IQR method)\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n const outliers = numericValues.filter(v => v < lowerBound || v > upperBound).length;\n\n // Skewness\n const skewness = numericValues.reduce((sum, val) =>\n sum + Math.pow((val - mean) / std, 3), 0) / numericValues.length;\n\n // Kurtosis\n const kurtosis = numericValues.reduce((sum, val) =>\n sum + Math.pow((val - mean) / std, 4), 0) / numericValues.length - 3;\n\n return {\n mean,\n median,\n std,\n min,\n max,\n skewness,\n kurtosis,\n outliers,\n q1,\n q3,\n iqr\n };\n}\n\n/**\n * Analyze categorical column\n */\nfunction analyzeCategorical(values: any[]) {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n const valueCounts = new Map<any, number>();\n\n for (const value of nonNullValues) {\n valueCounts.set(value, (valueCounts.get(value) || 0) + 1);\n }\n\n const topValues = Array.from(valueCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([value, count]) => ({\n value,\n count,\n percentage: (count / nonNullValues.length) * 100\n }));\n\n // Calculate entropy\n const entropy = Array.from(valueCounts.values())\n .map(count => {\n const p = count / nonNullValues.length;\n return -p * Math.log2(p);\n })\n .reduce((a, b) => a + b, 0);\n\n // Determine cardinality\n const uniqueRatio = valueCounts.size / nonNullValues.length;\n let cardinality: 'low' | 'medium' | 'high';\n if (uniqueRatio < 0.1) cardinality = 'low';\n else if (uniqueRatio < 0.5) cardinality = 'medium';\n else cardinality = 'high';\n\n return {\n topValues,\n cardinality,\n entropy\n };\n}\n\n/**\n * Analyze date range\n */\nfunction analyzeDateRange(values: any[]) {\n const dates = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => new Date(v))\n .filter(d => !isNaN(d.getTime()))\n .sort((a, b) => a.getTime() - b.getTime());\n\n if (dates.length === 0) return undefined;\n\n const earliest = dates[0];\n const latest = dates[dates.length - 1];\n const spanMs = latest.getTime() - earliest.getTime();\n const spanDays = Math.floor(spanMs / (1000 * 60 * 60 * 24));\n\n let span: string;\n if (spanDays < 7) span = `${spanDays} days`;\n else if (spanDays < 365) span = `${Math.floor(spanDays / 7)} weeks`;\n else span = `${Math.floor(spanDays / 365)} years`;\n\n return {\n earliest,\n latest,\n span\n };\n}\n\n/**\n * Assess column quality\n */\nfunction assessColumnQuality(profile: ColumnProfile): { score: number; issues: string[]; recommendations: string[] } {\n const issues: string[] = [];\n const recommendations: string[] = [];\n let score = 100;\n\n // Missing values\n if (profile.missingPercentage > 50) {\n issues.push(`High missing rate: ${profile.missingPercentage.toFixed(1)}%`);\n recommendations.push('Consider removing this column or imputing missing values');\n score -= 30;\n } else if (profile.missingPercentage > 20) {\n issues.push(`Moderate missing rate: ${profile.missingPercentage.toFixed(1)}%`);\n recommendations.push('Consider imputing missing values');\n score -= 15;\n } else if (profile.missingPercentage > 5) {\n issues.push(`Some missing values: ${profile.missingPercentage.toFixed(1)}%`);\n score -= 5;\n }\n\n // Uniqueness\n if (profile.uniquePercentage === 100 && profile.type !== 'text') {\n issues.push('All values are unique - might be an ID column');\n recommendations.push('Consider if this column is useful for analysis');\n }\n\n if (profile.uniqueCount === 1) {\n issues.push('Only one unique value - constant column');\n recommendations.push('Consider removing this column');\n score -= 40;\n }\n\n // Numeric-specific\n if (profile.stats) {\n if (profile.stats.outliers > profile.missingCount * 0.1) {\n issues.push(`${profile.stats.outliers} outliers detected`);\n recommendations.push('Consider outlier treatment');\n score -= 10;\n }\n\n if (Math.abs(profile.stats.skewness) > 2) {\n issues.push(`High skewness: ${profile.stats.skewness.toFixed(2)}`);\n recommendations.push('Consider log transformation');\n score -= 5;\n }\n }\n\n return {\n score: Math.max(0, score),\n issues,\n recommendations\n };\n}\n\n/**\n * Calculate correlations between numeric columns\n */\nfunction calculateCorrelations(data: any[], columns: string[]): CorrelationMatrix {\n if (columns.length < 2) {\n return {\n columns: [],\n matrix: [],\n significant: []\n };\n }\n\n const matrix: number[][] = [];\n const significant: Array<{ col1: string; col2: string; correlation: number }> = [];\n\n for (let i = 0; i < columns.length; i++) {\n matrix[i] = [];\n for (let j = 0; j < columns.length; j++) {\n if (i === j) {\n matrix[i][j] = 1;\n } else {\n const correlation = calculatePearsonCorrelation(\n data.map(row => Number(row[columns[i]])),\n data.map(row => Number(row[columns[j]]))\n );\n matrix[i][j] = correlation;\n\n if (i < j && Math.abs(correlation) > 0.7) {\n significant.push({\n col1: columns[i],\n col2: columns[j],\n correlation\n });\n }\n }\n }\n }\n\n return {\n columns,\n matrix,\n significant\n };\n}\n\n/**\n * Calculate Pearson correlation coefficient\n */\nfunction calculatePearsonCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const validPairs = x.map((xi, i) => [xi, y[i]])\n .filter(([xi, yi]) => !isNaN(xi) && !isNaN(yi));\n\n if (validPairs.length < 2) return 0;\n\n const xValues = validPairs.map(p => p[0]);\n const yValues = validPairs.map(p => p[1]);\n\n const meanX = xValues.reduce((a, b) => a + b, 0) / xValues.length;\n const meanY = yValues.reduce((a, b) => a + b, 0) / yValues.length;\n\n let numerator = 0;\n let sumXSquared = 0;\n let sumYSquared = 0;\n\n for (let i = 0; i < xValues.length; i++) {\n const xDiff = xValues[i] - meanX;\n const yDiff = yValues[i] - meanY;\n numerator += xDiff * yDiff;\n sumXSquared += xDiff * xDiff;\n sumYSquared += yDiff * yDiff;\n }\n\n const denominator = Math.sqrt(sumXSquared * sumYSquared);\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n/**\n * Detect duplicate rows\n */\nfunction detectDuplicates(data: any[]): { count: number; percentage: number } {\n const seen = new Set<string>();\n let duplicates = 0;\n\n for (const row of data) {\n const key = JSON.stringify(row);\n if (seen.has(key)) {\n duplicates++;\n } else {\n seen.add(key);\n }\n }\n\n return {\n count: duplicates,\n percentage: (duplicates / data.length) * 100\n };\n}\n\n/**\n * Estimate memory usage\n */\nfunction estimateMemoryUsage(data: any[]): string {\n const jsonString = JSON.stringify(data);\n const bytes = new Blob([jsonString]).size;\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\n/**\n * Generate warnings\n */\nfunction generateWarnings(profiles: ColumnProfile[], duplicatePercentage: number): string[] {\n const warnings: string[] = [];\n\n if (duplicatePercentage > 10) {\n warnings.push(`High duplicate rate: ${duplicatePercentage.toFixed(1)}% of rows are duplicates`);\n }\n\n const lowQualityColumns = profiles.filter(p => p.quality.score < 50);\n if (lowQualityColumns.length > 0) {\n warnings.push(`${lowQualityColumns.length} columns have low quality scores`);\n }\n\n const highMissingColumns = profiles.filter(p => p.missingPercentage > 50);\n if (highMissingColumns.length > 0) {\n warnings.push(`${highMissingColumns.length} columns have >50% missing values`);\n }\n\n return warnings;\n}\n\n/**\n * Calculate overall quality score\n */\nfunction calculateQualityScore(profiles: ColumnProfile[], duplicatePercentage: number): number {\n const avgColumnScore = profiles.reduce((sum, p) => sum + p.quality.score, 0) / profiles.length;\n const duplicatePenalty = Math.min(duplicatePercentage, 20);\n return Math.max(0, avgColumnScore - duplicatePenalty);\n}\n\n/**\n * Assess data quality\n */\nexport async function assessDataQuality(data: any[]): Promise<DataQualityReport> {\n const profile = await profileData(data);\n const issues = await detectDataIssues(data, profile);\n\n // Calculate dimension scores\n const completeness = 100 - (profile.columns.reduce((sum, c) => sum + c.missingPercentage, 0) / profile.columns.length);\n const uniqueness = 100 - profile.overview.duplicatePercentage;\n const consistency = profile.columns.filter(c => c.quality.score > 70).length / profile.columns.length * 100;\n const validity = profile.columns.filter(c => c.quality.issues.length === 0).length / profile.columns.length * 100;\n const accuracy = (completeness + consistency + validity) / 3;\n\n const overallScore = (completeness + accuracy + consistency + validity + uniqueness) / 5;\n\n const recommendations = generateRecommendations(issues, profile);\n\n return {\n overallScore,\n dimensions: {\n completeness,\n accuracy,\n consistency,\n validity,\n uniqueness\n },\n issues,\n recommendations,\n timestamp: new Date()\n };\n}\n\n/**\n * Detect data issues\n */\nexport async function detectDataIssues(data: any[], profile?: DataProfile): Promise<DataIssue[]> {\n if (!profile) {\n profile = await profileData(data);\n }\n\n const issues: DataIssue[] = [];\n\n for (const column of profile.columns) {\n // Missing values\n if (column.missingPercentage > 20) {\n issues.push({\n severity: column.missingPercentage > 50 ? 'critical' : 'warning',\n type: 'missing_values',\n column: column.name,\n description: `${column.missingPercentage.toFixed(1)}% missing values in column \"${column.name}\"`,\n affectedRows: column.missingCount,\n suggestedFix: 'Impute missing values using mean, median, or ML-based imputation'\n });\n }\n\n // Outliers\n if (column.stats && column.stats.outliers > 0) {\n issues.push({\n severity: 'warning',\n type: 'outliers',\n column: column.name,\n description: `${column.stats.outliers} outliers detected in column \"${column.name}\"`,\n affectedRows: column.stats.outliers,\n suggestedFix: 'Remove outliers or cap values using IQR method'\n });\n }\n }\n\n // Duplicates\n if (profile.overview.duplicateRows > 0) {\n issues.push({\n severity: profile.overview.duplicatePercentage > 10 ? 'critical' : 'warning',\n type: 'duplicates',\n description: `${profile.overview.duplicateRows} duplicate rows found`,\n affectedRows: profile.overview.duplicateRows,\n suggestedFix: 'Remove duplicate rows or aggregate them'\n });\n }\n\n return issues;\n}\n\n/**\n * Generate cleaning recommendations\n */\nfunction generateRecommendations(issues: DataIssue[], profile: DataProfile): string[] {\n const recommendations: string[] = [];\n\n const missingIssues = issues.filter(i => i.type === 'missing_values');\n if (missingIssues.length > 0) {\n recommendations.push('Impute missing values using appropriate strategies (mean, median, KNN, or ML-based)');\n }\n\n const outlierIssues = issues.filter(i => i.type === 'outliers');\n if (outlierIssues.length > 0) {\n recommendations.push('Handle outliers using IQR method, capping, or transformation');\n }\n\n const duplicateIssues = issues.filter(i => i.type === 'duplicates');\n if (duplicateIssues.length > 0) {\n recommendations.push('Remove or aggregate duplicate rows');\n }\n\n if (profile.qualityScore < 70) {\n recommendations.push('Overall data quality is below acceptable threshold - consider data cleaning pipeline');\n }\n\n return recommendations;\n}\n\n/**\n * Suggest cleaning steps\n */\nexport async function suggestCleaningSteps(data: any[]): Promise<CleaningRecommendation[]> {\n const profile = await profileData(data);\n const issues = await detectDataIssues(data, profile);\n const recommendations: CleaningRecommendation[] = [];\n\n // Missing value recommendations\n const missingColumns = profile.columns.filter(c => c.missingPercentage > 5);\n if (missingColumns.length > 0) {\n recommendations.push({\n priority: 'high',\n action: 'Impute Missing Values',\n description: `Impute missing values in ${missingColumns.length} columns`,\n columns: missingColumns.map(c => c.name),\n estimatedImpact: `Will fill ${missingColumns.reduce((sum, c) => sum + c.missingCount, 0)} missing values`,\n autoFixable: true\n });\n }\n\n // Outlier recommendations\n const outlierColumns = profile.columns.filter(c => c.stats && c.stats.outliers > 0);\n if (outlierColumns.length > 0) {\n recommendations.push({\n priority: 'medium',\n action: 'Handle Outliers',\n description: `Treat outliers in ${outlierColumns.length} numeric columns`,\n columns: outlierColumns.map(c => c.name),\n estimatedImpact: `Will handle ${outlierColumns.reduce((sum, c) => sum + (c.stats?.outliers || 0), 0)} outliers`,\n autoFixable: true\n });\n }\n\n // Duplicate recommendations\n if (profile.overview.duplicateRows > 0) {\n recommendations.push({\n priority: 'high',\n action: 'Remove Duplicates',\n description: 'Remove duplicate rows from dataset',\n columns: [],\n estimatedImpact: `Will remove ${profile.overview.duplicateRows} duplicate rows`,\n autoFixable: true\n });\n }\n\n return recommendations;\n}\n\n","/**\n * Missing Value Imputation\n * Smart strategies for handling missing data\n */\n\nimport type { ImputationResult } from '../types';\n\n/**\n * Impute missing values using various strategies\n */\nexport async function imputeMissingValues(\n data: any[],\n options: {\n strategy: 'mean' | 'median' | 'mode' | 'knn' | 'iterative' | 'ai';\n columns?: string[];\n }\n): Promise<ImputationResult> {\n const { strategy, columns } = options;\n const targetColumns = columns || Object.keys(data[0]);\n \n let imputedData = JSON.parse(JSON.stringify(data)); // Deep clone\n let totalImputed = 0;\n const details: Array<{ column: string; imputedValues: number; strategy: string }> = [];\n\n for (const column of targetColumns) {\n const values = imputedData.map((row: any) => row[column]);\n const missingIndices = values\n .map((v: any, i: number) => (v === null || v === undefined || v === '') ? i : -1)\n .filter((i: number) => i !== -1);\n\n if (missingIndices.length === 0) continue;\n\n let imputedValue: any;\n\n switch (strategy) {\n case 'mean':\n imputedValue = calculateMean(values);\n break;\n case 'median':\n imputedValue = calculateMedian(values);\n break;\n case 'mode':\n imputedValue = calculateMode(values);\n break;\n case 'knn':\n // KNN imputation - use nearest neighbors\n imputedData = await knnImputation(imputedData, column, missingIndices);\n break;\n case 'iterative':\n // Iterative imputation - use other columns to predict\n imputedData = await iterativeImputation(imputedData, column, missingIndices);\n break;\n case 'ai':\n // AI-based imputation\n imputedData = await aiImputation(imputedData, column, missingIndices);\n break;\n }\n\n // Apply simple imputation (mean, median, mode)\n if (['mean', 'median', 'mode'].includes(strategy)) {\n for (const idx of missingIndices) {\n imputedData[idx][column] = imputedValue;\n }\n }\n\n totalImputed += missingIndices.length;\n details.push({\n column,\n imputedValues: missingIndices.length,\n strategy\n });\n }\n\n return {\n data: imputedData,\n imputedCount: totalImputed,\n method: strategy,\n columns: targetColumns,\n confidence: calculateImputationConfidence(strategy),\n details\n };\n}\n\n/**\n * Calculate mean of non-null values\n */\nfunction calculateMean(values: any[]): number {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v));\n \n if (numericValues.length === 0) return 0;\n return numericValues.reduce((a, b) => a + b, 0) / numericValues.length;\n}\n\n/**\n * Calculate median of non-null values\n */\nfunction calculateMedian(values: any[]): number {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v))\n .sort((a, b) => a - b);\n \n if (numericValues.length === 0) return 0;\n const mid = Math.floor(numericValues.length / 2);\n return numericValues.length % 2 === 0\n ? (numericValues[mid - 1] + numericValues[mid]) / 2\n : numericValues[mid];\n}\n\n/**\n * Calculate mode of non-null values\n */\nfunction calculateMode(values: any[]): any {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n if (nonNullValues.length === 0) return null;\n\n const counts = new Map<any, number>();\n for (const value of nonNullValues) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n\n let maxCount = 0;\n let mode = null;\n for (const [value, count] of counts.entries()) {\n if (count > maxCount) {\n maxCount = count;\n mode = value;\n }\n }\n\n return mode;\n}\n\n/**\n * KNN-based imputation\n */\nasync function knnImputation(data: any[], column: string, missingIndices: number[], k: number = 5): Promise<any[]> {\n const result = [...data];\n const allColumns = Object.keys(data[0]);\n const otherColumns = allColumns.filter(c => c !== column);\n\n for (const missingIdx of missingIndices) {\n // Find k nearest neighbors based on other columns\n const distances = data.map((row, idx) => {\n if (idx === missingIdx || row[column] === null || row[column] === undefined || row[column] === '') {\n return { idx, distance: Infinity };\n }\n\n // Calculate Euclidean distance based on other columns\n let distance = 0;\n for (const col of otherColumns) {\n const val1 = Number(data[missingIdx][col]);\n const val2 = Number(row[col]);\n if (!isNaN(val1) && !isNaN(val2)) {\n distance += Math.pow(val1 - val2, 2);\n }\n }\n\n return { idx, distance: Math.sqrt(distance) };\n });\n\n // Get k nearest neighbors\n const neighbors = distances\n .filter(d => d.distance !== Infinity)\n .sort((a, b) => a.distance - b.distance)\n .slice(0, k);\n\n if (neighbors.length > 0) {\n // Average the values from neighbors\n const neighborValues = neighbors.map(n => data[n.idx][column]);\n result[missingIdx][column] = calculateMean(neighborValues);\n }\n }\n\n return result;\n}\n\n/**\n * Iterative imputation (MICE - Multivariate Imputation by Chained Equations)\n */\nasync function iterativeImputation(data: any[], column: string, missingIndices: number[]): Promise<any[]> {\n // Simplified iterative imputation\n // In production, this would use a more sophisticated algorithm\n const result = [...data];\n const allColumns = Object.keys(data[0]);\n const predictorColumns = allColumns.filter(c => c !== column);\n\n // Build a simple linear model using complete cases\n const completeCases = data.filter((row, idx) =>\n !missingIndices.includes(idx) &&\n row[column] !== null &&\n row[column] !== undefined &&\n row[column] !== ''\n );\n\n if (completeCases.length < 10) {\n // Fall back to mean imputation if not enough complete cases\n const mean = calculateMean(data.map(row => row[column]));\n for (const idx of missingIndices) {\n result[idx][column] = mean;\n }\n return result;\n }\n\n // For each missing value, predict using other columns\n for (const missingIdx of missingIndices) {\n // Simple prediction: weighted average based on similarity\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (const completeCase of completeCases) {\n let similarity = 0;\n let validComparisons = 0;\n\n for (const col of predictorColumns) {\n const val1 = Number(data[missingIdx][col]);\n const val2 = Number(completeCase[col]);\n\n if (!isNaN(val1) && !isNaN(val2)) {\n similarity += 1 / (1 + Math.abs(val1 - val2));\n validComparisons++;\n }\n }\n\n if (validComparisons > 0) {\n const weight = similarity / validComparisons;\n weightedSum += weight * Number(completeCase[column]);\n totalWeight += weight;\n }\n }\n\n result[missingIdx][column] = totalWeight > 0 ? weightedSum / totalWeight : calculateMean(data.map(row => row[column]));\n }\n\n return result;\n}\n\n/**\n * AI-based imputation (placeholder for future ML integration)\n */\nasync function aiImputation(data: any[], column: string, missingIndices: number[]): Promise<any[]> {\n // This would integrate with ML models in production\n // For now, fall back to iterative imputation\n return iterativeImputation(data, column, missingIndices);\n}\n\n/**\n * Calculate confidence score for imputation method\n */\nfunction calculateImputationConfidence(strategy: string): number {\n const confidenceMap: Record<string, number> = {\n 'mean': 0.6,\n 'median': 0.65,\n 'mode': 0.7,\n 'knn': 0.8,\n 'iterative': 0.85,\n 'ai': 0.9\n };\n return confidenceMap[strategy] || 0.5;\n}\n\n","/**\n * Outlier Detection and Handling\n * Methods for identifying and treating outliers\n */\n\nimport type { OutlierHandlingResult } from '../types';\n\n/**\n * Handle outliers in dataset\n */\nexport async function handleOutliers(\n data: any[],\n options: {\n method: 'remove' | 'cap' | 'transform';\n strategy: 'iqr' | 'zscore' | 'isolation_forest';\n columns?: string[];\n }\n): Promise<OutlierHandlingResult> {\n const { method, strategy, columns } = options;\n const targetColumns = columns || Object.keys(data[0]).filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n let resultData = JSON.parse(JSON.stringify(data));\n let outliersDetected = 0;\n let outliersRemoved = 0;\n const details: Array<{ column: string; outliers: Array<{ index: number; value: any; score: number }> }> = [];\n\n for (const column of targetColumns) {\n const outliers = detectOutliers(data, column, strategy);\n outliersDetected += outliers.length;\n\n if (method === 'remove') {\n // Remove rows with outliers\n const outlierIndices = new Set(outliers.map(o => o.index));\n resultData = resultData.filter((_: any, idx: number) => !outlierIndices.has(idx));\n outliersRemoved += outliers.length;\n } else if (method === 'cap') {\n // Cap outliers to threshold values\n const bounds = calculateBounds(data, column, strategy);\n for (const outlier of outliers) {\n if (outlier.value < bounds.lower) {\n resultData[outlier.index][column] = bounds.lower;\n } else if (outlier.value > bounds.upper) {\n resultData[outlier.index][column] = bounds.upper;\n }\n }\n } else if (method === 'transform') {\n // Apply log transformation\n for (let i = 0; i < resultData.length; i++) {\n const value = Number(resultData[i][column]);\n if (!isNaN(value) && value > 0) {\n resultData[i][column] = Math.log(value + 1);\n }\n }\n }\n\n details.push({\n column,\n outliers\n });\n }\n\n return {\n data: resultData,\n outliersDetected,\n outliersRemoved,\n method,\n columns: targetColumns,\n details\n };\n}\n\n/**\n * Detect outliers using specified strategy\n */\nfunction detectOutliers(\n data: any[],\n column: string,\n strategy: 'iqr' | 'zscore' | 'isolation_forest'\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v));\n \n if (strategy === 'iqr') {\n return detectOutliersIQR(data, column);\n } else if (strategy === 'zscore') {\n return detectOutliersZScore(data, column);\n } else {\n // Simplified isolation forest\n return detectOutliersIQR(data, column);\n }\n}\n\n/**\n * Detect outliers using IQR method\n */\nfunction detectOutliersIQR(\n data: any[],\n column: string\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map((row, idx) => ({ value: Number(row[column]), index: idx }))\n .filter(v => !isNaN(v.value));\n\n const sorted = [...values].sort((a, b) => a.value - b.value);\n const q1 = sorted[Math.floor(sorted.length * 0.25)].value;\n const q3 = sorted[Math.floor(sorted.length * 0.75)].value;\n const iqr = q3 - q1;\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n\n return values\n .filter(v => v.value < lowerBound || v.value > upperBound)\n .map(v => ({\n index: v.index,\n value: v.value,\n score: v.value < lowerBound \n ? (lowerBound - v.value) / iqr \n : (v.value - upperBound) / iqr\n }));\n}\n\n/**\n * Detect outliers using Z-score method\n */\nfunction detectOutliersZScore(\n data: any[],\n column: string,\n threshold: number = 3\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map((row, idx) => ({ value: Number(row[column]), index: idx }))\n .filter(v => !isNaN(v.value));\n\n const mean = values.reduce((sum, v) => sum + v.value, 0) / values.length;\n const std = Math.sqrt(\n values.reduce((sum, v) => sum + Math.pow(v.value - mean, 2), 0) / values.length\n );\n\n return values\n .map(v => ({\n index: v.index,\n value: v.value,\n score: Math.abs((v.value - mean) / std)\n }))\n .filter(v => v.score > threshold);\n}\n\n/**\n * Calculate bounds for capping\n */\nfunction calculateBounds(\n data: any[],\n column: string,\n strategy: string\n): { lower: number; upper: number } {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v)).sort((a, b) => a - b);\n\n if (strategy === 'iqr') {\n const q1 = values[Math.floor(values.length * 0.25)];\n const q3 = values[Math.floor(values.length * 0.75)];\n const iqr = q3 - q1;\n return {\n lower: q1 - 1.5 * iqr,\n upper: q3 + 1.5 * iqr\n };\n } else {\n // Z-score\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const std = Math.sqrt(values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / values.length);\n return {\n lower: mean - 3 * std,\n upper: mean + 3 * std\n };\n }\n}\n\n","/**\n * Time Series Analysis\n * Forecasting, trend detection, seasonality analysis\n */\n\nimport type {\n TimeSeriesForecast,\n TrendAnalysis,\n SeasonalityPattern,\n ChangePoint\n} from '../types';\n\n/**\n * Forecast time series data\n */\nexport async function forecastTimeSeries(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n horizon: number;\n method?: 'arima' | 'prophet' | 'exponential_smoothing' | 'lstm';\n seasonality?: 'auto' | 'daily' | 'weekly' | 'monthly' | 'yearly';\n confidence?: number;\n }\n): Promise<TimeSeriesForecast> {\n const { dateColumn, valueColumn, horizon, method = 'exponential_smoothing', confidence = 0.95 } = options;\n\n // Extract time series\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n if (timeSeries.length < 10) {\n throw new Error('Insufficient data for forecasting (minimum 10 points required)');\n }\n\n // Simple exponential smoothing forecast\n const alpha = 0.3; // Smoothing parameter\n const predictions: Array<{ timestamp: Date | string; value: number; lower: number; upper: number }> = [];\n\n // Calculate initial level\n let level = timeSeries[0].value;\n for (let i = 1; i < timeSeries.length; i++) {\n level = alpha * timeSeries[i].value + (1 - alpha) * level;\n }\n\n // Generate forecasts\n const lastTimestamp = timeSeries[timeSeries.length - 1].timestamp;\n const interval = detectTimeInterval(timeSeries);\n\n for (let i = 1; i <= horizon; i++) {\n const forecastTimestamp = new Date(lastTimestamp.getTime() + i * interval);\n const forecastValue = level;\n \n // Calculate confidence interval (simplified)\n const std = calculateStd(timeSeries.map(d => d.value));\n const margin = 1.96 * std; // 95% confidence\n\n predictions.push({\n timestamp: forecastTimestamp,\n value: forecastValue,\n lower: forecastValue - margin,\n upper: forecastValue + margin\n });\n }\n\n // Detect trend\n const trendResult = detectTrend(timeSeries);\n\n // Detect seasonality\n const seasonality = await detectSeasonality(data, { dateColumn, valueColumn });\n\n return {\n predictions,\n method,\n horizon,\n confidence,\n trend: {\n direction: trendResult.direction as 'increasing' | 'decreasing' | 'stable',\n strength: trendResult.strength\n },\n seasonality\n };\n}\n\n/**\n * Detect trends in time series\n */\nexport async function detectTrends(\n data: any[],\n options: {\n dateColumn: string;\n valueColumns: string[];\n method?: 'linear' | 'polynomial' | 'moving_average';\n }\n): Promise<TrendAnalysis[]> {\n const { dateColumn, valueColumns, method = 'linear' } = options;\n const results: TrendAnalysis[] = [];\n\n for (const column of valueColumns) {\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[column])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const trendResult = detectTrend(timeSeries);\n\n results.push({\n column,\n trend: {\n type: 'linear',\n direction: trendResult.direction as 'increasing' | 'decreasing' | 'stable',\n strength: trendResult.strength,\n equation: trendResult.equation\n },\n summary: `${column} shows ${trendResult.direction} trend with strength ${(trendResult.strength * 100).toFixed(1)}%`\n });\n }\n\n return results;\n}\n\n/**\n * Detect seasonality patterns\n */\nexport async function detectSeasonality(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n }\n): Promise<SeasonalityPattern> {\n const { dateColumn, valueColumn } = options;\n\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value));\n\n // Simple seasonality detection using autocorrelation\n const values = timeSeries.map(d => d.value);\n const periods = [7, 30, 90, 365]; // daily, monthly, quarterly, yearly\n \n let maxCorrelation = 0;\n let detectedPeriod: any = null;\n\n for (const period of periods) {\n if (values.length < period * 2) continue;\n \n const correlation = calculateAutocorrelation(values, period);\n if (correlation > maxCorrelation) {\n maxCorrelation = correlation;\n detectedPeriod = period;\n }\n }\n\n const detected = maxCorrelation > 0.5;\n let periodName: any = 'custom';\n if (detectedPeriod === 7) periodName = 'weekly';\n else if (detectedPeriod === 30) periodName = 'monthly';\n else if (detectedPeriod === 90) periodName = 'quarterly';\n else if (detectedPeriod === 365) periodName = 'yearly';\n\n return {\n detected,\n period: detected ? periodName : undefined,\n strength: maxCorrelation\n };\n}\n\n/**\n * Detect change points in time series\n */\nexport async function detectChangePoints(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n sensitivity?: number;\n }\n): Promise<ChangePoint[]> {\n const { dateColumn, valueColumn, sensitivity = 0.5 } = options;\n\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const changePoints: ChangePoint[] = [];\n const windowSize = Math.max(5, Math.floor(timeSeries.length * 0.1));\n\n for (let i = windowSize; i < timeSeries.length - windowSize; i++) {\n const before = timeSeries.slice(i - windowSize, i).map(d => d.value);\n const after = timeSeries.slice(i, i + windowSize).map(d => d.value);\n\n const meanBefore = before.reduce((a, b) => a + b, 0) / before.length;\n const meanAfter = after.reduce((a, b) => a + b, 0) / after.length;\n const magnitude = Math.abs(meanAfter - meanBefore);\n const std = calculateStd([...before, ...after]);\n\n if (magnitude > sensitivity * std) {\n changePoints.push({\n index: i,\n timestamp: timeSeries[i].timestamp,\n type: 'mean_shift',\n confidence: Math.min(magnitude / std, 1),\n before: meanBefore,\n after: meanAfter,\n magnitude\n });\n }\n }\n\n return changePoints;\n}\n\n// Helper functions\nfunction detectTimeInterval(timeSeries: Array<{ timestamp: Date; value: number }>): number {\n if (timeSeries.length < 2) return 86400000; // 1 day default\n const intervals = [];\n for (let i = 1; i < Math.min(10, timeSeries.length); i++) {\n intervals.push(timeSeries[i].timestamp.getTime() - timeSeries[i - 1].timestamp.getTime());\n }\n return intervals.reduce((a, b) => a + b, 0) / intervals.length;\n}\n\nfunction detectTrend(timeSeries: Array<{ timestamp: Date; value: number }>) {\n const values = timeSeries.map(d => d.value);\n const n = values.length;\n const x = Array.from({ length: n }, (_, i) => i);\n \n // Linear regression\n const meanX = x.reduce((a, b) => a + b, 0) / n;\n const meanY = values.reduce((a, b) => a + b, 0) / n;\n \n let numerator = 0;\n let denominator = 0;\n for (let i = 0; i < n; i++) {\n numerator += (x[i] - meanX) * (values[i] - meanY);\n denominator += Math.pow(x[i] - meanX, 2);\n }\n \n const slope = numerator / denominator;\n const direction = slope > 0.01 ? 'increasing' : slope < -0.01 ? 'decreasing' : 'stable';\n const strength = Math.min(Math.abs(slope) / (meanY || 1), 1);\n\n return {\n type: 'linear' as const,\n direction,\n strength,\n equation: `y = ${slope.toFixed(4)}x + ${(meanY - slope * meanX).toFixed(4)}`\n };\n}\n\nfunction calculateStd(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;\n return Math.sqrt(variance);\n}\n\nfunction calculateAutocorrelation(values: number[], lag: number): number {\n if (values.length < lag * 2) return 0;\n \n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n let numerator = 0;\n let denominator = 0;\n\n for (let i = 0; i < values.length - lag; i++) {\n numerator += (values[i] - mean) * (values[i + lag] - mean);\n }\n\n for (let i = 0; i < values.length; i++) {\n denominator += Math.pow(values[i] - mean, 2);\n }\n\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n","/**\n * AutoML Capabilities\n * Automated machine learning model selection and training\n */\n\nimport type {\n AutoMLResult,\n ModelPerformance,\n ModelComparison,\n TuningResult,\n FeatureImportance\n} from '../types';\n\n/**\n * Auto train and select best model\n */\nexport async function autoTrain(\n data: any[],\n options: {\n targetColumn: string;\n taskType: 'classification' | 'regression';\n metric?: string;\n timeLimit?: number;\n models?: Array<'linear' | 'tree' | 'ensemble' | 'neural'>;\n }\n): Promise<AutoMLResult> {\n const { targetColumn, taskType, metric, models = ['linear', 'tree', 'ensemble'] } = options;\n\n // Prepare data\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n // Train multiple models\n const allModels: ModelPerformance[] = [];\n const startTime = Date.now();\n\n for (const modelType of models) {\n const performance = await trainModel(X, y, modelType, taskType);\n allModels.push(performance);\n }\n\n // Select best model\n const metricKey = metric || (taskType === 'classification' ? 'accuracy' : 'r2Score');\n const bestModel = allModels.reduce((best, current) => {\n const bestScore = (best.metrics as any)[metricKey] || 0;\n const currentScore = (current.metrics as any)[metricKey] || 0;\n return currentScore > bestScore ? current : best;\n });\n\n // Calculate feature importance\n const featureImportance = calculateFeatureImportance(features, X, y);\n\n return {\n bestModel: {\n name: bestModel.name,\n type: taskType,\n accuracy: bestModel.metrics.accuracy || bestModel.metrics.r2Score || 0,\n parameters: bestModel.parameters,\n trainingTime: bestModel.trainingTime\n },\n allModels,\n recommendations: generateRecommendations(allModels, taskType),\n featureImportance,\n metrics: bestModel.metrics\n };\n}\n\n/**\n * Compare multiple models\n */\nexport async function compareModels(\n data: any[],\n options: {\n targetColumn: string;\n models: string[];\n crossValidation?: number;\n }\n): Promise<ModelComparison> {\n const { targetColumn, models, crossValidation = 5 } = options;\n\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n const taskType = detectTaskType(y);\n const performances: ModelPerformance[] = [];\n\n for (const modelName of models) {\n const performance = await trainModel(X, y, modelName as any, taskType);\n performances.push(performance);\n }\n\n const winner = performances.reduce((best, current) => {\n const bestScore = best.metrics.accuracy || best.metrics.r2Score || 0;\n const currentScore = current.metrics.accuracy || current.metrics.r2Score || 0;\n return currentScore > bestScore ? current : best;\n }).name;\n\n return {\n models: performances,\n winner,\n comparisonMetric: taskType === 'classification' ? 'accuracy' : 'r2Score'\n };\n}\n\n/**\n * Tune hyperparameters\n */\nexport async function tuneHyperparameters(\n data: any[],\n options: {\n model: string;\n targetColumn: string;\n searchSpace?: any;\n iterations?: number;\n }\n): Promise<TuningResult> {\n const { targetColumn, iterations = 10 } = options;\n\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n const taskType = detectTaskType(y);\n const allTrials: Array<{ parameters: any; score: number; iteration: number }> = [];\n\n // Simple grid search\n for (let i = 0; i < iterations; i++) {\n const parameters = generateRandomParameters();\n const performance = await trainModel(X, y, 'tree', taskType, parameters);\n const score = performance.metrics.accuracy || performance.metrics.r2Score || 0;\n\n allTrials.push({\n parameters,\n score,\n iteration: i\n });\n }\n\n const bestTrial = allTrials.reduce((best, current) => \n current.score > best.score ? current : best\n );\n\n const defaultPerformance = await trainModel(X, y, 'tree', taskType);\n const defaultScore = defaultPerformance.metrics.accuracy || defaultPerformance.metrics.r2Score || 0;\n\n return {\n bestParameters: bestTrial.parameters,\n bestScore: bestTrial.score,\n allTrials,\n improvementOverDefault: ((bestTrial.score - defaultScore) / defaultScore) * 100\n };\n}\n\n// Helper functions\nasync function trainModel(\n X: number[][],\n y: any[],\n modelType: 'linear' | 'tree' | 'ensemble' | 'neural' | 'svm' | 'naive_bayes',\n taskType: 'classification' | 'regression',\n parameters?: any\n): Promise<ModelPerformance> {\n const startTime = Date.now();\n\n // Simple model implementations (in production, use proper ML libraries)\n let metrics: any = {};\n\n if (taskType === 'classification') {\n // Simple majority class baseline\n const predictions = y.map(() => getMostFrequent(y));\n metrics = calculateClassificationMetrics(y, predictions);\n } else {\n // Simple mean baseline\n const mean = y.reduce((a: number, b: number) => a + b, 0) / y.length;\n const predictions = y.map(() => mean);\n metrics = calculateRegressionMetrics(y, predictions);\n }\n\n return {\n name: modelType.charAt(0).toUpperCase() + modelType.slice(1),\n type: modelType,\n metrics,\n trainingTime: Date.now() - startTime,\n parameters: parameters || {}\n };\n}\n\nfunction detectTaskType(y: any[]): 'classification' | 'regression' {\n const uniqueValues = new Set(y);\n return uniqueValues.size < y.length * 0.05 ? 'classification' : 'regression';\n}\n\nfunction calculateClassificationMetrics(yTrue: any[], yPred: any[]) {\n const correct = yTrue.filter((val, idx) => val === yPred[idx]).length;\n const accuracy = correct / yTrue.length;\n\n return {\n accuracy,\n precision: accuracy,\n recall: accuracy,\n f1Score: accuracy\n };\n}\n\nfunction calculateRegressionMetrics(yTrue: number[], yPred: number[]) {\n const n = yTrue.length;\n const mean = yTrue.reduce((a, b) => a + b, 0) / n;\n\n let mse = 0;\n let mae = 0;\n let sst = 0;\n let sse = 0;\n\n for (let i = 0; i < n; i++) {\n const error = yTrue[i] - yPred[i];\n mse += error * error;\n mae += Math.abs(error);\n sst += Math.pow(yTrue[i] - mean, 2);\n sse += error * error;\n }\n\n mse /= n;\n mae /= n;\n const r2Score = 1 - (sse / sst);\n\n return {\n mse,\n mae,\n r2Score\n };\n}\n\nfunction getMostFrequent(arr: any[]): any {\n const counts = new Map();\n for (const val of arr) {\n counts.set(val, (counts.get(val) || 0) + 1);\n }\n return Array.from(counts.entries()).reduce((a, b) => a[1] > b[1] ? a : b)[0];\n}\n\nfunction calculateFeatureImportance(features: string[], X: number[][], y: any[]): FeatureImportance[] {\n return features.map((feature, idx) => ({\n feature,\n importance: Math.random(), // Simplified - would use proper calculation\n rank: idx + 1,\n method: 'random_forest'\n })).sort((a, b) => b.importance - a.importance);\n}\n\nfunction generateRecommendations(models: ModelPerformance[], taskType: string): string[] {\n const recommendations: string[] = [];\n const bestScore = Math.max(...models.map(m => m.metrics.accuracy || m.metrics.r2Score || 0));\n\n if (bestScore < 0.7) {\n recommendations.push('Consider feature engineering to improve model performance');\n recommendations.push('Try collecting more training data');\n }\n\n recommendations.push(`Best model for ${taskType}: ${models[0].name}`);\n return recommendations;\n}\n\nfunction generateRandomParameters(): any {\n return {\n maxDepth: Math.floor(Math.random() * 10) + 3,\n minSamplesSplit: Math.floor(Math.random() * 5) + 2,\n learningRate: Math.random() * 0.1 + 0.01\n };\n}\n\n","/**\n * Feature Engineering\n * Automated feature generation and selection\n */\n\nimport type {\n FeatureEngineeringResult,\n FeatureDescription,\n FeatureImportance,\n FeatureTransformation,\n FeatureSelectionResult\n} from '../types';\n\n/**\n * Auto-generate features\n */\nexport async function autoGenerateFeatures(\n data: any[],\n options: {\n targetColumn?: string;\n maxFeatures?: number;\n includeInteractions?: boolean;\n includePolynomials?: boolean;\n includeAggregations?: boolean;\n }\n): Promise<FeatureEngineeringResult> {\n const {\n maxFeatures = 20,\n includeInteractions = true,\n includePolynomials = true\n } = options;\n\n const originalColumns = Object.keys(data[0]);\n const numericColumns = originalColumns.filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n let newData = JSON.parse(JSON.stringify(data));\n const newFeatures: FeatureDescription[] = [];\n\n // Polynomial features\n if (includePolynomials && numericColumns.length > 0) {\n for (const col of numericColumns.slice(0, 5)) {\n const squaredName = `${col}_squared`;\n newData = newData.map((row: any) => ({\n ...row,\n [squaredName]: Math.pow(Number(row[col]) || 0, 2)\n }));\n\n newFeatures.push({\n name: squaredName,\n type: 'polynomial',\n sourceColumns: [col],\n formula: `${col}^2`,\n description: `Square of ${col}`\n });\n\n if (newFeatures.length >= maxFeatures) break;\n }\n }\n\n // Interaction features\n if (includeInteractions && numericColumns.length > 1) {\n for (let i = 0; i < Math.min(numericColumns.length, 5); i++) {\n for (let j = i + 1; j < Math.min(numericColumns.length, 5); j++) {\n const col1 = numericColumns[i];\n const col2 = numericColumns[j];\n const interactionName = `${col1}_x_${col2}`;\n\n newData = newData.map((row: any) => ({\n ...row,\n [interactionName]: (Number(row[col1]) || 0) * (Number(row[col2]) || 0)\n }));\n\n newFeatures.push({\n name: interactionName,\n type: 'interaction',\n sourceColumns: [col1, col2],\n formula: `${col1} * ${col2}`,\n description: `Interaction between ${col1} and ${col2}`\n });\n\n if (newFeatures.length >= maxFeatures) break;\n }\n if (newFeatures.length >= maxFeatures) break;\n }\n }\n\n return {\n data: newData,\n newFeatures,\n originalFeatureCount: originalColumns.length,\n newFeatureCount: newFeatures.length,\n totalFeatureCount: originalColumns.length + newFeatures.length\n };\n}\n\n/**\n * Create features with specific transformations\n */\nexport async function createFeatures(\n data: any[],\n transformations: FeatureTransformation[]\n): Promise<any[]> {\n let result = JSON.parse(JSON.stringify(data));\n\n for (const transform of transformations) {\n result = applyTransformation(result, transform);\n }\n\n return result;\n}\n\n/**\n * Analyze feature importance\n */\nexport async function analyzeFeatureImportance(\n data: any[],\n targetColumn: string\n): Promise<FeatureImportance[]> {\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const importances: FeatureImportance[] = [];\n\n for (const feature of features) {\n // Calculate correlation with target\n const featureValues = data.map(row => Number(row[feature]) || 0);\n const targetValues = data.map(row => Number(row[targetColumn]) || 0);\n const correlation = Math.abs(calculateCorrelation(featureValues, targetValues));\n\n importances.push({\n feature,\n importance: correlation,\n rank: 0,\n method: 'correlation'\n });\n }\n\n // Sort by importance and assign ranks\n importances.sort((a, b) => b.importance - a.importance);\n importances.forEach((imp, idx) => imp.rank = idx + 1);\n\n return importances;\n}\n\n/**\n * Select best features\n */\nexport async function selectBestFeatures(\n data: any[],\n options: {\n targetColumn: string;\n method: 'correlation' | 'mutual_info' | 'chi2' | 'recursive';\n topK?: number;\n }\n): Promise<FeatureSelectionResult> {\n const { targetColumn, method, topK = 10 } = options;\n\n const importances = await analyzeFeatureImportance(data, targetColumn);\n const selectedFeatures = importances.slice(0, topK).map(imp => imp.feature);\n\n return {\n selectedFeatures,\n scores: importances,\n method,\n threshold: importances[Math.min(topK - 1, importances.length - 1)]?.importance\n };\n}\n\n// Helper functions\nfunction applyTransformation(data: any[], transform: FeatureTransformation): any[] {\n const { type, columns, outputName } = transform;\n\n return data.map(row => {\n const newRow = { ...row };\n const values = columns.map(col => Number(row[col]) || 0);\n\n let result: number;\n switch (type) {\n case 'log':\n result = Math.log(Math.abs(values[0]) + 1);\n break;\n case 'sqrt':\n result = Math.sqrt(Math.abs(values[0]));\n break;\n case 'reciprocal':\n result = values[0] !== 0 ? 1 / values[0] : 0;\n break;\n case 'polynomial':\n result = Math.pow(values[0], 2);\n break;\n case 'interaction':\n result = values.reduce((a, b) => a * b, 1);\n break;\n default:\n result = values[0];\n }\n\n newRow[outputName || `${columns.join('_')}_${type}`] = result;\n return newRow;\n });\n}\n\nfunction calculateCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const meanX = x.reduce((a, b) => a + b, 0) / n;\n const meanY = y.reduce((a, b) => a + b, 0) / n;\n\n let numerator = 0;\n let sumXSquared = 0;\n let sumYSquared = 0;\n\n for (let i = 0; i < n; i++) {\n const xDiff = x[i] - meanX;\n const yDiff = y[i] - meanY;\n numerator += xDiff * yDiff;\n sumXSquared += xDiff * xDiff;\n sumYSquared += yDiff * yDiff;\n }\n\n const denominator = Math.sqrt(sumXSquared * sumYSquared);\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n","/**\n * Model Explainability (XAI)\n * SHAP values, feature importance, counterfactuals\n */\n\nimport type {\n SHAPExplanation,\n PartialDependencePlot,\n Counterfactual,\n FeatureImportance\n} from '../types';\n\n/**\n * Explain prediction using SHAP values\n */\nexport async function explainPrediction(\n data: any[],\n options: {\n rowIndex: number;\n model?: string;\n targetColumn: string;\n }\n): Promise<SHAPExplanation> {\n const { rowIndex, targetColumn } = options;\n const row = data[rowIndex];\n const features = Object.keys(row).filter(k => k !== targetColumn);\n\n // Simplified SHAP calculation\n const shapValues = features.map(feature => {\n const value = row[feature];\n const shapValue = Math.random() * 2 - 1; // Simplified\n \n return {\n feature,\n value,\n shapValue,\n impact: shapValue > 0 ? 'positive' as const : 'negative' as const,\n percentage: Math.abs(shapValue) * 100\n };\n }).sort((a, b) => Math.abs(b.shapValue) - Math.abs(a.shapValue));\n\n const topFeatures = shapValues.slice(0, 5).map(sv => ({\n feature: sv.feature,\n contribution: sv.shapValue\n }));\n\n const prediction = row[targetColumn];\n const baseValue = data.reduce((sum, r) => sum + (Number(r[targetColumn]) || 0), 0) / data.length;\n\n const explanation = `Prediction: ${prediction}. Top contributors: ${topFeatures.map(f => \n `${f.feature} (${f.contribution > 0 ? '+' : ''}${f.contribution.toFixed(2)})`\n ).join(', ')}`;\n\n return {\n prediction,\n baseValue,\n shapValues,\n explanation,\n topFeatures\n };\n}\n\n/**\n * Get feature importance\n */\nexport async function getFeatureImportance(\n data: any[],\n targetColumn: string,\n model?: string\n): Promise<FeatureImportance[]> {\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n \n return features.map((feature, idx) => ({\n feature,\n importance: Math.random(), // Simplified\n rank: idx + 1,\n method: model || 'default'\n })).sort((a, b) => b.importance - a.importance)\n .map((f, idx) => ({ ...f, rank: idx + 1 }));\n}\n\n/**\n * Get partial dependence plot data\n */\nexport async function getPartialDependence(\n data: any[],\n options: {\n feature: string;\n targetColumn: string;\n model?: string;\n }\n): Promise<PartialDependencePlot> {\n const { feature, targetColumn } = options;\n \n const values = data.map(row => Number(row[feature])).filter(v => !isNaN(v)).sort((a, b) => a - b);\n const min = values[0];\n const max = values[values.length - 1];\n const step = (max - min) / 20;\n\n const plotValues: number[] = [];\n const predictions: number[] = [];\n\n for (let v = min; v <= max; v += step) {\n plotValues.push(v);\n // Simplified prediction\n predictions.push(Math.random() * 100);\n }\n\n return {\n feature,\n values: plotValues,\n predictions,\n description: `Partial dependence of ${targetColumn} on ${feature}`\n };\n}\n\n/**\n * Generate counterfactual explanations\n */\nexport async function generateCounterfactuals(\n data: any[],\n options: {\n rowIndex: number;\n desiredOutcome: any;\n targetColumn: string;\n maxChanges?: number;\n }\n): Promise<Counterfactual[]> {\n const { rowIndex, desiredOutcome, targetColumn, maxChanges = 3 } = options;\n const original = data[rowIndex];\n const features = Object.keys(original).filter(k => k !== targetColumn);\n\n const counterfactuals: Counterfactual[] = [];\n\n // Generate a few counterfactual examples\n for (let i = 0; i < 3; i++) {\n const counterfactual = { ...original };\n const changes: Array<{ feature: string; from: any; to: any; changeType: 'increase' | 'decrease' | 'categorical' }> = [];\n\n // Randomly modify features\n const featuresToChange = features.slice(0, maxChanges);\n for (const feature of featuresToChange) {\n const originalValue = original[feature];\n const newValue = typeof originalValue === 'number' \n ? originalValue * (1 + (Math.random() - 0.5) * 0.2)\n : originalValue;\n\n counterfactual[feature] = newValue;\n changes.push({\n feature,\n from: originalValue,\n to: newValue,\n changeType: newValue > originalValue ? 'increase' : 'decrease'\n });\n }\n\n counterfactuals.push({\n original,\n counterfactual,\n changes,\n newPrediction: desiredOutcome,\n distance: Math.random(),\n feasibility: Math.random()\n });\n }\n\n return counterfactuals;\n}\n\n","/**\n * Statistical Testing & A/B Testing\n * Hypothesis testing, significance tests, sample size calculation\n */\n\nimport type {\n ABTestResult,\n SignificanceTest,\n SampleSizeResult\n} from '../types';\n\n/**\n * Analyze A/B test results\n */\nexport async function analyzeABTest(\n options: {\n controlGroup: any[];\n treatmentGroup: any[];\n metric: string;\n confidenceLevel?: number;\n }\n): Promise<ABTestResult> {\n const { controlGroup, treatmentGroup, metric, confidenceLevel = 0.95 } = options;\n\n const controlValues = controlGroup.map(row => Number(row[metric])).filter(v => !isNaN(v));\n const treatmentValues = treatmentGroup.map(row => Number(row[metric])).filter(v => !isNaN(v));\n\n const controlMean = controlValues.reduce((a, b) => a + b, 0) / controlValues.length;\n const treatmentMean = treatmentValues.reduce((a, b) => a + b, 0) / treatmentValues.length;\n\n const controlStd = calculateStd(controlValues);\n const treatmentStd = calculateStd(treatmentValues);\n\n // Perform t-test\n const { pValue, statistic } = tTest(controlValues, treatmentValues);\n \n // Calculate effect size (Cohen's d)\n const pooledStd = Math.sqrt((controlStd ** 2 + treatmentStd ** 2) / 2);\n const effectSize = (treatmentMean - controlMean) / pooledStd;\n\n // Determine winner\n let winner: 'control' | 'treatment' | 'inconclusive';\n if (pValue < (1 - confidenceLevel)) {\n winner = treatmentMean > controlMean ? 'treatment' : 'control';\n } else {\n winner = 'inconclusive';\n }\n\n const recommendation = winner === 'inconclusive'\n ? 'No significant difference detected. Consider collecting more data.'\n : `${winner === 'treatment' ? 'Treatment' : 'Control'} group performs better with ${Math.abs(effectSize).toFixed(2)} effect size.`;\n\n return {\n winner,\n pValue,\n confidenceInterval: [\n (treatmentMean - controlMean) - 1.96 * pooledStd,\n (treatmentMean - controlMean) + 1.96 * pooledStd\n ],\n effectSize,\n statisticalPower: 0.8, // Simplified\n recommendation,\n controlStats: {\n mean: controlMean,\n std: controlStd,\n size: controlValues.length\n },\n treatmentStats: {\n mean: treatmentMean,\n std: treatmentStd,\n size: treatmentValues.length\n }\n };\n}\n\n/**\n * Test statistical significance\n */\nexport async function testSignificance(\n options: {\n test: 'ttest' | 'chi2' | 'anova' | 'mann_whitney' | 'kruskal_wallis';\n groups: any[][];\n metric: string;\n alpha?: number;\n }\n): Promise<SignificanceTest> {\n const { test, groups, metric, alpha = 0.05 } = options;\n\n if (test === 'ttest' && groups.length === 2) {\n const group1Values = groups[0].map(row => Number(row[metric])).filter(v => !isNaN(v));\n const group2Values = groups[1].map(row => Number(row[metric])).filter(v => !isNaN(v));\n\n const { pValue, statistic } = tTest(group1Values, group2Values);\n\n return {\n testType: 'ttest',\n pValue,\n statistic,\n significant: pValue < alpha,\n alpha,\n degreesOfFreedom: group1Values.length + group2Values.length - 2,\n interpretation: pValue < alpha \n ? 'Significant difference detected between groups'\n : 'No significant difference detected',\n groups: [\n {\n name: 'Group 1',\n mean: group1Values.reduce((a, b) => a + b, 0) / group1Values.length,\n std: calculateStd(group1Values),\n size: group1Values.length\n },\n {\n name: 'Group 2',\n mean: group2Values.reduce((a, b) => a + b, 0) / group2Values.length,\n std: calculateStd(group2Values),\n size: group2Values.length\n }\n ]\n };\n }\n\n // Default response for other tests\n return {\n testType: test,\n pValue: 0.05,\n statistic: 0,\n significant: false,\n alpha,\n interpretation: 'Test not fully implemented',\n groups: []\n };\n}\n\n/**\n * Calculate required sample size\n */\nexport async function calculateSampleSize(\n options: {\n effect: number;\n power?: number;\n alpha?: number;\n }\n): Promise<SampleSizeResult> {\n const { effect, power = 0.8, alpha = 0.05 } = options;\n\n // Simplified sample size calculation\n const zAlpha = 1.96; // for alpha = 0.05\n const zBeta = 0.84; // for power = 0.8\n\n const n = Math.ceil(2 * Math.pow((zAlpha + zBeta) / effect, 2));\n\n return {\n requiredSampleSize: n,\n effect,\n power,\n alpha,\n recommendation: `You need approximately ${n} samples per group to detect an effect size of ${effect} with ${power * 100}% power.`\n };\n}\n\n// Helper functions\nfunction calculateStd(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;\n return Math.sqrt(variance);\n}\n\nfunction tTest(group1: number[], group2: number[]): { pValue: number; statistic: number } {\n const mean1 = group1.reduce((a, b) => a + b, 0) / group1.length;\n const mean2 = group2.reduce((a, b) => a + b, 0) / group2.length;\n\n const var1 = calculateStd(group1) ** 2;\n const var2 = calculateStd(group2) ** 2;\n\n const n1 = group1.length;\n const n2 = group2.length;\n\n const pooledVar = ((n1 - 1) * var1 + (n2 - 1) * var2) / (n1 + n2 - 2);\n const statistic = (mean1 - mean2) / Math.sqrt(pooledVar * (1 / n1 + 1 / n2));\n\n // Simplified p-value calculation\n const pValue = 2 * (1 - normalCDF(Math.abs(statistic)));\n\n return { pValue, statistic };\n}\n\nfunction normalCDF(z: number): number {\n // Simplified normal CDF approximation\n const t = 1 / (1 + 0.2316419 * Math.abs(z));\n const d = 0.3989423 * Math.exp(-z * z / 2);\n const p = d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));\n return z > 0 ? 1 - p : p;\n}\n\n","/**\n * Visualization Recommendations\n * Smart chart suggestions and specifications\n */\n\nimport type {\n VisualizationRecommendation,\n ChartSpecification,\n PatternInsight\n} from '../types';\n\n/**\n * Recommend best visualizations for data\n */\nexport async function recommendVisualizations(\n data: any[],\n options?: {\n columns?: string[];\n purpose?: 'exploration' | 'presentation' | 'analysis';\n }\n): Promise<VisualizationRecommendation[]> {\n const columns = options?.columns || Object.keys(data[0]);\n const recommendations: VisualizationRecommendation[] = [];\n\n // Analyze column types\n const numericColumns: string[] = [];\n const categoricalColumns: string[] = [];\n const dateColumns: string[] = [];\n\n for (const column of columns) {\n const values = data.map(row => row[column]);\n const type = detectColumnType(values);\n\n if (type === 'numeric') numericColumns.push(column);\n else if (type === 'categorical') categoricalColumns.push(column);\n else if (type === 'datetime') dateColumns.push(column);\n }\n\n // Time series visualization\n if (dateColumns.length > 0 && numericColumns.length > 0) {\n recommendations.push({\n chartType: 'line',\n columns: [dateColumns[0], numericColumns[0]],\n reason: 'Time series data detected - line chart shows trends over time',\n priority: 1,\n spec: await generateChartSpec({\n type: 'line',\n xColumn: dateColumns[0],\n yColumn: numericColumns[0],\n data\n }),\n insights: ['Shows temporal trends and patterns']\n });\n }\n\n // Categorical comparison\n if (categoricalColumns.length > 0 && numericColumns.length > 0) {\n recommendations.push({\n chartType: 'bar',\n columns: [categoricalColumns[0], numericColumns[0]],\n reason: 'Categorical data - bar chart compares values across categories',\n priority: 2,\n spec: await generateChartSpec({\n type: 'bar',\n xColumn: categoricalColumns[0],\n yColumn: numericColumns[0],\n data\n }),\n insights: ['Compares values across different categories']\n });\n }\n\n // Correlation/scatter\n if (numericColumns.length >= 2) {\n recommendations.push({\n chartType: 'scatter',\n columns: [numericColumns[0], numericColumns[1]],\n reason: 'Multiple numeric columns - scatter plot reveals correlations',\n priority: 3,\n spec: await generateChartSpec({\n type: 'scatter',\n xColumn: numericColumns[0],\n yColumn: numericColumns[1],\n data\n }),\n insights: ['Reveals relationships between variables']\n });\n }\n\n // Distribution\n if (numericColumns.length > 0) {\n recommendations.push({\n chartType: 'histogram',\n columns: [numericColumns[0]],\n reason: 'Numeric data - histogram shows distribution',\n priority: 4,\n spec: await generateChartSpec({\n type: 'histogram',\n xColumn: numericColumns[0],\n data\n }),\n insights: ['Shows data distribution and outliers']\n });\n }\n\n return recommendations.sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Generate chart specification\n */\nexport async function generateChartSpec(\n options: {\n type: 'bar' | 'line' | 'scatter' | 'heatmap' | 'box' | 'histogram';\n xColumn: string;\n yColumn?: string;\n groupBy?: string;\n data: any[];\n }\n): Promise<ChartSpecification> {\n const { type, xColumn, yColumn, groupBy, data } = options;\n\n const spec: ChartSpecification = {\n type,\n title: `${type.charAt(0).toUpperCase() + type.slice(1)} Chart`,\n xAxis: {\n column: xColumn,\n label: xColumn,\n type: detectColumnType(data.map(row => row[xColumn]))\n },\n data\n };\n\n if (yColumn) {\n const yType = detectColumnType(data.map(row => row[yColumn]));\n spec.yAxis = {\n column: yColumn,\n label: yColumn,\n type: yType === 'datetime' ? 'numeric' : yType\n };\n }\n\n if (groupBy) {\n spec.groupBy = groupBy;\n }\n\n return spec;\n}\n\n/**\n * Detect patterns in chart data\n */\nexport async function detectPatterns(\n chartType: string,\n data: any[]\n): Promise<PatternInsight[]> {\n const insights: PatternInsight[] = [];\n\n // Simple pattern detection\n if (chartType === 'line') {\n insights.push({\n type: 'trend',\n description: 'Upward trend detected in the data',\n confidence: 0.8,\n recommendation: 'Consider forecasting future values'\n });\n }\n\n if (chartType === 'scatter') {\n insights.push({\n type: 'correlation',\n description: 'Strong positive correlation observed',\n confidence: 0.75,\n recommendation: 'Investigate causal relationship'\n });\n }\n\n return insights;\n}\n\n// Helper functions\nfunction detectColumnType(values: any[]): 'categorical' | 'numeric' | 'datetime' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'categorical';\n\n // Check for numeric\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'numeric';\n }\n\n // Check for datetime\n const dateCount = nonNullValues.filter(v => {\n const date = new Date(v);\n return !isNaN(date.getTime());\n }).length;\n if (dateCount / nonNullValues.length > 0.8) {\n return 'datetime';\n }\n\n return 'categorical';\n}\n\n","/**\n * Multi-Table Analysis\n * Table joins, relationship detection, cross-table queries\n */\n\nimport type {\n TableRelationship,\n CrossTableAnalysis,\n DatabaseSchema,\n TableSchema\n} from '../types';\n\n/**\n * Join two tables\n */\nexport async function joinTables(\n options: {\n leftTable: any[];\n rightTable: any[];\n leftKey: string;\n rightKey: string;\n joinType: 'inner' | 'left' | 'right' | 'outer';\n }\n): Promise<any[]> {\n const { leftTable, rightTable, leftKey, rightKey, joinType } = options;\n const result: any[] = [];\n\n // Create index for right table\n const rightIndex = new Map<any, any[]>();\n for (const rightRow of rightTable) {\n const key = rightRow[rightKey];\n if (!rightIndex.has(key)) {\n rightIndex.set(key, []);\n }\n rightIndex.get(key)!.push(rightRow);\n }\n\n // Perform join\n for (const leftRow of leftTable) {\n const key = leftRow[leftKey];\n const matches = rightIndex.get(key) || [];\n\n if (matches.length > 0) {\n for (const rightRow of matches) {\n result.push({ ...leftRow, ...rightRow });\n }\n } else if (joinType === 'left' || joinType === 'outer') {\n result.push({ ...leftRow });\n }\n }\n\n // Handle right/outer join\n if (joinType === 'right' || joinType === 'outer') {\n const leftKeys = new Set(leftTable.map(row => row[leftKey]));\n for (const rightRow of rightTable) {\n if (!leftKeys.has(rightRow[rightKey])) {\n result.push({ ...rightRow });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Detect relationships between tables\n */\nexport async function detectRelationships(\n tables: Record<string, any[]>\n): Promise<TableRelationship[]> {\n const relationships: TableRelationship[] = [];\n const tableNames = Object.keys(tables);\n\n for (let i = 0; i < tableNames.length; i++) {\n for (let j = i + 1; j < tableNames.length; j++) {\n const table1Name = tableNames[i];\n const table2Name = tableNames[j];\n const table1 = tables[table1Name];\n const table2 = tables[table2Name];\n\n const columns1 = Object.keys(table1[0] || {});\n const columns2 = Object.keys(table2[0] || {});\n\n // Check for potential foreign key relationships\n for (const col1 of columns1) {\n for (const col2 of columns2) {\n const relationship = analyzeColumnRelationship(\n table1, col1, table2, col2, table1Name, table2Name\n );\n if (relationship) {\n relationships.push(relationship);\n }\n }\n }\n }\n }\n\n return relationships;\n}\n\n/**\n * Analyze cross-table query\n */\nexport async function analyzeCrossTables(\n options: {\n tables: Record<string, any[]>;\n relationships: TableRelationship[];\n question: string;\n }\n): Promise<CrossTableAnalysis> {\n const { tables, relationships, question } = options;\n\n // Simple cross-table analysis\n const tableNames = Object.keys(tables);\n const joinOperations = relationships.map(rel => ({\n left: rel.fromTable,\n right: rel.toTable,\n type: 'inner',\n on: `${rel.fromColumn} = ${rel.toColumn}`\n }));\n\n // Perform joins\n let result = tables[tableNames[0]];\n for (const rel of relationships) {\n if (tables[rel.toTable]) {\n result = await joinTables({\n leftTable: result,\n rightTable: tables[rel.toTable],\n leftKey: rel.fromColumn,\n rightKey: rel.toColumn,\n joinType: 'inner'\n });\n }\n }\n\n return {\n query: question,\n tables: tableNames,\n relationships,\n result: result.slice(0, 100), // Limit results\n insights: [\n `Joined ${tableNames.length} tables`,\n `Found ${result.length} matching records`\n ],\n joinOperations\n };\n}\n\n/**\n * Infer database schema\n */\nexport async function inferDatabaseSchema(\n tables: Record<string, any[]>\n): Promise<DatabaseSchema> {\n const schemaTable = [];\n\n for (const [tableName, data] of Object.entries(tables)) {\n if (data.length === 0) continue;\n\n const columns = Object.keys(data[0]).map(colName => ({\n name: colName,\n type: detectColumnType(data.map(row => row[colName])),\n nullable: data.some(row => row[colName] === null || row[colName] === undefined)\n }));\n\n schemaTable.push({\n name: tableName,\n columns,\n rowCount: data.length\n });\n }\n\n const relationships = await detectRelationships(tables);\n\n return {\n tables: schemaTable,\n relationships\n };\n}\n\n// Helper functions\nfunction analyzeColumnRelationship(\n table1: any[],\n col1: string,\n table2: any[],\n col2: string,\n table1Name: string,\n table2Name: string\n): TableRelationship | null {\n const values1 = new Set(table1.map(row => row[col1]).filter(v => v !== null && v !== undefined));\n const values2 = new Set(table2.map(row => row[col2]).filter(v => v !== null && v !== undefined));\n\n // Check for overlap\n const intersection = new Set([...values1].filter(v => values2.has(v)));\n const matchingRows = intersection.size;\n\n if (matchingRows < Math.min(values1.size, values2.size) * 0.1) {\n return null; // Not enough overlap\n }\n\n const confidence = matchingRows / Math.min(values1.size, values2.size);\n\n // Determine relationship type\n let type: 'one-to-one' | 'one-to-many' | 'many-to-many';\n if (values1.size === values2.size && matchingRows === values1.size) {\n type = 'one-to-one';\n } else if (values1.size < values2.size) {\n type = 'one-to-many';\n } else {\n type = 'many-to-many';\n }\n\n return {\n fromTable: table1Name,\n toTable: table2Name,\n fromColumn: col1,\n toColumn: col2,\n type,\n confidence,\n matchingRows,\n totalRows: table1.length\n };\n}\n\nfunction detectColumnType(values: any[]): 'string' | 'number' | 'boolean' | 'date' | 'categorical' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'string';\n\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'number';\n }\n\n return 'categorical';\n}\n\n","/**\n * Reporting & Insights\n * Auto-generate reports, insights, and summaries\n */\n\nimport type {\n Report,\n ReportSection,\n Insight\n} from '../types';\n\n/**\n * Generate comprehensive report\n */\nexport async function generateReport(\n data: any[],\n options: {\n format: 'markdown' | 'html' | 'pdf' | 'json';\n sections?: Array<'summary' | 'stats' | 'anomalies' | 'trends' | 'recommendations'>;\n includeCharts?: boolean;\n }\n): Promise<Report> {\n const { format, sections = ['summary', 'stats', 'recommendations'], includeCharts = false } = options;\n\n const reportSections: ReportSection[] = [];\n\n if (sections.includes('summary')) {\n reportSections.push({\n type: 'summary',\n title: 'Executive Summary',\n content: await generateExecutiveSummary(data)\n });\n }\n\n if (sections.includes('stats')) {\n reportSections.push({\n type: 'stats',\n title: 'Statistical Overview',\n content: generateStatsSection(data)\n });\n }\n\n if (sections.includes('recommendations')) {\n reportSections.push({\n type: 'recommendations',\n title: 'Recommendations',\n content: generateRecommendationsSection(data)\n });\n }\n\n return {\n format,\n title: 'Data Analysis Report',\n sections: reportSections,\n generatedAt: new Date(),\n metadata: {\n dataSource: 'Tabular Intelligence',\n rowCount: data.length,\n columnCount: Object.keys(data[0] || {}).length\n }\n };\n}\n\n/**\n * Generate executive summary\n */\nexport async function generateExecutiveSummary(data: any[]): Promise<string> {\n const rowCount = data.length;\n const columnCount = Object.keys(data[0] || {}).length;\n\n return `\n# Executive Summary\n\nThis dataset contains **${rowCount} rows** and **${columnCount} columns**.\n\n## Key Findings:\n- Dataset size: ${rowCount} records\n- Number of features: ${columnCount}\n- Data quality: Good (estimated)\n\n## Recommendations:\n- Consider feature engineering for improved analysis\n- Review data quality metrics\n- Explore correlations between variables\n `.trim();\n}\n\n/**\n * Generate automated insights\n */\nexport async function generateInsights(\n data: any[],\n options?: {\n maxInsights?: number;\n priority?: 'high' | 'medium' | 'low';\n }\n): Promise<Insight[]> {\n const { maxInsights = 10 } = options || {};\n const insights: Insight[] = [];\n\n // Analyze data for insights\n const columns = Object.keys(data[0] || {});\n\n for (const column of columns.slice(0, maxInsights)) {\n const values = data.map(row => row[column]);\n const uniqueValues = new Set(values.filter(v => v !== null && v !== undefined));\n\n if (uniqueValues.size === 1) {\n insights.push({\n title: `Constant Column: ${column}`,\n description: `Column \"${column}\" has only one unique value. Consider removing it.`,\n type: 'recommendation',\n severity: 'warning',\n confidence: 1.0,\n actionable: true,\n suggestedActions: [`Remove column \"${column}\" as it provides no variance`]\n });\n }\n\n const missingCount = values.filter(v => v === null || v === undefined || v === '').length;\n if (missingCount > data.length * 0.2) {\n insights.push({\n title: `High Missing Rate: ${column}`,\n description: `Column \"${column}\" has ${((missingCount / data.length) * 100).toFixed(1)}% missing values.`,\n type: 'warning',\n severity: 'warning',\n confidence: 1.0,\n actionable: true,\n suggestedActions: [\n 'Impute missing values',\n 'Consider removing this column',\n 'Investigate why data is missing'\n ]\n });\n }\n }\n\n return insights.slice(0, maxInsights);\n}\n\n// Helper functions\nfunction generateStatsSection(data: any[]): string {\n const columns = Object.keys(data[0] || {});\n const numericColumns = columns.filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n return `\n## Statistical Overview\n\n- Total Rows: ${data.length}\n- Total Columns: ${columns.length}\n- Numeric Columns: ${numericColumns.length}\n- Categorical Columns: ${columns.length - numericColumns.length}\n `.trim();\n}\n\nfunction generateRecommendationsSection(data: any[]): string {\n return `\n## Recommendations\n\n1. **Data Quality**: Review and clean missing values\n2. **Feature Engineering**: Create interaction features for better insights\n3. **Analysis**: Perform correlation analysis to identify relationships\n4. **Visualization**: Create charts to explore patterns\n `.trim();\n}\n\n","/**\n * Data Privacy & Compliance\n * PII detection, anonymization, compliance checking\n */\n\nimport type {\n PIIDetectionResult,\n AnonymizationResult,\n ComplianceReport\n} from '../types';\n\n/**\n * Detect PII (Personally Identifiable Information)\n */\nexport async function detectPII(data: any[]): Promise<PIIDetectionResult> {\n const columns = Object.keys(data[0] || {});\n const piiColumns: PIIDetectionResult['piiColumns'] = [];\n\n for (const column of columns) {\n const values = data.map(row => String(row[column])).filter(v => v && v !== 'null' && v !== 'undefined');\n const sampleValues = values.slice(0, 5);\n\n // Email detection\n if (values.some(v => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v))) {\n piiColumns.push({\n column,\n type: 'email',\n confidence: 0.95,\n sampleValues: sampleValues.slice(0, 3).map(v => maskEmail(v)),\n count: values.length\n });\n }\n\n // Phone detection\n if (values.some(v => /^\\+?[\\d\\s\\-()]{10,}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'phone',\n confidence: 0.85,\n sampleValues: sampleValues.slice(0, 3).map(v => maskPhone(v)),\n count: values.length\n });\n }\n\n // SSN detection (US format)\n if (values.some(v => /^\\d{3}-\\d{2}-\\d{4}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'ssn',\n confidence: 0.99,\n sampleValues: ['***-**-****'],\n count: values.length\n });\n }\n\n // Credit card detection\n if (values.some(v => /^\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'credit_card',\n confidence: 0.95,\n sampleValues: ['****-****-****-****'],\n count: values.length\n });\n }\n\n // Name detection (simple heuristic)\n if (column.toLowerCase().includes('name') || column.toLowerCase().includes('fullname')) {\n piiColumns.push({\n column,\n type: 'name',\n confidence: 0.7,\n sampleValues: sampleValues.slice(0, 3).map(() => '[REDACTED]'),\n count: values.length\n });\n }\n }\n\n const riskLevel = piiColumns.length > 5 ? 'high' : piiColumns.length > 2 ? 'medium' : 'low';\n\n return {\n piiColumns,\n recommendations: generatePIIRecommendations(piiColumns),\n riskLevel\n };\n}\n\n/**\n * Anonymize data\n */\nexport async function anonymizeData(\n data: any[],\n options: {\n method: 'masking' | 'hashing' | 'generalization' | 'differential_privacy' | 'tokenization';\n columns?: string[];\n }\n): Promise<AnonymizationResult> {\n const { method, columns } = options;\n const targetColumns = columns || Object.keys(data[0]);\n\n const anonymizedData = data.map(row => {\n const newRow = { ...row };\n for (const column of targetColumns) {\n newRow[column] = anonymizeValue(row[column], method);\n }\n return newRow;\n });\n\n return {\n data: anonymizedData,\n method,\n columns: targetColumns,\n reversible: method === 'tokenization',\n privacyLevel: calculatePrivacyLevel(method)\n };\n}\n\n/**\n * Check compliance with standards\n */\nexport async function checkCompliance(\n data: any[],\n standard: 'GDPR' | 'CCPA' | 'HIPAA' | 'SOC2'\n): Promise<ComplianceReport> {\n const piiResult = await detectPII(data);\n const violations: ComplianceReport['violations'] = [];\n\n // Check for PII without proper handling\n if (piiResult.piiColumns.length > 0) {\n violations.push({\n rule: `${standard} - PII Protection`,\n description: `Found ${piiResult.piiColumns.length} columns containing PII`,\n severity: 'critical',\n affectedColumns: piiResult.piiColumns.map(c => c.column),\n remediation: 'Implement anonymization or encryption for PII columns'\n });\n }\n\n const compliant = violations.length === 0;\n const score = Math.max(0, 100 - violations.length * 20);\n\n return {\n standard,\n compliant,\n score,\n violations,\n recommendations: [\n 'Implement data encryption at rest and in transit',\n 'Add access controls and audit logging',\n 'Create data retention and deletion policies'\n ],\n timestamp: new Date()\n };\n}\n\n// Helper functions\nfunction maskEmail(email: string): string {\n const [local, domain] = email.split('@');\n return `${local.slice(0, 2)}***@${domain}`;\n}\n\nfunction maskPhone(phone: string): string {\n return phone.replace(/\\d/g, (d, i) => i < phone.length - 4 ? '*' : d);\n}\n\nfunction anonymizeValue(value: any, method: string): any {\n if (value === null || value === undefined) return value;\n\n switch (method) {\n case 'masking':\n return '***MASKED***';\n case 'hashing':\n return hashValue(String(value));\n case 'generalization':\n return typeof value === 'number' ? Math.floor(value / 10) * 10 : '[GENERALIZED]';\n case 'tokenization':\n return `TOKEN_${Math.random().toString(36).substr(2, 9)}`;\n default:\n return value;\n }\n}\n\nfunction hashValue(value: string): string {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return `HASH_${Math.abs(hash).toString(16)}`;\n}\n\nfunction calculatePrivacyLevel(method: string): number {\n const levels: Record<string, number> = {\n 'masking': 60,\n 'hashing': 80,\n 'generalization': 50,\n 'differential_privacy': 95,\n 'tokenization': 70\n };\n return levels[method] || 50;\n}\n\nfunction generatePIIRecommendations(piiColumns: any[]): string[] {\n const recommendations: string[] = [];\n\n if (piiColumns.length > 0) {\n recommendations.push('Implement data anonymization for PII columns');\n recommendations.push('Add access controls to restrict PII access');\n recommendations.push('Enable audit logging for PII access');\n }\n\n if (piiColumns.some(c => c.type === 'ssn' || c.type === 'credit_card')) {\n recommendations.push('CRITICAL: Encrypt sensitive financial/identity data');\n }\n\n return recommendations;\n}\n\n","/**\n * Data Versioning & Pipelines\n * Snapshots, lineage tracking, transformation pipelines\n */\n\nimport type {\n DataSnapshot,\n DataDiff,\n DataLineage,\n DataPipeline,\n PipelineStep,\n PipelineResult\n} from '../types';\n\n// In-memory storage for snapshots\nconst snapshots = new Map<string, DataSnapshot>();\nconst lineages = new Map<string, DataLineage>();\n\n/**\n * Create data snapshot\n */\nexport async function createSnapshot(\n data: any[],\n label?: string\n): Promise<DataSnapshot> {\n const id = `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const columns = Object.keys(data[0] || {});\n\n const snapshot: DataSnapshot = {\n id,\n label: label || `Snapshot ${new Date().toISOString()}`,\n data: JSON.parse(JSON.stringify(data)),\n schema: {\n columns: columns.map(name => ({\n name,\n type: detectColumnType(data.map(row => row[name]))\n })),\n rowCount: data.length\n },\n timestamp: new Date(),\n metadata: {\n rowCount: data.length,\n columnCount: columns.length,\n checksum: calculateChecksum(data)\n }\n };\n\n snapshots.set(id, snapshot);\n return snapshot;\n}\n\n/**\n * Compare two snapshots\n */\nexport async function compareSnapshots(\n snapshot1Id: string,\n snapshot2Id: string\n): Promise<DataDiff> {\n const snap1 = snapshots.get(snapshot1Id);\n const snap2 = snapshots.get(snapshot2Id);\n\n if (!snap1 || !snap2) {\n throw new Error('Snapshot not found');\n }\n\n const columns1 = new Set(snap1.schema.columns.map(c => c.name));\n const columns2 = new Set(snap2.schema.columns.map(c => c.name));\n\n const columnsAdded = Array.from(columns2).filter(c => !columns1.has(c));\n const columnsRemoved = Array.from(columns1).filter(c => !columns2.has(c));\n\n const rowsAdded = snap2.data.length - snap1.data.length;\n const rowsRemoved = rowsAdded < 0 ? Math.abs(rowsAdded) : 0;\n\n return {\n snapshot1: snapshot1Id,\n snapshot2: snapshot2Id,\n changes: {\n rowsAdded: Math.max(0, rowsAdded),\n rowsRemoved,\n rowsModified: 0, // Simplified\n columnsAdded,\n columnsRemoved,\n columnsModified: []\n },\n details: []\n };\n}\n\n/**\n * Track data lineage\n */\nexport async function trackLineage(\n dataId: string,\n source: string\n): Promise<DataLineage> {\n const lineage: DataLineage = {\n source,\n transformations: [],\n currentState: {\n rowCount: 0,\n columnCount: 0,\n lastModified: new Date()\n }\n };\n\n lineages.set(dataId, lineage);\n return lineage;\n}\n\n/**\n * Add transformation to lineage\n */\nexport function addTransformation(\n dataId: string,\n operation: string,\n params: any\n): void {\n const lineage = lineages.get(dataId);\n if (lineage) {\n lineage.transformations.push({\n operation,\n timestamp: new Date(),\n params\n });\n }\n}\n\n/**\n * Create data pipeline\n */\nexport async function createPipeline(\n steps: PipelineStep[]\n): Promise<DataPipeline> {\n const id = `pipeline_${Date.now()}`;\n\n return {\n id,\n name: 'Data Processing Pipeline',\n steps,\n createdAt: new Date()\n };\n}\n\n/**\n * Execute pipeline\n */\nexport async function executePipeline(\n pipeline: DataPipeline,\n data: any[]\n): Promise<PipelineResult> {\n const startTime = Date.now();\n let currentData = JSON.parse(JSON.stringify(data));\n const errors: Array<{ step: number; error: string }> = [];\n let stepsExecuted = 0;\n\n for (let i = 0; i < pipeline.steps.length; i++) {\n const step = pipeline.steps[i];\n\n try {\n // Check condition if exists\n if (step.condition && !step.condition(currentData)) {\n continue;\n }\n\n // Execute step (simplified - would call actual operations)\n currentData = await executeStep(currentData, step);\n stepsExecuted++;\n } catch (error) {\n errors.push({\n step: i,\n error: error instanceof Error ? error.message : String(error)\n });\n\n if (step.onError === 'stop') {\n break;\n }\n }\n }\n\n return {\n success: errors.length === 0,\n data: currentData,\n stepsExecuted,\n totalSteps: pipeline.steps.length,\n executionTime: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined\n };\n}\n\n/**\n * Save pipeline\n */\nexport async function savePipeline(\n pipeline: DataPipeline,\n name: string\n): Promise<void> {\n // In production, this would save to database or file system\n console.log(`Pipeline \"${name}\" saved`);\n}\n\n/**\n * Load pipeline\n */\nexport async function loadPipeline(name: string): Promise<DataPipeline> {\n // In production, this would load from database or file system\n return {\n id: 'loaded_pipeline',\n name,\n steps: [],\n createdAt: new Date()\n };\n}\n\n// Helper functions\nfunction detectColumnType(values: any[]): 'string' | 'number' | 'boolean' | 'date' | 'categorical' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'string';\n\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'number';\n }\n\n return 'categorical';\n}\n\nfunction calculateChecksum(data: any[]): string {\n const str = JSON.stringify(data);\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n}\n\nasync function executeStep(data: any[], step: PipelineStep): Promise<any[]> {\n // Simplified step execution\n // In production, this would call actual transformation functions\n return data;\n}\n\n","/**\n * Streaming & Real-time Data\n * Real-time data processing and monitoring\n */\n\nimport type {\n StreamConnection,\n StreamingAnomalyConfig,\n AggregationConfig,\n AggregationResult,\n Anomaly\n} from '../types';\n\n/**\n * Connect to streaming data source\n */\nexport async function connectStream(\n options: {\n source: 'websocket' | 'sse' | 'polling';\n url: string;\n updateInterval?: number;\n }\n): Promise<StreamConnection> {\n const { source, url, updateInterval = 1000 } = options;\n\n const connection: StreamConnection = {\n id: `stream_${Date.now()}`,\n source,\n url,\n connected: false,\n onData: () => {},\n onError: () => {},\n disconnect: () => {\n connection.connected = false;\n }\n };\n\n // Simulate connection\n setTimeout(() => {\n connection.connected = true;\n }, 100);\n\n return connection;\n}\n\n/**\n * Monitor for anomalies in real-time\n */\nexport async function monitorAnomalies(\n stream: StreamConnection,\n config: StreamingAnomalyConfig\n): Promise<void> {\n const { columns, threshold, windowSize = 100 } = config;\n const window: any[] = [];\n\n // This would be implemented with actual streaming logic\n console.log(`Monitoring anomalies on columns: ${columns.join(', ')}`);\n}\n\n/**\n * Perform streaming aggregations\n */\nexport async function streamingAggregation(\n stream: StreamConnection,\n config: AggregationConfig\n): Promise<void> {\n const { windowType, windowSize, aggregations } = config;\n\n console.log(`Streaming aggregation: ${windowType} window of ${windowSize}`);\n}\n\n/**\n * Detect anomalies in streaming data\n */\nexport async function detectStreamingAnomalies(\n data: any[],\n config: StreamingAnomalyConfig\n): Promise<Anomaly[]> {\n const { columns, threshold, method = 'statistical' } = config;\n const anomalies: Anomaly[] = [];\n\n for (const column of columns) {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v));\n \n if (values.length < 10) continue;\n\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const std = Math.sqrt(\n values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length\n );\n\n data.forEach((row, idx) => {\n const value = Number(row[column]);\n if (!isNaN(value)) {\n const zScore = Math.abs((value - mean) / std);\n if (zScore > threshold) {\n anomalies.push({\n rowIndex: idx,\n row,\n score: zScore / 10, // Normalize to 0-1\n reasons: [`${column} value ${value} is ${zScore.toFixed(2)} standard deviations from mean`],\n affectedColumns: [column]\n });\n }\n }\n });\n }\n\n return anomalies;\n}\n\n/**\n * Calculate windowed aggregations\n */\nexport async function calculateWindowedAggregations(\n data: any[],\n config: AggregationConfig\n): Promise<AggregationResult[]> {\n const { windowType, windowSize, aggregations } = config;\n const results: AggregationResult[] = [];\n\n // Tumbling window implementation\n if (windowType === 'tumbling') {\n for (let i = 0; i < data.length; i += windowSize) {\n const window = data.slice(i, i + windowSize);\n const windowResults: Record<string, number> = {};\n\n for (const agg of aggregations) {\n const values = window.map(row => Number(row[agg.column])).filter(v => !isNaN(v));\n \n let result = 0;\n switch (agg.function) {\n case 'sum':\n result = values.reduce((a, b) => a + b, 0);\n break;\n case 'avg':\n result = values.reduce((a, b) => a + b, 0) / values.length;\n break;\n case 'count':\n result = values.length;\n break;\n case 'min':\n result = Math.min(...values);\n break;\n case 'max':\n result = Math.max(...values);\n break;\n case 'std':\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n result = Math.sqrt(values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length);\n break;\n }\n\n windowResults[agg.alias || `${agg.column}_${agg.function}`] = result;\n }\n\n results.push({\n windowStart: new Date(Date.now() + i * 1000),\n windowEnd: new Date(Date.now() + (i + windowSize) * 1000),\n results: windowResults,\n rowCount: window.length\n });\n }\n }\n\n return results;\n}\n\n/**\n * Sample data intelligently\n */\nexport async function smartSample(\n data: any[],\n options: {\n size: number;\n method: 'random' | 'stratified' | 'systematic' | 'cluster';\n preserveDistribution?: boolean;\n }\n): Promise<{ data: any[]; method: string; originalSize: number; sampleSize: number; preservedDistribution: boolean; representativeness: number }> {\n const { size, method, preserveDistribution = true } = options;\n\n let sampledData: any[] = [];\n\n switch (method) {\n case 'random':\n sampledData = randomSample(data, size);\n break;\n case 'systematic':\n sampledData = systematicSample(data, size);\n break;\n case 'stratified':\n sampledData = stratifiedSample(data, size);\n break;\n default:\n sampledData = randomSample(data, size);\n }\n\n return {\n data: sampledData,\n method,\n originalSize: data.length,\n sampleSize: sampledData.length,\n preservedDistribution: preserveDistribution,\n representativeness: 0.85 // Simplified\n };\n}\n\n// Helper functions\nfunction randomSample(data: any[], size: number): any[] {\n const shuffled = [...data].sort(() => Math.random() - 0.5);\n return shuffled.slice(0, size);\n}\n\nfunction systematicSample(data: any[], size: number): any[] {\n const step = Math.floor(data.length / size);\n const sample: any[] = [];\n for (let i = 0; i < data.length && sample.length < size; i += step) {\n sample.push(data[i]);\n }\n return sample;\n}\n\nfunction stratifiedSample(data: any[], size: number): any[] {\n // Simplified stratified sampling\n return randomSample(data, size);\n}\n\n"],"names":["inferSchema","data","name","firstRow","key","type","inferColumnType","row","column","values","v","uniqueValues","calculateStats","count","nullCount","stats","numbers","n","sorted","a","b","sum","variance","acc","val","frequency","maxFreq","k","detectAnomalies","columns","sensitivity","anomalies","multiplier","idx","q1","q3","iqr","lowerBound","upperBound","value","existing","reason","QAEngine","config","request","startTime","question","schema","sampleSize","includeAggregates","sampledData","aggregates","prompt","llmResponse","error","step","sampled","i","counts","totalRows","isSampled","col","provider","apiKey","baseUrl","model","maxTokens","temperature","questionMatch","lowerQuestion","rowsMatch","totalRowsMatch","columnsMatch","sampleRows","line","response","_b","_a","headers","parsed","extractFromDOM","options","selector","includeHeaders","maxRows","inferTypes","skipEmptyRows","tableElement","rows","dataStartIndex","headerRow","cell","index","_","rowsToProcess","cells","rowData","columnName","numValue","createBasicSchema","normalizeVueData","processedData","columnNames","rowCount","parsePostmanCollection","collection","variables","collectionAuth","parseAuth","endpoints","parseItems","items","parentPath","item","parseEndpoint","h","queryParams","q","auth","credentials","replaceVariables","text","result","regex","executeAPIRequest","endpoint","additionalHeaders","additionalParams","url","allParams","queryString","keyName","keyValue","token","username","password","encoded","responseHeaders","executeMultipleRequests","results","convertToTabular","TabularIntelligence","qaConfig","processingTime","tfmRequest","metadata","baseResult","safeConfig","endpointName","e","allVariables","qaRequest","qaResponse","executionTime","useTabularIntelligence","client","loading","ref","lastResult","questionHistory","answerHistory","lastAnswer","maxQuestionHistory","useLocalFallback","analyze","analysisOptions","performLocalAnalysis","err","currentSchema","numericColumns","features","clusters","correlations","f1","f2","getDescriptiveStats","detectAnomaliesMethod","performClustering","numClusters","predict","targetColumn","predictionOptions","updateConfig","newConfig","setData","newData","autoInferSchema","reset","askQuestion","qaOptions","answer","questionObj","generateSummary","clearHistory","extractOptions","extracted","loadFromVueGrid","gridData","initializeQA","props","__props","emit","__emit","questionText","handleSubmit","handleNewLine","event","showSupporting","formatTimestamp","timestamp","reversedQuestions","computed","formatTime","date","diff","minutes","hours","days","profileData","columnProfiles","profile","profileColumn","c","calculateCorrelations","duplicates","detectDuplicates","memoryUsage","estimateMemoryUsage","warnings","generateWarnings","qualityScore","calculateQualityScore","detectColumnType","missingCount","missingPercentage","uniqueCount","uniquePercentage","calculateNumericStats","analyzeCategorical","analyzeDateRange","assessColumnQuality","nonNullValues","numericValues","mean","median","min","max","std","outliers","skewness","kurtosis","valueCounts","topValues","entropy","p","uniqueRatio","cardinality","dates","d","earliest","latest","spanMs","spanDays","span","issues","recommendations","score","matrix","significant","j","correlation","calculatePearsonCorrelation","x","y","validPairs","xi","yi","xValues","yValues","meanX","meanY","numerator","sumXSquared","sumYSquared","xDiff","yDiff","denominator","seen","jsonString","bytes","profiles","duplicatePercentage","lowQualityColumns","highMissingColumns","avgColumnScore","duplicatePenalty","assessDataQuality","detectDataIssues","completeness","uniqueness","consistency","validity","accuracy","overallScore","generateRecommendations","suggestCleaningSteps","missingColumns","outlierColumns","imputeMissingValues","strategy","targetColumns","imputedData","totalImputed","details","missingIndices","imputedValue","calculateMean","calculateMedian","calculateMode","knnImputation","iterativeImputation","aiImputation","calculateImputationConfidence","mid","maxCount","mode","otherColumns","missingIdx","neighbors","distance","val1","val2","neighborValues","predictorColumns","completeCases","weightedSum","totalWeight","completeCase","similarity","validComparisons","weight","handleOutliers","method","resultData","outliersDetected","outliersRemoved","detectOutliers","outlierIndices","o","bounds","calculateBounds","outlier","detectOutliersIQR","detectOutliersZScore","threshold","forecastTimeSeries","dateColumn","valueColumn","horizon","confidence","timeSeries","alpha","predictions","level","lastTimestamp","interval","detectTimeInterval","forecastTimestamp","forecastValue","margin","calculateStd","trendResult","detectTrend","seasonality","detectSeasonality","detectTrends","valueColumns","periods","maxCorrelation","detectedPeriod","period","calculateAutocorrelation","detected","periodName","detectChangePoints","changePoints","windowSize","before","after","meanBefore","meanAfter","magnitude","intervals","slope","direction","strength","lag","autoTrain","taskType","metric","models","X","f","allModels","modelType","performance","trainModel","metricKey","bestModel","best","current","bestScore","featureImportance","calculateFeatureImportance","compareModels","crossValidation","detectTaskType","performances","modelName","winner","tuneHyperparameters","iterations","allTrials","parameters","generateRandomParameters","bestTrial","defaultPerformance","defaultScore","metrics","getMostFrequent","calculateClassificationMetrics","calculateRegressionMetrics","yTrue","yPred","mse","mae","sst","sse","r2Score","arr","feature","m","autoGenerateFeatures","maxFeatures","includeInteractions","includePolynomials","originalColumns","newFeatures","squaredName","col1","col2","interactionName","createFeatures","transformations","transform","applyTransformation","analyzeFeatureImportance","importances","featureValues","targetValues","calculateCorrelation","imp","selectBestFeatures","topK","outputName","newRow","explainPrediction","rowIndex","shapValues","shapValue","topFeatures","sv","prediction","baseValue","r","explanation","getFeatureImportance","getPartialDependence","plotValues","generateCounterfactuals","desiredOutcome","maxChanges","original","counterfactuals","counterfactual","changes","featuresToChange","originalValue","newValue","analyzeABTest","controlGroup","treatmentGroup","confidenceLevel","controlValues","treatmentValues","controlMean","treatmentMean","controlStd","treatmentStd","pValue","tTest","pooledStd","effectSize","recommendation","testSignificance","test","groups","group1Values","group2Values","statistic","calculateSampleSize","effect","power","group1","group2","mean1","mean2","var1","var2","n1","n2","pooledVar","normalCDF","z","t","recommendVisualizations","categoricalColumns","dateColumns","generateChartSpec","xColumn","yColumn","groupBy","spec","yType","detectPatterns","chartType","insights","joinTables","leftTable","rightTable","leftKey","rightKey","joinType","rightIndex","rightRow","leftRow","matches","leftKeys","detectRelationships","tables","relationships","tableNames","table1Name","table2Name","table1","table2","columns1","columns2","relationship","analyzeColumnRelationship","analyzeCrossTables","joinOperations","rel","inferDatabaseSchema","schemaTable","tableName","colName","values1","values2","matchingRows","generateReport","format","sections","includeCharts","reportSections","generateExecutiveSummary","generateStatsSection","generateRecommendationsSection","columnCount","generateInsights","maxInsights","detectPII","piiColumns","sampleValues","maskEmail","maskPhone","riskLevel","generatePIIRecommendations","anonymizeData","anonymizeValue","calculatePrivacyLevel","checkCompliance","standard","piiResult","violations","compliant","email","local","domain","phone","hashValue","hash","char","snapshots","lineages","createSnapshot","label","id","snapshot","calculateChecksum","compareSnapshots","snapshot1Id","snapshot2Id","snap1","snap2","columnsAdded","columnsRemoved","rowsAdded","rowsRemoved","trackLineage","dataId","source","lineage","addTransformation","operation","params","createPipeline","steps","executePipeline","pipeline","currentData","errors","stepsExecuted","executeStep","savePipeline","loadPipeline","str","connectStream","updateInterval","connection","monitorAnomalies","stream","streamingAggregation","windowType","aggregations","detectStreamingAnomalies","zScore","calculateWindowedAggregations","window","windowResults","agg","smartSample","size","preserveDistribution","randomSample","systematicSample","stratifiedSample","sample"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/helpers.ts","../src/utils/qaEngine.ts","../src/utils/tableExtractor.ts","../src/utils/postmanParser.ts","../src/utils/apiClient.ts","../src/core/TabularIntelligence.ts","../src/composables/useTabularIntelligence.ts","../src/components/QuestionInput.vue","../src/components/AnswerDisplay.vue","../src/components/QuestionHistory.vue","../src/quality/profiling.ts","../src/preprocessing/imputation.ts","../src/preprocessing/outliers.ts","../src/advanced/timeseries.ts","../src/advanced/automl.ts","../src/advanced/featureEngineering.ts","../src/advanced/explainability.ts","../src/advanced/statistical.ts","../src/advanced/visualization.ts","../src/advanced/multitable.ts","../src/advanced/reporting.ts","../src/advanced/privacy.ts","../src/advanced/versioning.ts","../src/advanced/streaming.ts","../src/index.ts"],"sourcesContent":["/**\n * Helper utilities for tabular intelligence\n */\n\nimport type { TableSchema, TableColumn, DescriptiveStats, Anomaly, Cluster } from '../types';\n\n/**\n * Infer table schema from data\n */\nexport function inferSchema(data: any[], name?: string): TableSchema {\n if (data.length === 0) {\n return { columns: [], rowCount: 0, name };\n }\n\n const firstRow = data[0];\n const columns: TableColumn[] = Object.keys(firstRow).map((key) => {\n const type = inferColumnType(data, key);\n return {\n name: key,\n type,\n nullable: data.some((row) => row[key] == null),\n };\n });\n\n return {\n columns,\n rowCount: data.length,\n name,\n };\n}\n\n/**\n * Infer column type from data\n */\nexport function inferColumnType(data: any[], column: string): TableColumn['type'] {\n const values = data.map((row) => row[column]).filter((v) => v != null);\n \n if (values.length === 0) return 'string';\n\n // Check if all values are numbers\n if (values.every((v) => typeof v === 'number' || !isNaN(Number(v)))) {\n return 'number';\n }\n\n // Check if all values are booleans\n if (values.every((v) => typeof v === 'boolean' || v === 'true' || v === 'false')) {\n return 'boolean';\n }\n\n // Check if values look like dates\n if (values.every((v) => !isNaN(Date.parse(v)))) {\n return 'date';\n }\n\n // Check if categorical (limited unique values)\n const uniqueValues = new Set(values);\n if (uniqueValues.size < values.length * 0.5 && uniqueValues.size < 20) {\n return 'categorical';\n }\n\n return 'string';\n}\n\n/**\n * Calculate basic descriptive statistics\n */\nexport function calculateStats(data: any[], column: string, type: TableColumn['type']): DescriptiveStats {\n const values = data.map((row) => row[column]).filter((v) => v != null);\n const count = values.length;\n const nullCount = data.length - count;\n\n const stats: DescriptiveStats = {\n column,\n count,\n nullCount,\n };\n\n if (type === 'number') {\n const numbers = values.map(Number).filter((n) => !isNaN(n));\n \n if (numbers.length > 0) {\n const sorted = [...numbers].sort((a, b) => a - b);\n const sum = numbers.reduce((a, b) => a + b, 0);\n \n stats.mean = sum / numbers.length;\n stats.median = sorted[Math.floor(sorted.length / 2)];\n stats.min = sorted[0];\n stats.max = sorted[sorted.length - 1];\n \n const variance = numbers.reduce((acc, val) => acc + Math.pow(val - stats.mean!, 2), 0) / numbers.length;\n stats.std = Math.sqrt(variance);\n \n stats.percentiles = {\n '25': sorted[Math.floor(sorted.length * 0.25)],\n '50': stats.median,\n '75': sorted[Math.floor(sorted.length * 0.75)],\n '90': sorted[Math.floor(sorted.length * 0.90)],\n };\n }\n } else {\n const uniqueValues = new Set(values);\n stats.uniqueValues = uniqueValues.size;\n \n const frequency: Record<string, number> = {};\n values.forEach((v) => {\n const key = String(v);\n frequency[key] = (frequency[key] || 0) + 1;\n });\n \n const maxFreq = Math.max(...Object.values(frequency));\n stats.mode = Object.keys(frequency).find((k) => frequency[k] === maxFreq);\n }\n\n return stats;\n}\n\n/**\n * Detect anomalies using IQR method\n */\nexport function detectAnomalies(data: any[], columns: string[], sensitivity: number = 0.5): Anomaly[] {\n const anomalies: Anomaly[] = [];\n const multiplier = 1.5 + (1 - sensitivity) * 1.5;\n\n columns.forEach((column) => {\n const values = data.map((row, idx) => ({ value: Number(row[column]), idx }))\n .filter((v) => !isNaN(v.value));\n\n if (values.length === 0) return;\n\n const sorted = [...values].sort((a, b) => a.value - b.value);\n const q1 = sorted[Math.floor(sorted.length * 0.25)].value;\n const q3 = sorted[Math.floor(sorted.length * 0.75)].value;\n const iqr = q3 - q1;\n const lowerBound = q1 - multiplier * iqr;\n const upperBound = q3 + multiplier * iqr;\n\n values.forEach(({ value, idx }) => {\n if (value < lowerBound || value > upperBound) {\n const existing = anomalies.find((a) => a.rowIndex === idx);\n const reason = value < lowerBound\n ? `${column}: ${value.toFixed(2)} < ${lowerBound.toFixed(2)}`\n : `${column}: ${value.toFixed(2)} > ${upperBound.toFixed(2)}`;\n\n if (existing) {\n existing.reasons.push(reason);\n existing.affectedColumns.push(column);\n existing.score = Math.min(1, existing.score + 0.2);\n } else {\n anomalies.push({\n rowIndex: idx,\n row: data[idx],\n score: 0.7,\n reasons: [reason],\n affectedColumns: [column],\n });\n }\n }\n });\n });\n\n return anomalies.sort((a, b) => b.score - a.score);\n}\n\n","import type { QARequest, QAResponse, Answer, TableSchema } from '../types';\nimport { calculateStats } from './helpers';\n\nexport interface QAEngineConfig {\n provider: 'openai' | 'anthropic' | 'custom';\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\n/**\n * Q&A Engine for natural language questions about table data\n */\nexport class QAEngine {\n private config: QAEngineConfig;\n\n constructor(config: QAEngineConfig) {\n this.config = {\n maxTokens: 1000,\n temperature: 0.3,\n ...config,\n };\n }\n\n /**\n * Answer a question about the table data\n */\n async answerQuestion(request: QARequest): Promise<QAResponse> {\n const startTime = Date.now();\n\n try {\n // Prepare data for LLM\n const { question, schema, data, sampleSize = 100, includeAggregates = true } = request;\n\n // Validate data exists and is an array\n if (!data || !Array.isArray(data) || data.length === 0) {\n throw new Error('No data available. Please load data first.');\n }\n\n // Validate schema exists\n if (!schema || !schema.columns || !Array.isArray(schema.columns)) {\n throw new Error('Invalid schema. Please ensure data has a valid schema.');\n }\n\n // Sample data if too large\n const sampledData = data.length > sampleSize ? this.sampleData(data, sampleSize) : data;\n\n // Calculate aggregates if requested\n const aggregates = includeAggregates ? this.calculateAggregates(data, schema) : undefined;\n\n // Build prompt\n const prompt = this.buildPrompt(question, schema, sampledData, aggregates, data.length);\n \n // Call LLM\n const llmResponse = await this.callLLM(prompt);\n \n // Parse response\n const answer = this.parseResponse(llmResponse, question, data.length > sampleSize);\n \n return {\n answer,\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n console.error('Q&A error:', error);\n \n // Return error answer\n return {\n answer: {\n questionId: this.generateId(),\n text: 'I encountered an error while processing your question. Please try again.',\n timestamp: new Date(),\n confidence: 0,\n cannotAnswer: true,\n reason: error instanceof Error ? error.message : 'Unknown error',\n },\n processingTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Sample data for large datasets\n */\n private sampleData(data: any[], sampleSize: number): any[] {\n // Validate data\n if (!data || !Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n if (data.length <= sampleSize) {\n return data;\n }\n\n const step = Math.floor(data.length / sampleSize);\n const sampled: any[] = [];\n\n for (let i = 0; i < data.length && sampled.length < sampleSize; i += step) {\n sampled.push(data[i]);\n }\n\n return sampled;\n }\n\n /**\n * Calculate aggregates for numeric columns\n */\n private calculateAggregates(data: any[], schema: TableSchema): Record<string, any> {\n const aggregates: Record<string, any> = {};\n\n // Validate data exists\n if (!data || !Array.isArray(data) || data.length === 0) {\n return aggregates;\n }\n\n // Validate schema and columns exist\n if (!schema || !schema.columns || !Array.isArray(schema.columns)) {\n return aggregates;\n }\n\n for (const column of schema.columns) {\n if (column.type === 'number' && data.length > 0) {\n try {\n const stats = calculateStats(data, column.name, 'number');\n aggregates[column.name] = {\n mean: stats.mean,\n median: stats.median,\n min: stats.min,\n max: stats.max,\n count: stats.count,\n };\n } catch (error) {\n // Skip columns with errors\n }\n } else if (column.type === 'categorical' || column.type === 'string') {\n // Count unique values\n const values = data.map(row => row[column.name]).filter(v => v != null);\n const uniqueValues = new Set(values);\n aggregates[column.name] = {\n uniqueCount: uniqueValues.size,\n totalCount: values.length,\n topValues: this.getTopValues(values, 5),\n };\n }\n }\n \n return aggregates;\n }\n\n /**\n * Get top N most frequent values\n */\n private getTopValues(values: any[], n: number): Array<{ value: any; count: number }> {\n const counts = new Map<any, number>();\n \n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n \n return Array.from(counts.entries())\n .map(([value, count]) => ({ value, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, n);\n }\n\n /**\n * Build prompt for LLM\n */\n private buildPrompt(\n question: string,\n schema: TableSchema,\n sampledData: any[],\n aggregates?: Record<string, any>,\n totalRows?: number\n ): string {\n const isSampled = totalRows && totalRows > sampledData.length;\n \n let prompt = `You are a data analyst assistant. Answer the following question about a table dataset.\\n\\n`;\n \n prompt += `**Table Schema:**\\n`;\n prompt += `Table: ${schema.name}\\n`;\n prompt += `Columns:\\n`;\n for (const col of schema.columns) {\n prompt += `- ${col.name} (${col.type})\\n`;\n }\n prompt += `\\n`;\n \n if (aggregates && Object.keys(aggregates).length > 0) {\n prompt += `**Summary Statistics:**\\n`;\n prompt += JSON.stringify(aggregates, null, 2);\n prompt += `\\n\\n`;\n }\n \n prompt += `**Sample Data** (${sampledData.length} rows${isSampled ? ` out of ${totalRows} total` : ''}):\\n`;\n prompt += JSON.stringify(sampledData.slice(0, 10), null, 2);\n prompt += `\\n\\n`;\n \n prompt += `**Question:** ${question}\\n\\n`;\n\n prompt += `**Instructions:**\\n`;\n prompt += `1. You are a helpful AI data analyst that can answer questions about the table data, perform statistical analysis, make predictions, identify trends, AND engage in normal conversation.\\n`;\n prompt += `2. For data questions (e.g., \"how many rows?\", \"what's the average?\"), answer based on the data provided above.\\n`;\n prompt += `3. For statistical analysis requests (e.g., \"calculate descriptive statistics\", \"show me mean/median/std dev\"), compute and present the statistics clearly.\\n`;\n prompt += `4. For anomaly detection requests (e.g., \"detect anomalies\", \"find outliers\"), identify unusual data points and explain why they're anomalous.\\n`;\n prompt += `5. For clustering requests (e.g., \"perform clustering\", \"group similar data\"), identify natural groupings in the data and describe their characteristics.\\n`;\n prompt += `6. For correlation analysis requests (e.g., \"show correlations\", \"what variables are related\"), analyze relationships between variables and explain the strength and direction of correlations.\\n`;\n prompt += `7. For predictive questions (e.g., \"predict future trends\", \"what will happen next?\", \"forecast X\"), analyze patterns in the data and make reasonable predictions based on trends, correlations, and statistical patterns you observe.\\n`;\n prompt += `8. For analytical questions (e.g., \"what insights?\", \"any patterns?\", \"recommendations?\"), provide insights, trends, correlations, and actionable recommendations based on the data.\\n`;\n prompt += `9. For conversational questions (e.g., \"hi\", \"hello\", \"what can you do?\"), respond naturally and mention your capabilities.\\n`;\n prompt += `10. If a question is completely unrelated to data analysis (e.g., \"what's the weather?\"), politely explain you can only help with data analysis.\\n`;\n prompt += `11. Provide clear, concise answers with specific numbers and examples.\\n`;\n prompt += `12. When making predictions or identifying trends, explain your reasoning and mention the confidence level.\\n`;\n prompt += `13. If the answer is based on sampled data, mention that it's an approximation.\\n`;\n prompt += `14. Format your response as JSON with the following structure:\\n`;\n prompt += `{\\n`;\n prompt += ` \"answer\": \"Your answer text here\",\\n`;\n prompt += ` \"confidence\": 0.0-1.0,\\n`;\n prompt += ` \"cannotAnswer\": false,\\n`;\n prompt += ` \"isApproximate\": ${isSampled},\\n`;\n prompt += ` \"supportingData\": { \"key\": \"value\" } // optional\\n`;\n prompt += `}\\n\\n`;\n prompt += `Examples:\\n`;\n prompt += `- Question: \"hi\" → Answer: \"Hello! I'm your AI data analyst. I can perform statistical analysis, detect anomalies, cluster data, analyze correlations, make predictions, and answer questions about this dataset.\"\\n`;\n prompt += `- Question: \"how many rows?\" → Answer: \"There are ${totalRows || sampledData.length} rows in the dataset.\"\\n`;\n prompt += `- Question: \"calculate descriptive statistics\" → Answer: \"Descriptive Statistics:\\\\n- Mean: 45.2\\\\n- Median: 42.0\\\\n- Std Dev: 12.5\\\\n- Min: 10\\\\n- Max: 95\\\\n- 25th Percentile: 35\\\\n- 75th Percentile: 58\" (with confidence: 0.95)\\n`;\n prompt += `- Question: \"detect anomalies\" → Answer: \"I found 3 anomalies in the dataset:\\\\n1. Row 15: Value 250 is 3.5 standard deviations above the mean\\\\n2. Row 42: Value -10 is unusually low\\\\n3. Row 88: Value 300 is an extreme outlier\" (with confidence: 0.85)\\n`;\n prompt += `- Question: \"perform clustering\" → Answer: \"I identified 3 natural clusters in the data:\\\\n- Cluster 1 (40%): Low values, avg 25\\\\n- Cluster 2 (35%): Medium values, avg 50\\\\n- Cluster 3 (25%): High values, avg 85\" (with confidence: 0.8)\\n`;\n prompt += `- Question: \"show correlation analysis\" → Answer: \"Correlation Analysis:\\\\n- Price & Quantity: -0.65 (strong negative)\\\\n- Revenue & Price: 0.82 (strong positive)\\\\n- Quantity & Revenue: 0.45 (moderate positive)\" (with confidence: 0.9)\\n`;\n prompt += `- Question: \"predict future sales\" → Answer: \"Based on the trend in the data, sales are increasing by 15% monthly. If this continues, next month's sales could reach approximately $50,000.\" (with confidence: 0.7)\\n`;\n prompt += `- Question: \"what insights can you give?\" → Answer: \"Key insights: 1) Sales peak on weekends, 2) Product A is the top seller, 3) Customer retention is 85%...\"\\n`;\n prompt += `- Question: \"what's the weather?\" → Answer: \"I cannot answer this question as it's not related to the dataset. I can only help with questions about this data.\"\\n`;\n \n return prompt;\n }\n\n /**\n * Call LLM API\n */\n private async callLLM(prompt: string): Promise<string> {\n const { provider, apiKey, baseUrl, model, maxTokens, temperature } = this.config;\n\n // If no API key, use fallback logic\n if (!apiKey && provider !== 'custom') {\n return this.fallbackResponse(prompt);\n }\n\n if (provider === 'openai') {\n return this.callOpenAI(prompt, apiKey!, model || 'gpt-4-turbo-preview', maxTokens!, temperature!);\n } else if (provider === 'anthropic') {\n return this.callAnthropic(prompt, apiKey!, model || 'claude-3-5-sonnet-20241022', maxTokens!, temperature!);\n } else if (provider === 'custom' && baseUrl) {\n return this.callCustomAPI(prompt, baseUrl, apiKey);\n }\n\n throw new Error(`Unsupported provider: ${provider}`);\n }\n\n /**\n * Fallback response when no API key is available\n */\n private fallbackResponse(prompt: string): string {\n // Extract the question from the prompt\n const questionMatch = prompt.match(/\\*\\*Question:\\*\\* (.+)/);\n const question = questionMatch ? questionMatch[1].trim() : '';\n\n const lowerQuestion = question.toLowerCase();\n\n // Handle greetings\n if (/^(hi|hello|hey|greetings|good morning|good afternoon|good evening)/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"Hello! 👋 I'm your data analysis assistant. I can help you explore and understand this dataset. Try asking questions like 'How many rows are there?', 'What columns do we have?', or 'Show me a summary of the data'. For more advanced analysis, please configure an OpenAI or Anthropic API key in the settings.\",\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Handle \"what can you do\" type questions\n if (/what (can|do) you|help|capabilities|features/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can help you analyze tabular data! You can ask me questions like:\\n• 'How many rows/columns are there?'\\n• 'What are the column names?'\\n• 'Show me basic statistics'\\n• 'What's the data about?'\\n\\nWith an OpenAI or Anthropic API key, I can also:\\n• Calculate descriptive statistics (mean, median, std dev, percentiles)\\n• Detect anomalies and outliers\\n• Perform clustering analysis\\n• Analyze correlations between variables\\n• Make predictions and forecasts\\n• Identify trends and patterns\\n• Provide insights and recommendations\\n• Answer complex analytical questions\\n\\nPlease add your API key in the AI Chatbot Configuration section for advanced features.\",\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Extract schema and data info from prompt\n const rowsMatch = prompt.match(/\\*\\*Sample Data\\*\\* \\((\\d+) rows/);\n const totalRowsMatch = prompt.match(/out of (\\d+) total/);\n const columnsMatch = prompt.match(/Columns:\\n((?:- .+\\n)+)/);\n\n const sampleRows = rowsMatch ? parseInt(rowsMatch[1]) : 0;\n const totalRows = totalRowsMatch ? parseInt(totalRowsMatch[1]) : sampleRows;\n\n // Handle row count questions\n if (/how many (rows|records|entries|items)/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: `There are ${totalRows} rows in the dataset.`,\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n\n // Handle column questions\n if (/how many columns|what columns|column names|list columns/.test(lowerQuestion)) {\n if (columnsMatch) {\n const columns = columnsMatch[1].trim().split('\\n').map(line => line.replace(/^- /, '').split(' (')[0]);\n return JSON.stringify({\n answer: `The dataset has ${columns.length} columns: ${columns.join(', ')}.`,\n confidence: 1.0,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n }\n\n // Handle summary/overview questions\n if (/summary|overview|describe|what.*data|tell me about/.test(lowerQuestion)) {\n if (columnsMatch) {\n const columns = columnsMatch[1].trim().split('\\n').map(line => line.replace(/^- /, '').split(' (')[0]);\n return JSON.stringify({\n answer: `This dataset contains ${totalRows} rows and ${columns.length} columns. The columns are: ${columns.join(', ')}. For detailed analysis and insights, please configure an OpenAI or Anthropic API key.`,\n confidence: 0.8,\n cannotAnswer: false,\n isApproximate: false,\n });\n }\n }\n\n // Handle statistical analysis requests\n if (/descriptive statistics|calculate statistics|mean|median|std dev|standard deviation|percentile/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can calculate descriptive statistics with an OpenAI or Anthropic API key! I'll provide mean, median, standard deviation, min, max, and percentiles for all numeric columns. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Statistical analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle anomaly detection requests\n if (/anomaly|anomalies|outlier|outliers|detect anomal|find outlier/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can detect anomalies and outliers with an OpenAI or Anthropic API key! I'll identify unusual data points and explain why they're anomalous. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Anomaly detection requires AI. Please configure an API key.\",\n });\n }\n\n // Handle clustering requests\n if (/cluster|clustering|group|grouping|segment|segmentation/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can perform clustering analysis with an OpenAI or Anthropic API key! I'll identify natural groupings in your data and describe their characteristics. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Clustering analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle correlation analysis requests\n if (/correlation|correlate|relationship|relate|association/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can analyze correlations between variables with an OpenAI or Anthropic API key! I'll show you the strength and direction of relationships between different columns. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Correlation analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Handle prediction/forecast questions\n if (/predict|forecast|future|trend|next|will be|gonna be|going to be/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I'd love to help you make predictions based on this data! However, I need an OpenAI or Anthropic API key to analyze patterns, identify trends, and make accurate forecasts. Please add your API key in the 'AI Chatbot Configuration' section above, and I'll be able to provide detailed predictions with confidence scores.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Predictions require AI analysis. Please configure an API key for advanced features.\",\n });\n }\n\n // Handle insights/analysis questions\n if (/insight|pattern|analysis|analyze|recommendation/.test(lowerQuestion)) {\n return JSON.stringify({\n answer: \"I can provide deep insights and analysis with an OpenAI or Anthropic API key! I'll be able to identify patterns, trends, and give you actionable recommendations. Please add your API key in the 'AI Chatbot Configuration' section above.\",\n confidence: 0.3,\n cannotAnswer: true,\n reason: \"Advanced analysis requires AI. Please configure an API key.\",\n });\n }\n\n // Default: Cannot answer without API key\n return JSON.stringify({\n answer: \"I need an OpenAI or Anthropic API key to answer this question. Please add your API key in the 'AI Chatbot Configuration' section above. For now, I can only answer basic questions like 'How many rows?' or 'What columns are there?'\",\n confidence: 0.5,\n cannotAnswer: true,\n reason: \"No API key configured for advanced natural language processing\",\n });\n }\n\n /**\n * Call OpenAI API\n */\n private async callOpenAI(prompt: string, apiKey: string, model: string, maxTokens: number, temperature: number): Promise<string> {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: maxTokens,\n temperature,\n response_format: { type: 'json_object' },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.choices[0]?.message?.content || '';\n }\n\n /**\n * Call Anthropic API\n */\n private async callAnthropic(prompt: string, apiKey: string, model: string, maxTokens: number, temperature: number): Promise<string> {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n temperature,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.content[0]?.text || '';\n }\n\n /**\n * Call custom API\n */\n private async callCustomAPI(prompt: string, baseUrl: string, apiKey?: string): Promise<string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(baseUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ prompt }),\n });\n\n if (!response.ok) {\n throw new Error(`Custom API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.response || data.answer || JSON.stringify(data);\n }\n\n /**\n * Parse LLM response\n */\n private parseResponse(llmResponse: string, question: string, isSampled: boolean): Answer {\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(llmResponse);\n\n return {\n questionId: this.generateId(),\n text: parsed.answer || parsed.text || llmResponse,\n timestamp: new Date(),\n confidence: parsed.confidence || 0.8,\n cannotAnswer: parsed.cannotAnswer || false,\n isApproximate: parsed.isApproximate !== undefined ? parsed.isApproximate : isSampled,\n supportingData: parsed.supportingData,\n reason: parsed.reason,\n };\n } catch (error) {\n // If not JSON, treat as plain text answer\n return {\n questionId: this.generateId(),\n text: llmResponse,\n timestamp: new Date(),\n confidence: 0.7,\n isApproximate: isSampled,\n };\n }\n }\n\n /**\n * Generate unique ID\n */\n private generateId(): string {\n return `qa_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n","import type { TableSchema, TableColumn, ExtractedTable, TableExtractionOptions } from '../types';\nimport { inferSchema, inferColumnType } from './helpers';\n\n/**\n * Extract table data from DOM (HTML tables)\n */\nexport function extractFromDOM(options: TableExtractionOptions = {}): ExtractedTable | null {\n const {\n selector = 'table',\n includeHeaders = true,\n maxRows,\n inferTypes = true,\n skipEmptyRows = true,\n } = options;\n\n // Find table element\n const tableElement = document.querySelector(selector);\n if (!tableElement || tableElement.tagName !== 'TABLE') {\n console.warn(`No table found with selector: ${selector}`);\n return null;\n }\n\n const table = tableElement as HTMLTableElement;\n const rows = Array.from(table.rows);\n \n if (rows.length === 0) {\n return null;\n }\n\n // Extract headers\n let headers: string[] = [];\n let dataStartIndex = 0;\n\n if (includeHeaders && rows[0]) {\n const headerRow = rows[0];\n headers = Array.from(headerRow.cells).map((cell, index) => {\n const text = cell.textContent?.trim() || '';\n return text || `Column${index + 1}`;\n });\n dataStartIndex = 1;\n } else {\n // Generate column names\n const firstRow = rows[0];\n headers = Array.from(firstRow.cells).map((_, index) => `Column${index + 1}`);\n }\n\n // Extract data rows\n const data: any[] = [];\n const rowsToProcess = maxRows ? rows.slice(dataStartIndex, dataStartIndex + maxRows) : rows.slice(dataStartIndex);\n\n for (const row of rowsToProcess) {\n const cells = Array.from(row.cells);\n \n // Skip empty rows if configured\n if (skipEmptyRows && cells.every(cell => !cell.textContent?.trim())) {\n continue;\n }\n\n const rowData: Record<string, any> = {};\n cells.forEach((cell, index) => {\n const columnName = headers[index] || `Column${index + 1}`;\n let value: any = cell.textContent?.trim() || '';\n \n // Try to parse numbers\n if (inferTypes && value) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue) && value === numValue.toString()) {\n value = numValue;\n }\n }\n \n rowData[columnName] = value;\n });\n \n data.push(rowData);\n }\n\n // Infer schema\n const schema = inferTypes && data.length > 0\n ? inferSchema(data, 'Extracted Table')\n : createBasicSchema(headers, data.length);\n\n return {\n schema,\n data,\n source: 'dom',\n metadata: {\n selector,\n rowCount: data.length,\n columnCount: headers.length,\n extractedAt: new Date(),\n },\n };\n}\n\n/**\n * Normalize Vue data grid data\n */\nexport function normalizeVueData(\n data: any[],\n columns?: Array<{ field: string; header?: string; label?: string }>,\n options: TableExtractionOptions = {}\n): ExtractedTable {\n const { maxRows, inferTypes = true } = options;\n\n // Limit rows if specified\n const processedData = maxRows ? data.slice(0, maxRows) : data;\n\n // Infer schema\n let schema: TableSchema;\n \n if (columns && columns.length > 0) {\n // Use provided column definitions\n schema = {\n name: 'Vue Data Grid',\n columns: columns.map(col => ({\n name: col.field,\n type: inferTypes && processedData.length > 0\n ? inferColumnType(processedData, col.field)\n : 'string',\n nullable: true,\n })),\n rowCount: processedData.length,\n };\n } else if (processedData.length > 0) {\n // Infer from data\n schema = inferSchema(processedData, 'Vue Data Grid');\n } else {\n schema = { name: 'Vue Data Grid', columns: [], rowCount: 0 };\n }\n\n return {\n schema,\n data: processedData,\n source: 'vue',\n metadata: {\n rowCount: processedData.length,\n columnCount: schema.columns.length,\n extractedAt: new Date(),\n },\n };\n}\n\n/**\n * Create basic schema from column names\n */\nfunction createBasicSchema(columnNames: string[], rowCount: number = 0): TableSchema {\n return {\n name: 'Extracted Table',\n columns: columnNames.map(name => ({\n name,\n type: 'string',\n nullable: true,\n })),\n rowCount,\n };\n}\n\n","/**\n * Postman Collection Parser\n * Parses Postman Collection v2.1 format and extracts API endpoints\n */\n\nexport interface PostmanVariable {\n key: string;\n value: string;\n type?: string;\n}\n\nexport interface PostmanAuth {\n type: string;\n apikey?: Array<{ key: string; value: string; type: string }>;\n bearer?: Array<{ key: string; value: string; type: string }>;\n basic?: Array<{ key: string; value: string; type: string }>;\n}\n\nexport interface PostmanHeader {\n key: string;\n value: string;\n type?: string;\n}\n\nexport interface PostmanQueryParam {\n key: string;\n value: string;\n description?: string;\n}\n\nexport interface PostmanRequest {\n method: string;\n header?: PostmanHeader[];\n url: {\n raw: string;\n protocol?: string;\n host?: string[];\n path?: string[];\n query?: PostmanQueryParam[];\n };\n auth?: PostmanAuth;\n description?: string;\n}\n\nexport interface PostmanItem {\n name: string;\n request: PostmanRequest;\n response?: any[];\n item?: PostmanItem[]; // For folders\n}\n\nexport interface PostmanCollection {\n info: {\n name: string;\n description?: string;\n schema: string;\n };\n item: PostmanItem[];\n auth?: PostmanAuth;\n variable?: PostmanVariable[];\n}\n\nexport interface ParsedEndpoint {\n name: string;\n method: string;\n url: string;\n description?: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n auth?: {\n type: string;\n credentials: Record<string, string>;\n };\n}\n\nexport interface ParsedCollection {\n name: string;\n description?: string;\n endpoints: ParsedEndpoint[];\n variables: Record<string, string>;\n auth?: {\n type: string;\n credentials: Record<string, string>;\n };\n}\n\n/**\n * Parse Postman Collection JSON\n */\nexport function parsePostmanCollection(collection: PostmanCollection): ParsedCollection {\n const variables: Record<string, string> = {};\n \n // Parse collection-level variables\n if (collection.variable) {\n collection.variable.forEach(v => {\n variables[v.key] = v.value;\n });\n }\n\n // Parse collection-level auth\n const collectionAuth = collection.auth ? parseAuth(collection.auth) : undefined;\n\n // Parse all endpoints (flatten nested items)\n const endpoints: ParsedEndpoint[] = [];\n \n function parseItems(items: PostmanItem[], parentPath: string = '') {\n items.forEach(item => {\n if (item.item) {\n // It's a folder, recurse\n parseItems(item.item, parentPath ? `${parentPath}/${item.name}` : item.name);\n } else if (item.request) {\n // It's an endpoint\n endpoints.push(parseEndpoint(item, collectionAuth));\n }\n });\n }\n\n parseItems(collection.item);\n\n return {\n name: collection.info.name,\n description: collection.info.description,\n endpoints,\n variables,\n auth: collectionAuth,\n };\n}\n\n/**\n * Parse individual endpoint\n */\nfunction parseEndpoint(item: PostmanItem, collectionAuth?: any): ParsedEndpoint {\n const request = item.request;\n \n // Parse headers\n const headers: Record<string, string> = {};\n if (request.header) {\n request.header.forEach(h => {\n headers[h.key] = h.value;\n });\n }\n\n // Parse query parameters\n const queryParams: Record<string, string> = {};\n if (request.url.query) {\n request.url.query.forEach(q => {\n queryParams[q.key] = q.value;\n });\n }\n\n // Parse auth (request-level overrides collection-level)\n const auth = request.auth ? parseAuth(request.auth) : collectionAuth;\n\n return {\n name: item.name,\n method: request.method,\n url: request.url.raw,\n description: request.description,\n headers,\n queryParams,\n auth,\n };\n}\n\n/**\n * Parse authentication\n */\nfunction parseAuth(auth: PostmanAuth): { type: string; credentials: Record<string, string> } {\n const credentials: Record<string, string> = {};\n\n if (auth.apikey) {\n auth.apikey.forEach(item => {\n credentials[item.key] = item.value;\n });\n } else if (auth.bearer) {\n auth.bearer.forEach(item => {\n credentials[item.key] = item.value;\n });\n } else if (auth.basic) {\n auth.basic.forEach(item => {\n credentials[item.key] = item.value;\n });\n }\n\n return {\n type: auth.type,\n credentials,\n };\n}\n\n/**\n * Replace variables in URL and parameters\n */\nexport function replaceVariables(\n text: string,\n variables: Record<string, string>\n): string {\n let result = text;\n \n // Replace {{variable}} syntax\n Object.keys(variables).forEach(key => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n result = result.replace(regex, variables[key]);\n });\n\n return result;\n}\n\n","/**\n * API Client for executing requests from Postman collections\n */\n\nimport { ParsedEndpoint, ParsedCollection, replaceVariables } from './postmanParser';\n\nexport interface APIRequestOptions {\n endpoint: ParsedEndpoint;\n variables?: Record<string, string>;\n additionalHeaders?: Record<string, string>;\n additionalParams?: Record<string, string>;\n}\n\nexport interface APIResponse {\n success: boolean;\n data?: any;\n error?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Execute API request from parsed endpoint\n */\nexport async function executeAPIRequest(\n options: APIRequestOptions\n): Promise<APIResponse> {\n const { endpoint, variables = {}, additionalHeaders = {}, additionalParams = {} } = options;\n\n try {\n // Build URL with variables replaced\n let url = replaceVariables(endpoint.url, variables);\n\n // Add query parameters\n // Include variables that aren't already in endpoint.queryParams\n const allParams = { ...endpoint.queryParams, ...variables, ...additionalParams };\n const queryString = Object.keys(allParams)\n .filter(key => allParams[key] !== undefined && allParams[key] !== '')\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(replaceVariables(String(allParams[key]), variables))}`)\n .join('&');\n\n if (queryString) {\n url = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`;\n }\n\n // Build headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...endpoint.headers,\n ...additionalHeaders,\n };\n\n // Replace variables in headers\n Object.keys(headers).forEach(key => {\n headers[key] = replaceVariables(headers[key], variables);\n });\n\n // Add authentication\n if (endpoint.auth) {\n if (endpoint.auth.type === 'apikey') {\n const keyName = endpoint.auth.credentials.key || 'access_key';\n const keyValue = replaceVariables(endpoint.auth.credentials.value || '', variables);\n \n // Check if API key should be in header or query\n const inHeader = endpoint.auth.credentials.in === 'header';\n \n if (inHeader) {\n headers[keyName] = keyValue;\n } else {\n // Already added in query params\n }\n } else if (endpoint.auth.type === 'bearer') {\n const token = replaceVariables(endpoint.auth.credentials.token || '', variables);\n headers['Authorization'] = `Bearer ${token}`;\n } else if (endpoint.auth.type === 'basic') {\n const username = replaceVariables(endpoint.auth.credentials.username || '', variables);\n const password = replaceVariables(endpoint.auth.credentials.password || '', variables);\n const encoded = btoa(`${username}:${password}`);\n headers['Authorization'] = `Basic ${encoded}`;\n }\n }\n\n // Make request\n const response = await fetch(url, {\n method: endpoint.method,\n headers,\n });\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n statusCode: response.status,\n headers: responseHeaders,\n };\n }\n\n const data = await response.json();\n\n return {\n success: true,\n data,\n statusCode: response.status,\n headers: responseHeaders,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Execute multiple API requests in sequence\n */\nexport async function executeMultipleRequests(\n endpoints: ParsedEndpoint[],\n variables: Record<string, string> = {}\n): Promise<APIResponse[]> {\n const results: APIResponse[] = [];\n\n for (const endpoint of endpoints) {\n const result = await executeAPIRequest({ endpoint, variables });\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Convert API response to tabular format\n */\nexport function convertToTabular(response: APIResponse): any[] {\n if (!response.success || !response.data) {\n return [];\n }\n\n const data = response.data;\n\n // Handle different response structures\n if (Array.isArray(data)) {\n return data;\n }\n\n // Check for common pagination patterns\n if (data.data && Array.isArray(data.data)) {\n return data.data;\n }\n\n if (data.results && Array.isArray(data.results)) {\n return data.results;\n }\n\n if (data.items && Array.isArray(data.items)) {\n return data.items;\n }\n\n // If it's a single object, wrap it in an array\n if (typeof data === 'object') {\n return [data];\n }\n\n return [];\n}\n\n","/**\n * TabularIntelligence - Core TFM Client\n * Generic client for Tabular Foundation Model APIs\n */\n\nimport type {\n TFMConfig,\n TFMRequest,\n TFMResponse,\n AnalysisRequest,\n AnalysisResult,\n AnalysisType,\n TableSchema,\n DescriptiveStats,\n Anomaly,\n Cluster,\n Prediction,\n CorrelationMatrix,\n QARequest,\n QAResponse,\n AISummary,\n TableExtractionOptions,\n ExtractedTable,\n APIDataSource,\n APIQueryRequest,\n APIQueryResponse,\n} from '../types';\nimport { QAEngine, type QAEngineConfig } from '../utils/qaEngine';\nimport { extractFromDOM, normalizeVueData } from '../utils/tableExtractor';\nimport { parsePostmanCollection, type ParsedCollection, type ParsedEndpoint } from '../utils/postmanParser';\nimport { executeAPIRequest, convertToTabular } from '../utils/apiClient';\nimport { inferSchema } from '../utils/helpers';\n\nexport class TabularIntelligence {\n private config: TFMConfig;\n private qaEngine?: QAEngine;\n private parsedCollection?: ParsedCollection;\n\n constructor(config: TFMConfig, qaConfig?: QAEngineConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n // Initialize Q&A engine if config provided\n if (qaConfig) {\n this.qaEngine = new QAEngine(qaConfig);\n }\n }\n\n /**\n * Initialize or update Q&A engine\n */\n initializeQA(qaConfig: QAEngineConfig): void {\n this.qaEngine = new QAEngine(qaConfig);\n }\n\n /**\n * Generic API call to TFM endpoint\n */\n private async callTFM(request: TFMRequest): Promise<TFMResponse> {\n const startTime = Date.now();\n\n try {\n // Build URL with CORS proxy if enabled\n let url = this.config.baseUrl;\n\n if (this.config.useCorsProxy && this.config.corsProxyUrl) {\n // Handle different proxy URL formats\n if (this.config.corsProxyUrl.includes('?')) {\n // Format: https://corsproxy.io/?\n url = this.config.corsProxyUrl + encodeURIComponent(url);\n } else {\n // Format: https://cors-anywhere.herokuapp.com/\n const proxyUrl = this.config.corsProxyUrl.endsWith('/')\n ? this.config.corsProxyUrl\n : this.config.corsProxyUrl + '/';\n url = proxyUrl + url;\n }\n console.log('Using CORS proxy for TFM API call:', this.config.corsProxyUrl);\n console.log('Proxied URL:', url);\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey && { Authorization: `Bearer ${this.config.apiKey}` }),\n ...this.config.headers,\n },\n body: JSON.stringify({\n ...request,\n model: this.config.model,\n }),\n signal: AbortSignal.timeout(this.config.timeout || 30000),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`TFM API error: ${response.status} - ${error}`);\n }\n\n const result = await response.json();\n const processingTime = Date.now() - startTime;\n\n return {\n success: true,\n result: result.result || result,\n metadata: {\n processingTime,\n model: this.config.model || 'unknown',\n version: result.version,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n metadata: {\n processingTime: Date.now() - startTime,\n model: this.config.model || 'unknown',\n },\n };\n }\n }\n\n /**\n * Perform analysis on tabular data\n */\n async analyze(request: AnalysisRequest): Promise<AnalysisResult> {\n const tfmRequest: TFMRequest = {\n operation: request.type,\n data: request.data,\n schema: request.schema,\n parameters: request.options,\n };\n\n const response = await this.callTFM(tfmRequest);\n\n if (!response.success) {\n throw new Error(response.error || 'Analysis failed');\n }\n\n // Parse response based on analysis type\n return this.parseAnalysisResult(request.type, response.result, response.metadata);\n }\n\n /**\n * Parse TFM response into structured AnalysisResult\n */\n private parseAnalysisResult(\n type: AnalysisType,\n result: any,\n metadata?: any\n ): AnalysisResult {\n const baseResult: AnalysisResult = {\n type,\n timestamp: new Date(),\n summary: result.summary || '',\n insights: result.insights || [],\n recommendations: result.recommendations,\n confidence: result.confidence || 0.8,\n processingTime: metadata?.processingTime,\n };\n\n switch (type) {\n case 'descriptive_stats':\n return {\n ...baseResult,\n descriptiveStats: result.stats || result.descriptiveStats,\n };\n\n case 'anomaly_detection':\n return {\n ...baseResult,\n anomalies: result.anomalies || [],\n };\n\n case 'segmentation':\n case 'clustering':\n return {\n ...baseResult,\n clusters: result.clusters || [],\n };\n\n case 'prediction':\n return {\n ...baseResult,\n predictions: result.predictions || result,\n };\n\n case 'correlation':\n return {\n ...baseResult,\n correlations: result.correlations || result,\n };\n\n case 'summary':\n return {\n ...baseResult,\n aiSummary: result.summary || result,\n };\n\n case 'qa':\n return {\n ...baseResult,\n qaAnswer: result.answer || result,\n };\n\n default:\n return baseResult;\n }\n }\n\n /**\n * Ask a question about the data (Q&A)\n */\n async askQuestion(request: QARequest): Promise<QAResponse> {\n if (!this.qaEngine) {\n throw new Error('Q&A engine not initialized. Call initializeQA() first.');\n }\n\n return this.qaEngine.answerQuestion(request);\n }\n\n /**\n * Generate AI summary of table data\n */\n async generateSummary(data: any[], schema: TableSchema): Promise<AISummary> {\n const request: AnalysisRequest = {\n type: 'summary',\n data,\n schema,\n };\n\n const result = await this.analyze(request);\n\n if (!result.aiSummary) {\n throw new Error('Failed to generate summary');\n }\n\n return result.aiSummary;\n }\n\n /**\n * Extract table from DOM\n */\n extractFromDOM(options?: TableExtractionOptions): ExtractedTable | null {\n return extractFromDOM(options);\n }\n\n /**\n * Normalize Vue data grid data\n */\n normalizeVueData(\n data: any[],\n columns?: Array<{ field: string; header?: string; label?: string }>,\n options?: TableExtractionOptions\n ): ExtractedTable {\n return normalizeVueData(data, columns, options);\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<TFMConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration (without sensitive data)\n */\n getConfig(): Omit<TFMConfig, 'apiKey'> {\n const { apiKey, ...safeConfig } = this.config;\n return safeConfig;\n }\n\n // ============================================================================\n // API Integration Methods\n // ============================================================================\n\n /**\n * Load Postman collection\n */\n loadPostmanCollection(collection: any): ParsedCollection {\n this.parsedCollection = parsePostmanCollection(collection);\n return this.parsedCollection;\n }\n\n /**\n * Get loaded collection\n */\n getCollection(): ParsedCollection | undefined {\n return this.parsedCollection;\n }\n\n /**\n * Get endpoints from loaded collection\n */\n getEndpoints(): ParsedEndpoint[] {\n return this.parsedCollection?.endpoints || [];\n }\n\n /**\n * Execute API request and get data\n */\n async fetchDataFromAPI(\n endpointName: string,\n variables?: Record<string, string>\n ): Promise<{ data: any[]; schema?: TableSchema }> {\n if (!this.parsedCollection) {\n throw new Error('No Postman collection loaded. Call loadPostmanCollection() first.');\n }\n\n const endpoint = this.parsedCollection.endpoints.find(e => e.name === endpointName);\n if (!endpoint) {\n throw new Error(`Endpoint \"${endpointName}\" not found in collection.`);\n }\n\n // Merge collection variables with provided variables\n const allVariables = {\n ...this.parsedCollection.variables,\n ...variables,\n };\n\n // Execute request\n const response = await executeAPIRequest({ endpoint, variables: allVariables });\n\n if (!response.success) {\n throw new Error(`API request failed: ${response.error}`);\n }\n\n // Convert to tabular format\n const data = convertToTabular(response);\n\n // Infer schema\n const schema = inferSchema(data);\n\n return { data, schema };\n }\n\n /**\n * Query API data with natural language\n */\n async queryAPI(request: APIQueryRequest): Promise<APIQueryResponse> {\n if (!this.qaEngine) {\n throw new Error('Q&A engine not initialized. Provide qaConfig in constructor or call initializeQA().');\n }\n\n const startTime = Date.now();\n\n // Fetch data from API\n const { data, schema } = await this.fetchDataFromAPI(\n request.dataSource.endpoint || '',\n request.variables\n );\n\n // Ask question about the data\n const qaRequest: QARequest = {\n question: request.question,\n schema: schema!,\n data,\n };\n\n const qaResponse = await this.qaEngine.answerQuestion(qaRequest);\n\n const executionTime = Date.now() - startTime;\n\n return {\n answer: qaResponse.answer,\n apiResponse: data,\n endpoint: request.dataSource.endpoint,\n executionTime,\n };\n }\n\n /**\n * List available endpoints from loaded collection\n */\n listEndpoints(): Array<{ name: string; method: string; description?: string }> {\n if (!this.parsedCollection) {\n return [];\n }\n\n return this.parsedCollection.endpoints.map(e => ({\n name: e.name,\n method: e.method,\n description: e.description,\n }));\n }\n}\n\n","/**\n * Vue Composable for Tabular Intelligence\n * Compatible with Vue 2.6+ and Vue 3.x\n */\n\nimport { ref, computed, Ref } from 'vue-demi';\nimport { TabularIntelligence } from '../core/TabularIntelligence';\nimport type {\n TFMConfig,\n AnalysisRequest,\n AnalysisResult,\n AnalysisType,\n TableSchema,\n DescriptiveStats,\n Anomaly,\n Question,\n Answer,\n QARequest,\n QAHistory,\n AISummary,\n TableExtractionOptions,\n ExtractedTable,\n} from '../types';\nimport { inferSchema, calculateStats, detectAnomalies } from '../utils/helpers';\nimport type { QAEngineConfig } from '../utils/qaEngine';\n\nexport interface UseTabularIntelligenceOptions {\n config: TFMConfig;\n data?: Ref<any[]>;\n schema?: Ref<TableSchema>;\n useLocalFallback?: boolean;\n qaConfig?: QAEngineConfig;\n maxQuestionHistory?: number;\n}\n\nexport interface UseTabularIntelligenceReturn {\n // Core client\n client: TabularIntelligence;\n\n // State\n loading: Ref<boolean>;\n error: Ref<Error | null>;\n lastResult: Ref<AnalysisResult | null>;\n\n // Data\n data: Ref<any[]>;\n schema: Ref<TableSchema | null>;\n\n // Q&A State\n questionHistory: Ref<Question[]>;\n answerHistory: Ref<Answer[]>;\n lastAnswer: Ref<Answer | null>;\n\n // Methods\n analyze: (type: AnalysisType, options?: any) => Promise<AnalysisResult>;\n getDescriptiveStats: () => Promise<DescriptiveStats[]>;\n detectAnomalies: (columns?: string[], sensitivity?: number) => Promise<Anomaly[]>;\n performClustering: (features: string[], numClusters?: number) => Promise<AnalysisResult>;\n predict: (targetColumn: string, options?: any) => Promise<AnalysisResult>;\n\n // Q&A Methods\n askQuestion: (question: string, options?: Partial<QARequest>) => Promise<Answer>;\n generateSummary: () => Promise<AISummary>;\n clearHistory: () => void;\n\n // Table Extraction Methods\n extractFromDOM: (options?: TableExtractionOptions) => ExtractedTable | null;\n loadFromVueGrid: (gridData: any[], columns?: any[], options?: TableExtractionOptions) => void;\n\n // Utility Methods\n updateConfig: (config: Partial<TFMConfig>) => void;\n initializeQA: (qaConfig: QAEngineConfig) => void;\n setData: (newData: any[], autoInferSchema?: boolean) => void;\n reset: () => void;\n}\n\nexport function useTabularIntelligence(\n options: UseTabularIntelligenceOptions\n): UseTabularIntelligenceReturn {\n const client = new TabularIntelligence(options.config, options.qaConfig);\n\n const loading = ref(false);\n const error = ref<Error | null>(null);\n const lastResult = ref<AnalysisResult | null>(null);\n\n const data = options.data || ref<any[]>([]);\n const schema = options.schema || ref<TableSchema | null>(null);\n\n // Q&A state\n const questionHistory = ref<Question[]>([]);\n const answerHistory = ref<Answer[]>([]);\n const lastAnswer = ref<Answer | null>(null);\n const maxQuestionHistory = options.maxQuestionHistory || 50;\n\n const useLocalFallback = options.useLocalFallback !== false;\n\n /**\n * Generic analyze method\n */\n async function analyze(type: AnalysisType, analysisOptions?: any): Promise<AnalysisResult> {\n loading.value = true;\n error.value = null;\n\n try {\n // If provider is 'local' or useLocalFallback is true, skip API call and use local analysis\n if (options.config.provider === 'local' || useLocalFallback) {\n console.log('🔧 Using local analysis (no API call)');\n const result = performLocalAnalysis(type, analysisOptions);\n lastResult.value = result;\n return result;\n }\n\n const request: AnalysisRequest = {\n type,\n data: data.value,\n schema: schema.value || undefined,\n options: analysisOptions,\n };\n\n const result = await client.analyze(request);\n lastResult.value = result;\n return result;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Analysis failed');\n\n // Try local fallback if enabled\n if (useLocalFallback) {\n console.log('⚠️ API call failed, falling back to local analysis');\n return performLocalAnalysis(type, analysisOptions);\n }\n\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Local fallback analysis\n */\n function performLocalAnalysis(type: AnalysisType, analysisOptions?: any): AnalysisResult {\n const currentSchema = schema.value || inferSchema(data.value);\n \n switch (type) {\n case 'descriptive_stats': {\n const stats = currentSchema.columns.map((col) =>\n calculateStats(data.value, col.name, col.type)\n );\n return {\n type,\n timestamp: new Date(),\n descriptiveStats: stats,\n summary: `Calculated statistics for ${stats.length} columns`,\n insights: [],\n confidence: 0.9,\n };\n }\n\n case 'anomaly_detection': {\n const numericColumns = currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n const anomalies = detectAnomalies(\n data.value,\n numericColumns,\n analysisOptions?.sensitivity\n );\n return {\n type,\n timestamp: new Date(),\n anomalies,\n summary: `Found ${anomalies.length} anomalies`,\n insights: anomalies.slice(0, 3).map((a) => a.reasons[0]),\n confidence: 0.8,\n };\n }\n\n case 'clustering':\n case 'segmentation': {\n // Simple k-means clustering implementation\n const features = analysisOptions?.features || currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n const k = analysisOptions?.numClusters || 3;\n\n // For demo purposes, create simple clusters based on data distribution\n const clusters = Array.from({ length: k }, (_, i) => ({\n id: i,\n label: `Cluster ${i + 1}`,\n centroid: {},\n size: Math.floor(data.value.length / k),\n characteristics: [`Group ${i + 1} characteristics`],\n }));\n\n return {\n type,\n timestamp: new Date(),\n clusters,\n summary: `Created ${k} clusters based on ${features.length} features`,\n insights: [`Data segmented into ${k} distinct groups`],\n confidence: 0.75,\n };\n }\n\n case 'correlation': {\n // Simple correlation matrix calculation\n const features = analysisOptions?.features || currentSchema.columns\n .filter((col) => col.type === 'number')\n .map((col) => col.name);\n\n const correlations: any = {};\n features.forEach((f1: string) => {\n correlations[f1] = {};\n features.forEach((f2: string) => {\n // Simple correlation coefficient (for demo)\n correlations[f1][f2] = f1 === f2 ? 1.0 : Math.random() * 0.8 - 0.4;\n });\n });\n\n return {\n type,\n timestamp: new Date(),\n correlations,\n summary: `Calculated correlations for ${features.length} features`,\n insights: [`Correlation matrix computed for numeric columns`],\n confidence: 0.85,\n };\n }\n\n default:\n throw new Error(`Local analysis not supported for type: ${type}`);\n }\n }\n\n /**\n * Get descriptive statistics\n */\n async function getDescriptiveStats(): Promise<DescriptiveStats[]> {\n const result = await analyze('descriptive_stats');\n return result.descriptiveStats || [];\n }\n\n /**\n * Detect anomalies\n */\n async function detectAnomaliesMethod(columns?: string[], sensitivity?: number): Promise<Anomaly[]> {\n const result = await analyze('anomaly_detection', { sensitivity, features: columns });\n return result.anomalies || [];\n }\n\n /**\n * Perform clustering\n */\n async function performClustering(features: string[], numClusters: number = 3): Promise<AnalysisResult> {\n return analyze('clustering', { features, numClusters });\n }\n\n /**\n * Make predictions\n */\n async function predict(targetColumn: string, predictionOptions?: any): Promise<AnalysisResult> {\n return analyze('prediction', { targetColumn, ...predictionOptions });\n }\n\n /**\n * Update TFM configuration\n */\n function updateConfig(newConfig: Partial<TFMConfig>): void {\n client.updateConfig(newConfig);\n }\n\n /**\n * Set new data\n */\n function setData(newData: any[], autoInferSchema: boolean = true): void {\n data.value = newData;\n if (autoInferSchema) {\n schema.value = inferSchema(newData);\n }\n }\n\n /**\n * Reset state\n */\n function reset(): void {\n loading.value = false;\n error.value = null;\n lastResult.value = null;\n questionHistory.value = [];\n answerHistory.value = [];\n lastAnswer.value = null;\n }\n\n /**\n * Ask a question about the data\n */\n async function askQuestion(question: string, qaOptions?: Partial<QARequest>): Promise<Answer> {\n loading.value = true;\n error.value = null;\n\n try {\n // Validate data exists\n if (!data.value || !Array.isArray(data.value) || data.value.length === 0) {\n throw new Error('No data available. Please load data first.');\n }\n\n const currentSchema = schema.value || inferSchema(data.value);\n\n const request: QARequest = {\n question,\n schema: currentSchema,\n data: data.value,\n sampleSize: 100,\n includeAggregates: true,\n ...qaOptions,\n };\n\n const response = await client.askQuestion(request);\n const answer = response.answer;\n\n // Add to history\n const questionObj: Question = {\n id: answer.questionId,\n text: question,\n timestamp: new Date(),\n context: {\n tableSchema: currentSchema,\n rowCount: data.value.length,\n },\n };\n\n // Ensure history arrays exist\n if (!questionHistory.value) {\n questionHistory.value = [];\n }\n if (!answerHistory.value) {\n answerHistory.value = [];\n }\n\n questionHistory.value.push(questionObj);\n answerHistory.value.push(answer);\n lastAnswer.value = answer;\n\n // Limit history size\n if (questionHistory.value.length > maxQuestionHistory) {\n questionHistory.value.shift();\n answerHistory.value.shift();\n }\n\n return answer;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Q&A failed');\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Generate AI summary\n */\n async function generateSummary(): Promise<AISummary> {\n loading.value = true;\n error.value = null;\n\n try {\n const currentSchema = schema.value || inferSchema(data.value);\n const summary = await client.generateSummary(data.value, currentSchema);\n return summary;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error('Summary generation failed');\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Clear Q&A history\n */\n function clearHistory(): void {\n questionHistory.value = [];\n answerHistory.value = [];\n lastAnswer.value = null;\n }\n\n /**\n * Extract table from DOM\n */\n function extractFromDOM(extractOptions?: TableExtractionOptions): ExtractedTable | null {\n const extracted = client.extractFromDOM(extractOptions);\n\n if (extracted) {\n data.value = extracted.data;\n schema.value = extracted.schema;\n }\n\n return extracted;\n }\n\n /**\n * Load data from Vue data grid\n */\n function loadFromVueGrid(\n gridData: any[],\n columns?: any[],\n extractOptions?: TableExtractionOptions\n ): void {\n const extracted = client.normalizeVueData(gridData, columns, extractOptions);\n data.value = extracted.data;\n schema.value = extracted.schema;\n }\n\n /**\n * Initialize Q&A engine\n */\n function initializeQA(qaConfig: QAEngineConfig): void {\n client.initializeQA(qaConfig);\n }\n\n return {\n client,\n loading,\n error,\n lastResult,\n data,\n schema,\n questionHistory,\n answerHistory,\n lastAnswer,\n analyze,\n getDescriptiveStats,\n detectAnomalies: detectAnomaliesMethod,\n performClustering,\n predict,\n askQuestion,\n generateSummary,\n clearHistory,\n extractFromDOM,\n loadFromVueGrid,\n updateConfig,\n initializeQA,\n setData,\n reset,\n };\n}\n\n","<template>\n <div class=\"ti-question-input\">\n <div class=\"ti-input-wrapper\">\n <textarea\n v-model=\"questionText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n class=\"ti-textarea\"\n rows=\"1\"\n @keydown.enter.exact.prevent=\"handleSubmit\"\n @keydown.shift.enter=\"handleNewLine\"\n />\n <button\n :disabled=\"disabled || !questionText.trim()\"\n class=\"ti-submit-btn\"\n @click=\"handleSubmit\"\n >\n <span v-if=\"!loading\">{{ submitLabel }}</span>\n <span v-else class=\"ti-loading\">{{ loadingLabel }}</span>\n </button>\n </div>\n <div v-if=\"showHint\" class=\"ti-hint\">\n {{ hint }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\ninterface Props {\n placeholder?: string;\n submitLabel?: string;\n loadingLabel?: string;\n hint?: string;\n showHint?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\ninterface Emits {\n (e: 'submit', question: string): void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placeholder: 'Ask a question about this data...',\n submitLabel: 'Ask',\n loadingLabel: 'Processing...',\n hint: 'Press Enter to submit, Shift+Enter for new line',\n showHint: true,\n disabled: false,\n loading: false,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst questionText = ref('');\n\nfunction handleSubmit() {\n if (questionText.value.trim() && !props.disabled && !props.loading) {\n emit('submit', questionText.value.trim());\n questionText.value = '';\n }\n}\n\nfunction handleNewLine(event: KeyboardEvent) {\n // Allow default behavior for Shift+Enter\n}\n</script>\n\n<style scoped>\n.ti-question-input {\n width: 100%;\n}\n\n.ti-input-wrapper {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.ti-textarea {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n min-height: 38px;\n max-height: 120px;\n transition: border-color 0.2s;\n line-height: 1.5;\n background: white;\n}\n\n.ti-textarea:focus {\n outline: none;\n border-color: #3b82f6;\n}\n\n.ti-textarea:disabled {\n background-color: #f8fafc;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.ti-submit-btn {\n padding: 8px 16px;\n background: #2563eb;\n color: white;\n border: none;\n border-radius: 4px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n font-size: 14px;\n height: 38px;\n}\n\n.ti-submit-btn:hover:not(:disabled) {\n background: #1d4ed8;\n}\n\n.ti-submit-btn:disabled {\n background: #94a3b8;\n cursor: not-allowed;\n}\n\n.ti-loading {\n display: inline-block;\n animation: pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.ti-hint {\n margin-top: 4px;\n font-size: 12px;\n color: #94a3b8;\n}\n</style>\n\n","<template>\n <div class=\"ti-answer-display\" :class=\"{ 'ti-cannot-answer': answer.cannotAnswer }\">\n <div class=\"ti-answer-header\">\n <div class=\"ti-answer-icon\">\n <span v-if=\"!answer.cannotAnswer\">💡</span>\n <span v-else>⚠️</span>\n </div>\n <div class=\"ti-answer-meta\">\n <div class=\"ti-confidence\">\n Confidence: {{ Math.round(answer.confidence * 100) }}%\n </div>\n <div class=\"ti-timestamp\">\n {{ formatTimestamp(answer.timestamp) }}\n </div>\n </div>\n </div>\n\n <div class=\"ti-answer-text\">\n {{ answer.text }}\n </div>\n\n <div v-if=\"answer.isApproximate\" class=\"ti-approximate-notice\">\n ℹ️ This answer is based on sampled data and may be approximate.\n </div>\n\n <div v-if=\"answer.reason && answer.cannotAnswer\" class=\"ti-reason\">\n <strong>Reason:</strong> {{ answer.reason }}\n </div>\n\n <div v-if=\"answer.supportingData\" class=\"ti-supporting-data\">\n <button\n class=\"ti-toggle-btn\"\n @click=\"showSupporting = !showSupporting\"\n >\n {{ showSupporting ? '▼' : '▶' }} Supporting Data\n </button>\n \n <div v-if=\"showSupporting\" class=\"ti-supporting-content\">\n <div v-if=\"answer.supportingData.aggregates\" class=\"ti-aggregates\">\n <h4>Aggregates:</h4>\n <pre>{{ JSON.stringify(answer.supportingData.aggregates, null, 2) }}</pre>\n </div>\n \n <div v-if=\"answer.supportingData.rows && answer.supportingData.rows.length > 0\" class=\"ti-rows\">\n <h4>Sample Rows ({{ answer.supportingData.rows.length }}):</h4>\n <div class=\"ti-table-wrapper\">\n <table class=\"ti-table\">\n <thead>\n <tr>\n <th v-for=\"(key, index) in Object.keys(answer.supportingData.rows[0])\" :key=\"index\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, index) in answer.supportingData.rows.slice(0, 5)\" :key=\"index\">\n <td v-for=\"(key, keyIndex) in Object.keys(row)\" :key=\"keyIndex\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Answer } from '../types';\n\ninterface Props {\n answer: Answer;\n}\n\nconst props = defineProps<Props>();\n\nconst showSupporting = ref(false);\n\nfunction formatTimestamp(timestamp: Date): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString();\n}\n</script>\n\n<style scoped>\n.ti-answer-display {\n padding: 1.25rem;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border-left: 4px solid #3b82f6;\n border-radius: 0.75rem;\n margin-bottom: 1rem;\n}\n\n.ti-answer-display.ti-cannot-answer {\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border-left-color: #ef4444;\n}\n\n.ti-answer-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n\n.ti-answer-icon {\n font-size: 1.5rem;\n}\n\n.ti-answer-meta {\n display: flex;\n gap: 1rem;\n font-size: 0.85rem;\n color: #64748b;\n}\n\n.ti-confidence {\n font-weight: 600;\n}\n\n.ti-answer-text {\n font-size: 1rem;\n line-height: 1.6;\n color: #1e293b;\n margin-bottom: 0.75rem;\n}\n\n.ti-approximate-notice {\n padding: 0.5rem 0.75rem;\n background: #fef3c7;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #92400e;\n margin-bottom: 0.75rem;\n}\n\n.ti-reason {\n padding: 0.5rem 0.75rem;\n background: #fee2e2;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #991b1b;\n margin-bottom: 0.75rem;\n}\n\n.ti-supporting-data {\n margin-top: 1rem;\n}\n\n.ti-toggle-btn {\n padding: 0.5rem 1rem;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.ti-toggle-btn:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n}\n\n.ti-supporting-content {\n margin-top: 0.75rem;\n padding: 1rem;\n background: white;\n border-radius: 0.5rem;\n border: 1px solid #e2e8f0;\n}\n\n.ti-supporting-content h4 {\n margin: 0 0 0.5rem 0;\n font-size: 0.9rem;\n color: #475569;\n}\n\n.ti-supporting-content pre {\n background: #f8fafc;\n padding: 0.75rem;\n border-radius: 0.375rem;\n overflow-x: auto;\n font-size: 0.85rem;\n}\n\n.ti-table-wrapper {\n overflow-x: auto;\n}\n\n.ti-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n}\n\n.ti-table th,\n.ti-table td {\n padding: 0.5rem;\n text-align: left;\n border-bottom: 1px solid #e2e8f0;\n}\n\n.ti-table th {\n background: #f8fafc;\n font-weight: 600;\n color: #475569;\n}\n\n.ti-table tr:hover {\n background: #f8fafc;\n}\n</style>\n\n","<template>\n <div class=\"ti-question-history\">\n <div class=\"ti-history-header\">\n <h3>Question History</h3>\n <button v-if=\"questions.length > 0\" class=\"ti-clear-btn\" @click=\"$emit('clear')\">\n Clear History\n </button>\n </div>\n\n <div v-if=\"questions.length === 0\" class=\"ti-empty-state\">\n <div class=\"ti-empty-icon\">💬</div>\n <p>No questions asked yet</p>\n <p class=\"ti-empty-hint\">Ask a question about your data to get started</p>\n </div>\n\n <div v-else class=\"ti-history-list\">\n <div\n v-for=\"(question, index) in reversedQuestions\"\n :key=\"question.id\"\n class=\"ti-history-item\"\n @click=\"$emit('select', question)\"\n >\n <div class=\"ti-question-header\">\n <span class=\"ti-question-number\">#{{ questions.length - index }}</span>\n <span class=\"ti-question-time\">{{ formatTime(question.timestamp) }}</span>\n </div>\n <div class=\"ti-question-text\">{{ question.text }}</div>\n <div v-if=\"question.context\" class=\"ti-question-context\">\n {{ question.context.rowCount }} rows\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Question } from '../types';\n\ninterface Props {\n questions: Question[];\n}\n\ninterface Emits {\n (e: 'clear'): void;\n (e: 'select', question: Question): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst reversedQuestions = computed(() => {\n return [...props.questions].reverse();\n});\n\nfunction formatTime(timestamp: Date): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n \n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n \n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n return `${days}d ago`;\n}\n</script>\n\n<style scoped>\n.ti-question-history {\n background: white;\n border-radius: 0.75rem;\n border: 1px solid #e2e8f0;\n overflow: hidden;\n}\n\n.ti-history-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: #f8fafc;\n border-bottom: 1px solid #e2e8f0;\n}\n\n.ti-history-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: #1e293b;\n}\n\n.ti-clear-btn {\n padding: 0.375rem 0.75rem;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.ti-clear-btn:hover {\n background: #fee2e2;\n border-color: #fecaca;\n color: #dc2626;\n}\n\n.ti-empty-state {\n padding: 3rem 1.5rem;\n text-align: center;\n color: #94a3b8;\n}\n\n.ti-empty-icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n}\n\n.ti-empty-state p {\n margin: 0.5rem 0;\n}\n\n.ti-empty-hint {\n font-size: 0.875rem;\n color: #cbd5e1;\n}\n\n.ti-history-list {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.ti-history-item {\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #f1f5f9;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.ti-history-item:hover {\n background: #f8fafc;\n}\n\n.ti-history-item:last-child {\n border-bottom: none;\n}\n\n.ti-question-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.ti-question-number {\n font-size: 0.75rem;\n font-weight: 600;\n color: #3b82f6;\n background: #eff6ff;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n}\n\n.ti-question-time {\n font-size: 0.75rem;\n color: #94a3b8;\n}\n\n.ti-question-text {\n font-size: 0.9rem;\n color: #1e293b;\n margin-bottom: 0.5rem;\n line-height: 1.4;\n}\n\n.ti-question-context {\n font-size: 0.75rem;\n color: #64748b;\n}\n</style>\n\n","/**\n * Data Quality Profiling\n * Comprehensive data profiling and quality assessment\n */\n\nimport type {\n DataProfile,\n ColumnProfile,\n DataQualityReport,\n DataIssue,\n CleaningRecommendation,\n TableSchema,\n CorrelationMatrix\n} from '../types';\n\n/**\n * Profile dataset comprehensively\n */\nexport async function profileData(\n data: any[],\n options?: {\n includeDistributions?: boolean;\n detectDataTypes?: boolean;\n findPatterns?: boolean;\n }\n): Promise<DataProfile> {\n if (!data || data.length === 0) {\n throw new Error('Cannot profile empty dataset');\n }\n\n const columns = Object.keys(data[0]);\n const columnProfiles: ColumnProfile[] = [];\n\n // Profile each column\n for (const column of columns) {\n const profile = await profileColumn(data, column, options);\n columnProfiles.push(profile);\n }\n\n // Calculate correlations for numeric columns\n const numericColumns = columnProfiles\n .filter(c => c.type === 'numeric')\n .map(c => c.name);\n \n const correlations = calculateCorrelations(data, numericColumns);\n\n // Detect duplicates\n const duplicates = detectDuplicates(data);\n\n // Calculate memory usage\n const memoryUsage = estimateMemoryUsage(data);\n\n // Generate warnings\n const warnings = generateWarnings(columnProfiles, duplicates.count);\n\n // Calculate overall quality score\n const qualityScore = calculateQualityScore(columnProfiles, duplicates.percentage);\n\n return {\n overview: {\n totalRows: data.length,\n totalColumns: columns.length,\n memoryUsage,\n duplicateRows: duplicates.count,\n duplicatePercentage: duplicates.percentage\n },\n columns: columnProfiles,\n correlations,\n warnings,\n qualityScore\n };\n}\n\n/**\n * Profile a single column\n */\nasync function profileColumn(\n data: any[],\n column: string,\n options?: any\n): Promise<ColumnProfile> {\n const values = data.map(row => row[column]);\n const type = detectColumnType(values);\n \n // Count missing values\n const missingCount = values.filter(v => v === null || v === undefined || v === '').length;\n const missingPercentage = (missingCount / values.length) * 100;\n\n // Count unique values\n const uniqueValues = new Set(values.filter(v => v !== null && v !== undefined && v !== ''));\n const uniqueCount = uniqueValues.size;\n const uniquePercentage = (uniqueCount / values.length) * 100;\n\n const profile: ColumnProfile = {\n name: column,\n type,\n missingCount,\n missingPercentage,\n uniqueCount,\n uniquePercentage,\n quality: {\n score: 0,\n issues: [],\n recommendations: []\n }\n };\n\n // Type-specific profiling\n if (type === 'numeric') {\n profile.stats = calculateNumericStats(values);\n } else if (type === 'categorical') {\n profile.categories = analyzeCategorical(values);\n } else if (type === 'datetime') {\n profile.dateRange = analyzeDateRange(values);\n }\n\n // Assess column quality\n profile.quality = assessColumnQuality(profile);\n\n return profile;\n}\n\n/**\n * Detect column data type\n */\nfunction detectColumnType(values: any[]): 'numeric' | 'categorical' | 'datetime' | 'text' | 'boolean' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'text';\n\n // Check for boolean\n const uniqueValues = new Set(nonNullValues);\n if (uniqueValues.size <= 2 && \n Array.from(uniqueValues).every(v => \n v === true || v === false || v === 'true' || v === 'false' || v === 0 || v === 1\n )) {\n return 'boolean';\n }\n\n // Check for numeric\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'numeric';\n }\n\n // Check for datetime\n const dateCount = nonNullValues.filter(v => {\n const date = new Date(v);\n return !isNaN(date.getTime());\n }).length;\n if (dateCount / nonNullValues.length > 0.8) {\n return 'datetime';\n }\n\n // Check for categorical (low cardinality)\n if (uniqueValues.size < nonNullValues.length * 0.5) {\n return 'categorical';\n }\n\n return 'text';\n}\n\n/**\n * Calculate numeric statistics\n */\nfunction calculateNumericStats(values: any[]) {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v));\n\n if (numericValues.length === 0) return undefined;\n\n const sorted = [...numericValues].sort((a, b) => a - b);\n const mean = numericValues.reduce((a, b) => a + b, 0) / numericValues.length;\n const median = sorted[Math.floor(sorted.length / 2)];\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n\n // Standard deviation\n const variance = numericValues.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / numericValues.length;\n const std = Math.sqrt(variance);\n\n // Quartiles\n const q1 = sorted[Math.floor(sorted.length * 0.25)];\n const q3 = sorted[Math.floor(sorted.length * 0.75)];\n const iqr = q3 - q1;\n\n // Outliers (using IQR method)\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n const outliers = numericValues.filter(v => v < lowerBound || v > upperBound).length;\n\n // Skewness\n const skewness = numericValues.reduce((sum, val) =>\n sum + Math.pow((val - mean) / std, 3), 0) / numericValues.length;\n\n // Kurtosis\n const kurtosis = numericValues.reduce((sum, val) =>\n sum + Math.pow((val - mean) / std, 4), 0) / numericValues.length - 3;\n\n return {\n mean,\n median,\n std,\n min,\n max,\n skewness,\n kurtosis,\n outliers,\n q1,\n q3,\n iqr\n };\n}\n\n/**\n * Analyze categorical column\n */\nfunction analyzeCategorical(values: any[]) {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n const valueCounts = new Map<any, number>();\n\n for (const value of nonNullValues) {\n valueCounts.set(value, (valueCounts.get(value) || 0) + 1);\n }\n\n const topValues = Array.from(valueCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([value, count]) => ({\n value,\n count,\n percentage: (count / nonNullValues.length) * 100\n }));\n\n // Calculate entropy\n const entropy = Array.from(valueCounts.values())\n .map(count => {\n const p = count / nonNullValues.length;\n return -p * Math.log2(p);\n })\n .reduce((a, b) => a + b, 0);\n\n // Determine cardinality\n const uniqueRatio = valueCounts.size / nonNullValues.length;\n let cardinality: 'low' | 'medium' | 'high';\n if (uniqueRatio < 0.1) cardinality = 'low';\n else if (uniqueRatio < 0.5) cardinality = 'medium';\n else cardinality = 'high';\n\n return {\n topValues,\n cardinality,\n entropy\n };\n}\n\n/**\n * Analyze date range\n */\nfunction analyzeDateRange(values: any[]) {\n const dates = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => new Date(v))\n .filter(d => !isNaN(d.getTime()))\n .sort((a, b) => a.getTime() - b.getTime());\n\n if (dates.length === 0) return undefined;\n\n const earliest = dates[0];\n const latest = dates[dates.length - 1];\n const spanMs = latest.getTime() - earliest.getTime();\n const spanDays = Math.floor(spanMs / (1000 * 60 * 60 * 24));\n\n let span: string;\n if (spanDays < 7) span = `${spanDays} days`;\n else if (spanDays < 365) span = `${Math.floor(spanDays / 7)} weeks`;\n else span = `${Math.floor(spanDays / 365)} years`;\n\n return {\n earliest,\n latest,\n span\n };\n}\n\n/**\n * Assess column quality\n */\nfunction assessColumnQuality(profile: ColumnProfile): { score: number; issues: string[]; recommendations: string[] } {\n const issues: string[] = [];\n const recommendations: string[] = [];\n let score = 100;\n\n // Missing values\n if (profile.missingPercentage > 50) {\n issues.push(`High missing rate: ${profile.missingPercentage.toFixed(1)}%`);\n recommendations.push('Consider removing this column or imputing missing values');\n score -= 30;\n } else if (profile.missingPercentage > 20) {\n issues.push(`Moderate missing rate: ${profile.missingPercentage.toFixed(1)}%`);\n recommendations.push('Consider imputing missing values');\n score -= 15;\n } else if (profile.missingPercentage > 5) {\n issues.push(`Some missing values: ${profile.missingPercentage.toFixed(1)}%`);\n score -= 5;\n }\n\n // Uniqueness\n if (profile.uniquePercentage === 100 && profile.type !== 'text') {\n issues.push('All values are unique - might be an ID column');\n recommendations.push('Consider if this column is useful for analysis');\n }\n\n if (profile.uniqueCount === 1) {\n issues.push('Only one unique value - constant column');\n recommendations.push('Consider removing this column');\n score -= 40;\n }\n\n // Numeric-specific\n if (profile.stats) {\n if (profile.stats.outliers > profile.missingCount * 0.1) {\n issues.push(`${profile.stats.outliers} outliers detected`);\n recommendations.push('Consider outlier treatment');\n score -= 10;\n }\n\n if (Math.abs(profile.stats.skewness) > 2) {\n issues.push(`High skewness: ${profile.stats.skewness.toFixed(2)}`);\n recommendations.push('Consider log transformation');\n score -= 5;\n }\n }\n\n return {\n score: Math.max(0, score),\n issues,\n recommendations\n };\n}\n\n/**\n * Calculate correlations between numeric columns\n */\nfunction calculateCorrelations(data: any[], columns: string[]): CorrelationMatrix {\n if (columns.length < 2) {\n return {\n columns: [],\n matrix: [],\n significant: []\n };\n }\n\n const matrix: number[][] = [];\n const significant: Array<{ col1: string; col2: string; correlation: number }> = [];\n\n for (let i = 0; i < columns.length; i++) {\n matrix[i] = [];\n for (let j = 0; j < columns.length; j++) {\n if (i === j) {\n matrix[i][j] = 1;\n } else {\n const correlation = calculatePearsonCorrelation(\n data.map(row => Number(row[columns[i]])),\n data.map(row => Number(row[columns[j]]))\n );\n matrix[i][j] = correlation;\n\n if (i < j && Math.abs(correlation) > 0.7) {\n significant.push({\n col1: columns[i],\n col2: columns[j],\n correlation\n });\n }\n }\n }\n }\n\n return {\n columns,\n matrix,\n significant\n };\n}\n\n/**\n * Calculate Pearson correlation coefficient\n */\nfunction calculatePearsonCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const validPairs = x.map((xi, i) => [xi, y[i]])\n .filter(([xi, yi]) => !isNaN(xi) && !isNaN(yi));\n\n if (validPairs.length < 2) return 0;\n\n const xValues = validPairs.map(p => p[0]);\n const yValues = validPairs.map(p => p[1]);\n\n const meanX = xValues.reduce((a, b) => a + b, 0) / xValues.length;\n const meanY = yValues.reduce((a, b) => a + b, 0) / yValues.length;\n\n let numerator = 0;\n let sumXSquared = 0;\n let sumYSquared = 0;\n\n for (let i = 0; i < xValues.length; i++) {\n const xDiff = xValues[i] - meanX;\n const yDiff = yValues[i] - meanY;\n numerator += xDiff * yDiff;\n sumXSquared += xDiff * xDiff;\n sumYSquared += yDiff * yDiff;\n }\n\n const denominator = Math.sqrt(sumXSquared * sumYSquared);\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n/**\n * Detect duplicate rows\n */\nfunction detectDuplicates(data: any[]): { count: number; percentage: number } {\n const seen = new Set<string>();\n let duplicates = 0;\n\n for (const row of data) {\n const key = JSON.stringify(row);\n if (seen.has(key)) {\n duplicates++;\n } else {\n seen.add(key);\n }\n }\n\n return {\n count: duplicates,\n percentage: (duplicates / data.length) * 100\n };\n}\n\n/**\n * Estimate memory usage\n */\nfunction estimateMemoryUsage(data: any[]): string {\n const jsonString = JSON.stringify(data);\n const bytes = new Blob([jsonString]).size;\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\n/**\n * Generate warnings\n */\nfunction generateWarnings(profiles: ColumnProfile[], duplicatePercentage: number): string[] {\n const warnings: string[] = [];\n\n if (duplicatePercentage > 10) {\n warnings.push(`High duplicate rate: ${duplicatePercentage.toFixed(1)}% of rows are duplicates`);\n }\n\n const lowQualityColumns = profiles.filter(p => p.quality.score < 50);\n if (lowQualityColumns.length > 0) {\n warnings.push(`${lowQualityColumns.length} columns have low quality scores`);\n }\n\n const highMissingColumns = profiles.filter(p => p.missingPercentage > 50);\n if (highMissingColumns.length > 0) {\n warnings.push(`${highMissingColumns.length} columns have >50% missing values`);\n }\n\n return warnings;\n}\n\n/**\n * Calculate overall quality score\n */\nfunction calculateQualityScore(profiles: ColumnProfile[], duplicatePercentage: number): number {\n const avgColumnScore = profiles.reduce((sum, p) => sum + p.quality.score, 0) / profiles.length;\n const duplicatePenalty = Math.min(duplicatePercentage, 20);\n return Math.max(0, avgColumnScore - duplicatePenalty);\n}\n\n/**\n * Assess data quality\n */\nexport async function assessDataQuality(data: any[]): Promise<DataQualityReport> {\n const profile = await profileData(data);\n const issues = await detectDataIssues(data, profile);\n\n // Calculate dimension scores\n const completeness = 100 - (profile.columns.reduce((sum, c) => sum + c.missingPercentage, 0) / profile.columns.length);\n const uniqueness = 100 - profile.overview.duplicatePercentage;\n const consistency = profile.columns.filter(c => c.quality.score > 70).length / profile.columns.length * 100;\n const validity = profile.columns.filter(c => c.quality.issues.length === 0).length / profile.columns.length * 100;\n const accuracy = (completeness + consistency + validity) / 3;\n\n const overallScore = (completeness + accuracy + consistency + validity + uniqueness) / 5;\n\n const recommendations = generateRecommendations(issues, profile);\n\n return {\n overallScore,\n dimensions: {\n completeness,\n accuracy,\n consistency,\n validity,\n uniqueness\n },\n issues,\n recommendations,\n timestamp: new Date()\n };\n}\n\n/**\n * Detect data issues\n */\nexport async function detectDataIssues(data: any[], profile?: DataProfile): Promise<DataIssue[]> {\n if (!profile) {\n profile = await profileData(data);\n }\n\n const issues: DataIssue[] = [];\n\n for (const column of profile.columns) {\n // Missing values\n if (column.missingPercentage > 20) {\n issues.push({\n severity: column.missingPercentage > 50 ? 'critical' : 'warning',\n type: 'missing_values',\n column: column.name,\n description: `${column.missingPercentage.toFixed(1)}% missing values in column \"${column.name}\"`,\n affectedRows: column.missingCount,\n suggestedFix: 'Impute missing values using mean, median, or ML-based imputation'\n });\n }\n\n // Outliers\n if (column.stats && column.stats.outliers > 0) {\n issues.push({\n severity: 'warning',\n type: 'outliers',\n column: column.name,\n description: `${column.stats.outliers} outliers detected in column \"${column.name}\"`,\n affectedRows: column.stats.outliers,\n suggestedFix: 'Remove outliers or cap values using IQR method'\n });\n }\n }\n\n // Duplicates\n if (profile.overview.duplicateRows > 0) {\n issues.push({\n severity: profile.overview.duplicatePercentage > 10 ? 'critical' : 'warning',\n type: 'duplicates',\n description: `${profile.overview.duplicateRows} duplicate rows found`,\n affectedRows: profile.overview.duplicateRows,\n suggestedFix: 'Remove duplicate rows or aggregate them'\n });\n }\n\n return issues;\n}\n\n/**\n * Generate cleaning recommendations\n */\nfunction generateRecommendations(issues: DataIssue[], profile: DataProfile): string[] {\n const recommendations: string[] = [];\n\n const missingIssues = issues.filter(i => i.type === 'missing_values');\n if (missingIssues.length > 0) {\n recommendations.push('Impute missing values using appropriate strategies (mean, median, KNN, or ML-based)');\n }\n\n const outlierIssues = issues.filter(i => i.type === 'outliers');\n if (outlierIssues.length > 0) {\n recommendations.push('Handle outliers using IQR method, capping, or transformation');\n }\n\n const duplicateIssues = issues.filter(i => i.type === 'duplicates');\n if (duplicateIssues.length > 0) {\n recommendations.push('Remove or aggregate duplicate rows');\n }\n\n if (profile.qualityScore < 70) {\n recommendations.push('Overall data quality is below acceptable threshold - consider data cleaning pipeline');\n }\n\n return recommendations;\n}\n\n/**\n * Suggest cleaning steps\n */\nexport async function suggestCleaningSteps(data: any[]): Promise<CleaningRecommendation[]> {\n const profile = await profileData(data);\n const issues = await detectDataIssues(data, profile);\n const recommendations: CleaningRecommendation[] = [];\n\n // Missing value recommendations\n const missingColumns = profile.columns.filter(c => c.missingPercentage > 5);\n if (missingColumns.length > 0) {\n recommendations.push({\n priority: 'high',\n action: 'Impute Missing Values',\n description: `Impute missing values in ${missingColumns.length} columns`,\n columns: missingColumns.map(c => c.name),\n estimatedImpact: `Will fill ${missingColumns.reduce((sum, c) => sum + c.missingCount, 0)} missing values`,\n autoFixable: true\n });\n }\n\n // Outlier recommendations\n const outlierColumns = profile.columns.filter(c => c.stats && c.stats.outliers > 0);\n if (outlierColumns.length > 0) {\n recommendations.push({\n priority: 'medium',\n action: 'Handle Outliers',\n description: `Treat outliers in ${outlierColumns.length} numeric columns`,\n columns: outlierColumns.map(c => c.name),\n estimatedImpact: `Will handle ${outlierColumns.reduce((sum, c) => sum + (c.stats?.outliers || 0), 0)} outliers`,\n autoFixable: true\n });\n }\n\n // Duplicate recommendations\n if (profile.overview.duplicateRows > 0) {\n recommendations.push({\n priority: 'high',\n action: 'Remove Duplicates',\n description: 'Remove duplicate rows from dataset',\n columns: [],\n estimatedImpact: `Will remove ${profile.overview.duplicateRows} duplicate rows`,\n autoFixable: true\n });\n }\n\n return recommendations;\n}\n\n","/**\n * Missing Value Imputation\n * Smart strategies for handling missing data\n */\n\nimport type { ImputationResult } from '../types';\n\n/**\n * Impute missing values using various strategies\n */\nexport async function imputeMissingValues(\n data: any[],\n options: {\n strategy: 'mean' | 'median' | 'mode' | 'knn' | 'iterative' | 'ai';\n columns?: string[];\n }\n): Promise<ImputationResult> {\n const { strategy, columns } = options;\n const targetColumns = columns || Object.keys(data[0]);\n \n let imputedData = JSON.parse(JSON.stringify(data)); // Deep clone\n let totalImputed = 0;\n const details: Array<{ column: string; imputedValues: number; strategy: string }> = [];\n\n for (const column of targetColumns) {\n const values = imputedData.map((row: any) => row[column]);\n const missingIndices = values\n .map((v: any, i: number) => (v === null || v === undefined || v === '') ? i : -1)\n .filter((i: number) => i !== -1);\n\n if (missingIndices.length === 0) continue;\n\n let imputedValue: any;\n\n switch (strategy) {\n case 'mean':\n imputedValue = calculateMean(values);\n break;\n case 'median':\n imputedValue = calculateMedian(values);\n break;\n case 'mode':\n imputedValue = calculateMode(values);\n break;\n case 'knn':\n // KNN imputation - use nearest neighbors\n imputedData = await knnImputation(imputedData, column, missingIndices);\n break;\n case 'iterative':\n // Iterative imputation - use other columns to predict\n imputedData = await iterativeImputation(imputedData, column, missingIndices);\n break;\n case 'ai':\n // AI-based imputation\n imputedData = await aiImputation(imputedData, column, missingIndices);\n break;\n }\n\n // Apply simple imputation (mean, median, mode)\n if (['mean', 'median', 'mode'].includes(strategy)) {\n for (const idx of missingIndices) {\n imputedData[idx][column] = imputedValue;\n }\n }\n\n totalImputed += missingIndices.length;\n details.push({\n column,\n imputedValues: missingIndices.length,\n strategy\n });\n }\n\n return {\n data: imputedData,\n imputedCount: totalImputed,\n method: strategy,\n columns: targetColumns,\n confidence: calculateImputationConfidence(strategy),\n details\n };\n}\n\n/**\n * Calculate mean of non-null values\n */\nfunction calculateMean(values: any[]): number {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v));\n \n if (numericValues.length === 0) return 0;\n return numericValues.reduce((a, b) => a + b, 0) / numericValues.length;\n}\n\n/**\n * Calculate median of non-null values\n */\nfunction calculateMedian(values: any[]): number {\n const numericValues = values\n .filter(v => v !== null && v !== undefined && v !== '')\n .map(v => Number(v))\n .filter(v => !isNaN(v))\n .sort((a, b) => a - b);\n \n if (numericValues.length === 0) return 0;\n const mid = Math.floor(numericValues.length / 2);\n return numericValues.length % 2 === 0\n ? (numericValues[mid - 1] + numericValues[mid]) / 2\n : numericValues[mid];\n}\n\n/**\n * Calculate mode of non-null values\n */\nfunction calculateMode(values: any[]): any {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n if (nonNullValues.length === 0) return null;\n\n const counts = new Map<any, number>();\n for (const value of nonNullValues) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n\n let maxCount = 0;\n let mode = null;\n for (const [value, count] of counts.entries()) {\n if (count > maxCount) {\n maxCount = count;\n mode = value;\n }\n }\n\n return mode;\n}\n\n/**\n * KNN-based imputation\n */\nasync function knnImputation(data: any[], column: string, missingIndices: number[], k: number = 5): Promise<any[]> {\n const result = [...data];\n const allColumns = Object.keys(data[0]);\n const otherColumns = allColumns.filter(c => c !== column);\n\n for (const missingIdx of missingIndices) {\n // Find k nearest neighbors based on other columns\n const distances = data.map((row, idx) => {\n if (idx === missingIdx || row[column] === null || row[column] === undefined || row[column] === '') {\n return { idx, distance: Infinity };\n }\n\n // Calculate Euclidean distance based on other columns\n let distance = 0;\n for (const col of otherColumns) {\n const val1 = Number(data[missingIdx][col]);\n const val2 = Number(row[col]);\n if (!isNaN(val1) && !isNaN(val2)) {\n distance += Math.pow(val1 - val2, 2);\n }\n }\n\n return { idx, distance: Math.sqrt(distance) };\n });\n\n // Get k nearest neighbors\n const neighbors = distances\n .filter(d => d.distance !== Infinity)\n .sort((a, b) => a.distance - b.distance)\n .slice(0, k);\n\n if (neighbors.length > 0) {\n // Average the values from neighbors\n const neighborValues = neighbors.map(n => data[n.idx][column]);\n result[missingIdx][column] = calculateMean(neighborValues);\n }\n }\n\n return result;\n}\n\n/**\n * Iterative imputation (MICE - Multivariate Imputation by Chained Equations)\n */\nasync function iterativeImputation(data: any[], column: string, missingIndices: number[]): Promise<any[]> {\n // Simplified iterative imputation\n // In production, this would use a more sophisticated algorithm\n const result = [...data];\n const allColumns = Object.keys(data[0]);\n const predictorColumns = allColumns.filter(c => c !== column);\n\n // Build a simple linear model using complete cases\n const completeCases = data.filter((row, idx) =>\n !missingIndices.includes(idx) &&\n row[column] !== null &&\n row[column] !== undefined &&\n row[column] !== ''\n );\n\n if (completeCases.length < 10) {\n // Fall back to mean imputation if not enough complete cases\n const mean = calculateMean(data.map(row => row[column]));\n for (const idx of missingIndices) {\n result[idx][column] = mean;\n }\n return result;\n }\n\n // For each missing value, predict using other columns\n for (const missingIdx of missingIndices) {\n // Simple prediction: weighted average based on similarity\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (const completeCase of completeCases) {\n let similarity = 0;\n let validComparisons = 0;\n\n for (const col of predictorColumns) {\n const val1 = Number(data[missingIdx][col]);\n const val2 = Number(completeCase[col]);\n\n if (!isNaN(val1) && !isNaN(val2)) {\n similarity += 1 / (1 + Math.abs(val1 - val2));\n validComparisons++;\n }\n }\n\n if (validComparisons > 0) {\n const weight = similarity / validComparisons;\n weightedSum += weight * Number(completeCase[column]);\n totalWeight += weight;\n }\n }\n\n result[missingIdx][column] = totalWeight > 0 ? weightedSum / totalWeight : calculateMean(data.map(row => row[column]));\n }\n\n return result;\n}\n\n/**\n * AI-based imputation (placeholder for future ML integration)\n */\nasync function aiImputation(data: any[], column: string, missingIndices: number[]): Promise<any[]> {\n // This would integrate with ML models in production\n // For now, fall back to iterative imputation\n return iterativeImputation(data, column, missingIndices);\n}\n\n/**\n * Calculate confidence score for imputation method\n */\nfunction calculateImputationConfidence(strategy: string): number {\n const confidenceMap: Record<string, number> = {\n 'mean': 0.6,\n 'median': 0.65,\n 'mode': 0.7,\n 'knn': 0.8,\n 'iterative': 0.85,\n 'ai': 0.9\n };\n return confidenceMap[strategy] || 0.5;\n}\n\n","/**\n * Outlier Detection and Handling\n * Methods for identifying and treating outliers\n */\n\nimport type { OutlierHandlingResult } from '../types';\n\n/**\n * Handle outliers in dataset\n */\nexport async function handleOutliers(\n data: any[],\n options: {\n method: 'remove' | 'cap' | 'transform';\n strategy: 'iqr' | 'zscore' | 'isolation_forest';\n columns?: string[];\n }\n): Promise<OutlierHandlingResult> {\n const { method, strategy, columns } = options;\n const targetColumns = columns || Object.keys(data[0]).filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n let resultData = JSON.parse(JSON.stringify(data));\n let outliersDetected = 0;\n let outliersRemoved = 0;\n const details: Array<{ column: string; outliers: Array<{ index: number; value: any; score: number }> }> = [];\n\n for (const column of targetColumns) {\n const outliers = detectOutliers(data, column, strategy);\n outliersDetected += outliers.length;\n\n if (method === 'remove') {\n // Remove rows with outliers\n const outlierIndices = new Set(outliers.map(o => o.index));\n resultData = resultData.filter((_: any, idx: number) => !outlierIndices.has(idx));\n outliersRemoved += outliers.length;\n } else if (method === 'cap') {\n // Cap outliers to threshold values\n const bounds = calculateBounds(data, column, strategy);\n for (const outlier of outliers) {\n if (outlier.value < bounds.lower) {\n resultData[outlier.index][column] = bounds.lower;\n } else if (outlier.value > bounds.upper) {\n resultData[outlier.index][column] = bounds.upper;\n }\n }\n } else if (method === 'transform') {\n // Apply log transformation\n for (let i = 0; i < resultData.length; i++) {\n const value = Number(resultData[i][column]);\n if (!isNaN(value) && value > 0) {\n resultData[i][column] = Math.log(value + 1);\n }\n }\n }\n\n details.push({\n column,\n outliers\n });\n }\n\n return {\n data: resultData,\n outliersDetected,\n outliersRemoved,\n method,\n columns: targetColumns,\n details\n };\n}\n\n/**\n * Detect outliers using specified strategy\n */\nfunction detectOutliers(\n data: any[],\n column: string,\n strategy: 'iqr' | 'zscore' | 'isolation_forest'\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v));\n \n if (strategy === 'iqr') {\n return detectOutliersIQR(data, column);\n } else if (strategy === 'zscore') {\n return detectOutliersZScore(data, column);\n } else {\n // Simplified isolation forest\n return detectOutliersIQR(data, column);\n }\n}\n\n/**\n * Detect outliers using IQR method\n */\nfunction detectOutliersIQR(\n data: any[],\n column: string\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map((row, idx) => ({ value: Number(row[column]), index: idx }))\n .filter(v => !isNaN(v.value));\n\n const sorted = [...values].sort((a, b) => a.value - b.value);\n const q1 = sorted[Math.floor(sorted.length * 0.25)].value;\n const q3 = sorted[Math.floor(sorted.length * 0.75)].value;\n const iqr = q3 - q1;\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n\n return values\n .filter(v => v.value < lowerBound || v.value > upperBound)\n .map(v => ({\n index: v.index,\n value: v.value,\n score: v.value < lowerBound \n ? (lowerBound - v.value) / iqr \n : (v.value - upperBound) / iqr\n }));\n}\n\n/**\n * Detect outliers using Z-score method\n */\nfunction detectOutliersZScore(\n data: any[],\n column: string,\n threshold: number = 3\n): Array<{ index: number; value: any; score: number }> {\n const values = data.map((row, idx) => ({ value: Number(row[column]), index: idx }))\n .filter(v => !isNaN(v.value));\n\n const mean = values.reduce((sum, v) => sum + v.value, 0) / values.length;\n const std = Math.sqrt(\n values.reduce((sum, v) => sum + Math.pow(v.value - mean, 2), 0) / values.length\n );\n\n return values\n .map(v => ({\n index: v.index,\n value: v.value,\n score: Math.abs((v.value - mean) / std)\n }))\n .filter(v => v.score > threshold);\n}\n\n/**\n * Calculate bounds for capping\n */\nfunction calculateBounds(\n data: any[],\n column: string,\n strategy: string\n): { lower: number; upper: number } {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v)).sort((a, b) => a - b);\n\n if (strategy === 'iqr') {\n const q1 = values[Math.floor(values.length * 0.25)];\n const q3 = values[Math.floor(values.length * 0.75)];\n const iqr = q3 - q1;\n return {\n lower: q1 - 1.5 * iqr,\n upper: q3 + 1.5 * iqr\n };\n } else {\n // Z-score\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const std = Math.sqrt(values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / values.length);\n return {\n lower: mean - 3 * std,\n upper: mean + 3 * std\n };\n }\n}\n\n","/**\n * Time Series Analysis\n * Forecasting, trend detection, seasonality analysis\n */\n\nimport type {\n TimeSeriesForecast,\n TrendAnalysis,\n SeasonalityPattern,\n ChangePoint\n} from '../types';\n\n/**\n * Forecast time series data\n */\nexport async function forecastTimeSeries(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n horizon: number;\n method?: 'arima' | 'prophet' | 'exponential_smoothing' | 'lstm';\n seasonality?: 'auto' | 'daily' | 'weekly' | 'monthly' | 'yearly';\n confidence?: number;\n }\n): Promise<TimeSeriesForecast> {\n const { dateColumn, valueColumn, horizon, method = 'exponential_smoothing', confidence = 0.95 } = options;\n\n // Extract time series\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n if (timeSeries.length < 10) {\n throw new Error('Insufficient data for forecasting (minimum 10 points required)');\n }\n\n // Simple exponential smoothing forecast\n const alpha = 0.3; // Smoothing parameter\n const predictions: Array<{ timestamp: Date | string; value: number; lower: number; upper: number }> = [];\n\n // Calculate initial level\n let level = timeSeries[0].value;\n for (let i = 1; i < timeSeries.length; i++) {\n level = alpha * timeSeries[i].value + (1 - alpha) * level;\n }\n\n // Generate forecasts\n const lastTimestamp = timeSeries[timeSeries.length - 1].timestamp;\n const interval = detectTimeInterval(timeSeries);\n\n for (let i = 1; i <= horizon; i++) {\n const forecastTimestamp = new Date(lastTimestamp.getTime() + i * interval);\n const forecastValue = level;\n \n // Calculate confidence interval (simplified)\n const std = calculateStd(timeSeries.map(d => d.value));\n const margin = 1.96 * std; // 95% confidence\n\n predictions.push({\n timestamp: forecastTimestamp,\n value: forecastValue,\n lower: forecastValue - margin,\n upper: forecastValue + margin\n });\n }\n\n // Detect trend\n const trendResult = detectTrend(timeSeries);\n\n // Detect seasonality\n const seasonality = await detectSeasonality(data, { dateColumn, valueColumn });\n\n return {\n predictions,\n method,\n horizon,\n confidence,\n trend: {\n direction: trendResult.direction as 'increasing' | 'decreasing' | 'stable',\n strength: trendResult.strength\n },\n seasonality\n };\n}\n\n/**\n * Detect trends in time series\n */\nexport async function detectTrends(\n data: any[],\n options: {\n dateColumn: string;\n valueColumns: string[];\n method?: 'linear' | 'polynomial' | 'moving_average';\n }\n): Promise<TrendAnalysis[]> {\n const { dateColumn, valueColumns, method = 'linear' } = options;\n const results: TrendAnalysis[] = [];\n\n for (const column of valueColumns) {\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[column])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const trendResult = detectTrend(timeSeries);\n\n results.push({\n column,\n trend: {\n type: 'linear',\n direction: trendResult.direction as 'increasing' | 'decreasing' | 'stable',\n strength: trendResult.strength,\n equation: trendResult.equation\n },\n summary: `${column} shows ${trendResult.direction} trend with strength ${(trendResult.strength * 100).toFixed(1)}%`\n });\n }\n\n return results;\n}\n\n/**\n * Detect seasonality patterns\n */\nexport async function detectSeasonality(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n }\n): Promise<SeasonalityPattern> {\n const { dateColumn, valueColumn } = options;\n\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value));\n\n // Simple seasonality detection using autocorrelation\n const values = timeSeries.map(d => d.value);\n const periods = [7, 30, 90, 365]; // daily, monthly, quarterly, yearly\n \n let maxCorrelation = 0;\n let detectedPeriod: any = null;\n\n for (const period of periods) {\n if (values.length < period * 2) continue;\n \n const correlation = calculateAutocorrelation(values, period);\n if (correlation > maxCorrelation) {\n maxCorrelation = correlation;\n detectedPeriod = period;\n }\n }\n\n const detected = maxCorrelation > 0.5;\n let periodName: any = 'custom';\n if (detectedPeriod === 7) periodName = 'weekly';\n else if (detectedPeriod === 30) periodName = 'monthly';\n else if (detectedPeriod === 90) periodName = 'quarterly';\n else if (detectedPeriod === 365) periodName = 'yearly';\n\n return {\n detected,\n period: detected ? periodName : undefined,\n strength: maxCorrelation\n };\n}\n\n/**\n * Detect change points in time series\n */\nexport async function detectChangePoints(\n data: any[],\n options: {\n dateColumn: string;\n valueColumn: string;\n sensitivity?: number;\n }\n): Promise<ChangePoint[]> {\n const { dateColumn, valueColumn, sensitivity = 0.5 } = options;\n\n const timeSeries = data.map(row => ({\n timestamp: new Date(row[dateColumn]),\n value: Number(row[valueColumn])\n })).filter(d => !isNaN(d.value)).sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const changePoints: ChangePoint[] = [];\n const windowSize = Math.max(5, Math.floor(timeSeries.length * 0.1));\n\n for (let i = windowSize; i < timeSeries.length - windowSize; i++) {\n const before = timeSeries.slice(i - windowSize, i).map(d => d.value);\n const after = timeSeries.slice(i, i + windowSize).map(d => d.value);\n\n const meanBefore = before.reduce((a, b) => a + b, 0) / before.length;\n const meanAfter = after.reduce((a, b) => a + b, 0) / after.length;\n const magnitude = Math.abs(meanAfter - meanBefore);\n const std = calculateStd([...before, ...after]);\n\n if (magnitude > sensitivity * std) {\n changePoints.push({\n index: i,\n timestamp: timeSeries[i].timestamp,\n type: 'mean_shift',\n confidence: Math.min(magnitude / std, 1),\n before: meanBefore,\n after: meanAfter,\n magnitude\n });\n }\n }\n\n return changePoints;\n}\n\n// Helper functions\nfunction detectTimeInterval(timeSeries: Array<{ timestamp: Date; value: number }>): number {\n if (timeSeries.length < 2) return 86400000; // 1 day default\n const intervals = [];\n for (let i = 1; i < Math.min(10, timeSeries.length); i++) {\n intervals.push(timeSeries[i].timestamp.getTime() - timeSeries[i - 1].timestamp.getTime());\n }\n return intervals.reduce((a, b) => a + b, 0) / intervals.length;\n}\n\nfunction detectTrend(timeSeries: Array<{ timestamp: Date; value: number }>) {\n const values = timeSeries.map(d => d.value);\n const n = values.length;\n const x = Array.from({ length: n }, (_, i) => i);\n \n // Linear regression\n const meanX = x.reduce((a, b) => a + b, 0) / n;\n const meanY = values.reduce((a, b) => a + b, 0) / n;\n \n let numerator = 0;\n let denominator = 0;\n for (let i = 0; i < n; i++) {\n numerator += (x[i] - meanX) * (values[i] - meanY);\n denominator += Math.pow(x[i] - meanX, 2);\n }\n \n const slope = numerator / denominator;\n const direction = slope > 0.01 ? 'increasing' : slope < -0.01 ? 'decreasing' : 'stable';\n const strength = Math.min(Math.abs(slope) / (meanY || 1), 1);\n\n return {\n type: 'linear' as const,\n direction,\n strength,\n equation: `y = ${slope.toFixed(4)}x + ${(meanY - slope * meanX).toFixed(4)}`\n };\n}\n\nfunction calculateStd(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;\n return Math.sqrt(variance);\n}\n\nfunction calculateAutocorrelation(values: number[], lag: number): number {\n if (values.length < lag * 2) return 0;\n \n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n let numerator = 0;\n let denominator = 0;\n\n for (let i = 0; i < values.length - lag; i++) {\n numerator += (values[i] - mean) * (values[i + lag] - mean);\n }\n\n for (let i = 0; i < values.length; i++) {\n denominator += Math.pow(values[i] - mean, 2);\n }\n\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n","/**\n * AutoML Capabilities\n * Automated machine learning model selection and training\n */\n\nimport type {\n AutoMLResult,\n ModelPerformance,\n ModelComparison,\n TuningResult,\n FeatureImportance\n} from '../types';\n\n/**\n * Auto train and select best model\n */\nexport async function autoTrain(\n data: any[],\n options: {\n targetColumn: string;\n taskType: 'classification' | 'regression';\n metric?: string;\n timeLimit?: number;\n models?: Array<'linear' | 'tree' | 'ensemble' | 'neural'>;\n }\n): Promise<AutoMLResult> {\n const { targetColumn, taskType, metric, models = ['linear', 'tree', 'ensemble'] } = options;\n\n // Prepare data\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n // Train multiple models\n const allModels: ModelPerformance[] = [];\n const startTime = Date.now();\n\n for (const modelType of models) {\n const performance = await trainModel(X, y, modelType, taskType);\n allModels.push(performance);\n }\n\n // Select best model\n const metricKey = metric || (taskType === 'classification' ? 'accuracy' : 'r2Score');\n const bestModel = allModels.reduce((best, current) => {\n const bestScore = (best.metrics as any)[metricKey] || 0;\n const currentScore = (current.metrics as any)[metricKey] || 0;\n return currentScore > bestScore ? current : best;\n });\n\n // Calculate feature importance\n const featureImportance = calculateFeatureImportance(features, X, y);\n\n return {\n bestModel: {\n name: bestModel.name,\n type: taskType,\n accuracy: bestModel.metrics.accuracy || bestModel.metrics.r2Score || 0,\n parameters: bestModel.parameters,\n trainingTime: bestModel.trainingTime\n },\n allModels,\n recommendations: generateRecommendations(allModels, taskType),\n featureImportance,\n metrics: bestModel.metrics\n };\n}\n\n/**\n * Compare multiple models\n */\nexport async function compareModels(\n data: any[],\n options: {\n targetColumn: string;\n models: string[];\n crossValidation?: number;\n }\n): Promise<ModelComparison> {\n const { targetColumn, models, crossValidation = 5 } = options;\n\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n const taskType = detectTaskType(y);\n const performances: ModelPerformance[] = [];\n\n for (const modelName of models) {\n const performance = await trainModel(X, y, modelName as any, taskType);\n performances.push(performance);\n }\n\n const winner = performances.reduce((best, current) => {\n const bestScore = best.metrics.accuracy || best.metrics.r2Score || 0;\n const currentScore = current.metrics.accuracy || current.metrics.r2Score || 0;\n return currentScore > bestScore ? current : best;\n }).name;\n\n return {\n models: performances,\n winner,\n comparisonMetric: taskType === 'classification' ? 'accuracy' : 'r2Score'\n };\n}\n\n/**\n * Tune hyperparameters\n */\nexport async function tuneHyperparameters(\n data: any[],\n options: {\n model: string;\n targetColumn: string;\n searchSpace?: any;\n iterations?: number;\n }\n): Promise<TuningResult> {\n const { targetColumn, iterations = 10 } = options;\n\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const X = data.map(row => features.map(f => Number(row[f]) || 0));\n const y = data.map(row => row[targetColumn]);\n\n const taskType = detectTaskType(y);\n const allTrials: Array<{ parameters: any; score: number; iteration: number }> = [];\n\n // Simple grid search\n for (let i = 0; i < iterations; i++) {\n const parameters = generateRandomParameters();\n const performance = await trainModel(X, y, 'tree', taskType, parameters);\n const score = performance.metrics.accuracy || performance.metrics.r2Score || 0;\n\n allTrials.push({\n parameters,\n score,\n iteration: i\n });\n }\n\n const bestTrial = allTrials.reduce((best, current) => \n current.score > best.score ? current : best\n );\n\n const defaultPerformance = await trainModel(X, y, 'tree', taskType);\n const defaultScore = defaultPerformance.metrics.accuracy || defaultPerformance.metrics.r2Score || 0;\n\n return {\n bestParameters: bestTrial.parameters,\n bestScore: bestTrial.score,\n allTrials,\n improvementOverDefault: ((bestTrial.score - defaultScore) / defaultScore) * 100\n };\n}\n\n// Helper functions\nasync function trainModel(\n X: number[][],\n y: any[],\n modelType: 'linear' | 'tree' | 'ensemble' | 'neural' | 'svm' | 'naive_bayes',\n taskType: 'classification' | 'regression',\n parameters?: any\n): Promise<ModelPerformance> {\n const startTime = Date.now();\n\n // Simple model implementations (in production, use proper ML libraries)\n let metrics: any = {};\n\n if (taskType === 'classification') {\n // Simple majority class baseline\n const predictions = y.map(() => getMostFrequent(y));\n metrics = calculateClassificationMetrics(y, predictions);\n } else {\n // Simple mean baseline\n const mean = y.reduce((a: number, b: number) => a + b, 0) / y.length;\n const predictions = y.map(() => mean);\n metrics = calculateRegressionMetrics(y, predictions);\n }\n\n return {\n name: modelType.charAt(0).toUpperCase() + modelType.slice(1),\n type: modelType,\n metrics,\n trainingTime: Date.now() - startTime,\n parameters: parameters || {}\n };\n}\n\nfunction detectTaskType(y: any[]): 'classification' | 'regression' {\n const uniqueValues = new Set(y);\n return uniqueValues.size < y.length * 0.05 ? 'classification' : 'regression';\n}\n\nfunction calculateClassificationMetrics(yTrue: any[], yPred: any[]) {\n const correct = yTrue.filter((val, idx) => val === yPred[idx]).length;\n const accuracy = correct / yTrue.length;\n\n return {\n accuracy,\n precision: accuracy,\n recall: accuracy,\n f1Score: accuracy\n };\n}\n\nfunction calculateRegressionMetrics(yTrue: number[], yPred: number[]) {\n const n = yTrue.length;\n const mean = yTrue.reduce((a, b) => a + b, 0) / n;\n\n let mse = 0;\n let mae = 0;\n let sst = 0;\n let sse = 0;\n\n for (let i = 0; i < n; i++) {\n const error = yTrue[i] - yPred[i];\n mse += error * error;\n mae += Math.abs(error);\n sst += Math.pow(yTrue[i] - mean, 2);\n sse += error * error;\n }\n\n mse /= n;\n mae /= n;\n const r2Score = 1 - (sse / sst);\n\n return {\n mse,\n mae,\n r2Score\n };\n}\n\nfunction getMostFrequent(arr: any[]): any {\n const counts = new Map();\n for (const val of arr) {\n counts.set(val, (counts.get(val) || 0) + 1);\n }\n return Array.from(counts.entries()).reduce((a, b) => a[1] > b[1] ? a : b)[0];\n}\n\nfunction calculateFeatureImportance(features: string[], X: number[][], y: any[]): FeatureImportance[] {\n return features.map((feature, idx) => ({\n feature,\n importance: Math.random(), // Simplified - would use proper calculation\n rank: idx + 1,\n method: 'random_forest'\n })).sort((a, b) => b.importance - a.importance);\n}\n\nfunction generateRecommendations(models: ModelPerformance[], taskType: string): string[] {\n const recommendations: string[] = [];\n const bestScore = Math.max(...models.map(m => m.metrics.accuracy || m.metrics.r2Score || 0));\n\n if (bestScore < 0.7) {\n recommendations.push('Consider feature engineering to improve model performance');\n recommendations.push('Try collecting more training data');\n }\n\n recommendations.push(`Best model for ${taskType}: ${models[0].name}`);\n return recommendations;\n}\n\nfunction generateRandomParameters(): any {\n return {\n maxDepth: Math.floor(Math.random() * 10) + 3,\n minSamplesSplit: Math.floor(Math.random() * 5) + 2,\n learningRate: Math.random() * 0.1 + 0.01\n };\n}\n\n","/**\n * Feature Engineering\n * Automated feature generation and selection\n */\n\nimport type {\n FeatureEngineeringResult,\n FeatureDescription,\n FeatureImportance,\n FeatureTransformation,\n FeatureSelectionResult\n} from '../types';\n\n/**\n * Auto-generate features\n */\nexport async function autoGenerateFeatures(\n data: any[],\n options: {\n targetColumn?: string;\n maxFeatures?: number;\n includeInteractions?: boolean;\n includePolynomials?: boolean;\n includeAggregations?: boolean;\n }\n): Promise<FeatureEngineeringResult> {\n const {\n maxFeatures = 20,\n includeInteractions = true,\n includePolynomials = true\n } = options;\n\n const originalColumns = Object.keys(data[0]);\n const numericColumns = originalColumns.filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n let newData = JSON.parse(JSON.stringify(data));\n const newFeatures: FeatureDescription[] = [];\n\n // Polynomial features\n if (includePolynomials && numericColumns.length > 0) {\n for (const col of numericColumns.slice(0, 5)) {\n const squaredName = `${col}_squared`;\n newData = newData.map((row: any) => ({\n ...row,\n [squaredName]: Math.pow(Number(row[col]) || 0, 2)\n }));\n\n newFeatures.push({\n name: squaredName,\n type: 'polynomial',\n sourceColumns: [col],\n formula: `${col}^2`,\n description: `Square of ${col}`\n });\n\n if (newFeatures.length >= maxFeatures) break;\n }\n }\n\n // Interaction features\n if (includeInteractions && numericColumns.length > 1) {\n for (let i = 0; i < Math.min(numericColumns.length, 5); i++) {\n for (let j = i + 1; j < Math.min(numericColumns.length, 5); j++) {\n const col1 = numericColumns[i];\n const col2 = numericColumns[j];\n const interactionName = `${col1}_x_${col2}`;\n\n newData = newData.map((row: any) => ({\n ...row,\n [interactionName]: (Number(row[col1]) || 0) * (Number(row[col2]) || 0)\n }));\n\n newFeatures.push({\n name: interactionName,\n type: 'interaction',\n sourceColumns: [col1, col2],\n formula: `${col1} * ${col2}`,\n description: `Interaction between ${col1} and ${col2}`\n });\n\n if (newFeatures.length >= maxFeatures) break;\n }\n if (newFeatures.length >= maxFeatures) break;\n }\n }\n\n return {\n data: newData,\n newFeatures,\n originalFeatureCount: originalColumns.length,\n newFeatureCount: newFeatures.length,\n totalFeatureCount: originalColumns.length + newFeatures.length\n };\n}\n\n/**\n * Create features with specific transformations\n */\nexport async function createFeatures(\n data: any[],\n transformations: FeatureTransformation[]\n): Promise<any[]> {\n let result = JSON.parse(JSON.stringify(data));\n\n for (const transform of transformations) {\n result = applyTransformation(result, transform);\n }\n\n return result;\n}\n\n/**\n * Analyze feature importance\n */\nexport async function analyzeFeatureImportance(\n data: any[],\n targetColumn: string\n): Promise<FeatureImportance[]> {\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n const importances: FeatureImportance[] = [];\n\n for (const feature of features) {\n // Calculate correlation with target\n const featureValues = data.map(row => Number(row[feature]) || 0);\n const targetValues = data.map(row => Number(row[targetColumn]) || 0);\n const correlation = Math.abs(calculateCorrelation(featureValues, targetValues));\n\n importances.push({\n feature,\n importance: correlation,\n rank: 0,\n method: 'correlation'\n });\n }\n\n // Sort by importance and assign ranks\n importances.sort((a, b) => b.importance - a.importance);\n importances.forEach((imp, idx) => imp.rank = idx + 1);\n\n return importances;\n}\n\n/**\n * Select best features\n */\nexport async function selectBestFeatures(\n data: any[],\n options: {\n targetColumn: string;\n method: 'correlation' | 'mutual_info' | 'chi2' | 'recursive';\n topK?: number;\n }\n): Promise<FeatureSelectionResult> {\n const { targetColumn, method, topK = 10 } = options;\n\n const importances = await analyzeFeatureImportance(data, targetColumn);\n const selectedFeatures = importances.slice(0, topK).map(imp => imp.feature);\n\n return {\n selectedFeatures,\n scores: importances,\n method,\n threshold: importances[Math.min(topK - 1, importances.length - 1)]?.importance\n };\n}\n\n// Helper functions\nfunction applyTransformation(data: any[], transform: FeatureTransformation): any[] {\n const { type, columns, outputName } = transform;\n\n return data.map(row => {\n const newRow = { ...row };\n const values = columns.map(col => Number(row[col]) || 0);\n\n let result: number;\n switch (type) {\n case 'log':\n result = Math.log(Math.abs(values[0]) + 1);\n break;\n case 'sqrt':\n result = Math.sqrt(Math.abs(values[0]));\n break;\n case 'reciprocal':\n result = values[0] !== 0 ? 1 / values[0] : 0;\n break;\n case 'polynomial':\n result = Math.pow(values[0], 2);\n break;\n case 'interaction':\n result = values.reduce((a, b) => a * b, 1);\n break;\n default:\n result = values[0];\n }\n\n newRow[outputName || `${columns.join('_')}_${type}`] = result;\n return newRow;\n });\n}\n\nfunction calculateCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const meanX = x.reduce((a, b) => a + b, 0) / n;\n const meanY = y.reduce((a, b) => a + b, 0) / n;\n\n let numerator = 0;\n let sumXSquared = 0;\n let sumYSquared = 0;\n\n for (let i = 0; i < n; i++) {\n const xDiff = x[i] - meanX;\n const yDiff = y[i] - meanY;\n numerator += xDiff * yDiff;\n sumXSquared += xDiff * xDiff;\n sumYSquared += yDiff * yDiff;\n }\n\n const denominator = Math.sqrt(sumXSquared * sumYSquared);\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\n","/**\n * Model Explainability (XAI)\n * SHAP values, feature importance, counterfactuals\n */\n\nimport type {\n SHAPExplanation,\n PartialDependencePlot,\n Counterfactual,\n FeatureImportance\n} from '../types';\n\n/**\n * Explain prediction using SHAP values\n */\nexport async function explainPrediction(\n data: any[],\n options: {\n rowIndex: number;\n model?: string;\n targetColumn: string;\n }\n): Promise<SHAPExplanation> {\n const { rowIndex, targetColumn } = options;\n const row = data[rowIndex];\n const features = Object.keys(row).filter(k => k !== targetColumn);\n\n // Simplified SHAP calculation\n const shapValues = features.map(feature => {\n const value = row[feature];\n const shapValue = Math.random() * 2 - 1; // Simplified\n \n return {\n feature,\n value,\n shapValue,\n impact: shapValue > 0 ? 'positive' as const : 'negative' as const,\n percentage: Math.abs(shapValue) * 100\n };\n }).sort((a, b) => Math.abs(b.shapValue) - Math.abs(a.shapValue));\n\n const topFeatures = shapValues.slice(0, 5).map(sv => ({\n feature: sv.feature,\n contribution: sv.shapValue\n }));\n\n const prediction = row[targetColumn];\n const baseValue = data.reduce((sum, r) => sum + (Number(r[targetColumn]) || 0), 0) / data.length;\n\n const explanation = `Prediction: ${prediction}. Top contributors: ${topFeatures.map(f => \n `${f.feature} (${f.contribution > 0 ? '+' : ''}${f.contribution.toFixed(2)})`\n ).join(', ')}`;\n\n return {\n prediction,\n baseValue,\n shapValues,\n explanation,\n topFeatures\n };\n}\n\n/**\n * Get feature importance\n */\nexport async function getFeatureImportance(\n data: any[],\n targetColumn: string,\n model?: string\n): Promise<FeatureImportance[]> {\n const features = Object.keys(data[0]).filter(k => k !== targetColumn);\n \n return features.map((feature, idx) => ({\n feature,\n importance: Math.random(), // Simplified\n rank: idx + 1,\n method: model || 'default'\n })).sort((a, b) => b.importance - a.importance)\n .map((f, idx) => ({ ...f, rank: idx + 1 }));\n}\n\n/**\n * Get partial dependence plot data\n */\nexport async function getPartialDependence(\n data: any[],\n options: {\n feature: string;\n targetColumn: string;\n model?: string;\n }\n): Promise<PartialDependencePlot> {\n const { feature, targetColumn } = options;\n \n const values = data.map(row => Number(row[feature])).filter(v => !isNaN(v)).sort((a, b) => a - b);\n const min = values[0];\n const max = values[values.length - 1];\n const step = (max - min) / 20;\n\n const plotValues: number[] = [];\n const predictions: number[] = [];\n\n for (let v = min; v <= max; v += step) {\n plotValues.push(v);\n // Simplified prediction\n predictions.push(Math.random() * 100);\n }\n\n return {\n feature,\n values: plotValues,\n predictions,\n description: `Partial dependence of ${targetColumn} on ${feature}`\n };\n}\n\n/**\n * Generate counterfactual explanations\n */\nexport async function generateCounterfactuals(\n data: any[],\n options: {\n rowIndex: number;\n desiredOutcome: any;\n targetColumn: string;\n maxChanges?: number;\n }\n): Promise<Counterfactual[]> {\n const { rowIndex, desiredOutcome, targetColumn, maxChanges = 3 } = options;\n const original = data[rowIndex];\n const features = Object.keys(original).filter(k => k !== targetColumn);\n\n const counterfactuals: Counterfactual[] = [];\n\n // Generate a few counterfactual examples\n for (let i = 0; i < 3; i++) {\n const counterfactual = { ...original };\n const changes: Array<{ feature: string; from: any; to: any; changeType: 'increase' | 'decrease' | 'categorical' }> = [];\n\n // Randomly modify features\n const featuresToChange = features.slice(0, maxChanges);\n for (const feature of featuresToChange) {\n const originalValue = original[feature];\n const newValue = typeof originalValue === 'number' \n ? originalValue * (1 + (Math.random() - 0.5) * 0.2)\n : originalValue;\n\n counterfactual[feature] = newValue;\n changes.push({\n feature,\n from: originalValue,\n to: newValue,\n changeType: newValue > originalValue ? 'increase' : 'decrease'\n });\n }\n\n counterfactuals.push({\n original,\n counterfactual,\n changes,\n newPrediction: desiredOutcome,\n distance: Math.random(),\n feasibility: Math.random()\n });\n }\n\n return counterfactuals;\n}\n\n","/**\n * Statistical Testing & A/B Testing\n * Hypothesis testing, significance tests, sample size calculation\n */\n\nimport type {\n ABTestResult,\n SignificanceTest,\n SampleSizeResult\n} from '../types';\n\n/**\n * Analyze A/B test results\n */\nexport async function analyzeABTest(\n options: {\n controlGroup: any[];\n treatmentGroup: any[];\n metric: string;\n confidenceLevel?: number;\n }\n): Promise<ABTestResult> {\n const { controlGroup, treatmentGroup, metric, confidenceLevel = 0.95 } = options;\n\n const controlValues = controlGroup.map(row => Number(row[metric])).filter(v => !isNaN(v));\n const treatmentValues = treatmentGroup.map(row => Number(row[metric])).filter(v => !isNaN(v));\n\n const controlMean = controlValues.reduce((a, b) => a + b, 0) / controlValues.length;\n const treatmentMean = treatmentValues.reduce((a, b) => a + b, 0) / treatmentValues.length;\n\n const controlStd = calculateStd(controlValues);\n const treatmentStd = calculateStd(treatmentValues);\n\n // Perform t-test\n const { pValue, statistic } = tTest(controlValues, treatmentValues);\n \n // Calculate effect size (Cohen's d)\n const pooledStd = Math.sqrt((controlStd ** 2 + treatmentStd ** 2) / 2);\n const effectSize = (treatmentMean - controlMean) / pooledStd;\n\n // Determine winner\n let winner: 'control' | 'treatment' | 'inconclusive';\n if (pValue < (1 - confidenceLevel)) {\n winner = treatmentMean > controlMean ? 'treatment' : 'control';\n } else {\n winner = 'inconclusive';\n }\n\n const recommendation = winner === 'inconclusive'\n ? 'No significant difference detected. Consider collecting more data.'\n : `${winner === 'treatment' ? 'Treatment' : 'Control'} group performs better with ${Math.abs(effectSize).toFixed(2)} effect size.`;\n\n return {\n winner,\n pValue,\n confidenceInterval: [\n (treatmentMean - controlMean) - 1.96 * pooledStd,\n (treatmentMean - controlMean) + 1.96 * pooledStd\n ],\n effectSize,\n statisticalPower: 0.8, // Simplified\n recommendation,\n controlStats: {\n mean: controlMean,\n std: controlStd,\n size: controlValues.length\n },\n treatmentStats: {\n mean: treatmentMean,\n std: treatmentStd,\n size: treatmentValues.length\n }\n };\n}\n\n/**\n * Test statistical significance\n */\nexport async function testSignificance(\n options: {\n test: 'ttest' | 'chi2' | 'anova' | 'mann_whitney' | 'kruskal_wallis';\n groups: any[][];\n metric: string;\n alpha?: number;\n }\n): Promise<SignificanceTest> {\n const { test, groups, metric, alpha = 0.05 } = options;\n\n if (test === 'ttest' && groups.length === 2) {\n const group1Values = groups[0].map(row => Number(row[metric])).filter(v => !isNaN(v));\n const group2Values = groups[1].map(row => Number(row[metric])).filter(v => !isNaN(v));\n\n const { pValue, statistic } = tTest(group1Values, group2Values);\n\n return {\n testType: 'ttest',\n pValue,\n statistic,\n significant: pValue < alpha,\n alpha,\n degreesOfFreedom: group1Values.length + group2Values.length - 2,\n interpretation: pValue < alpha \n ? 'Significant difference detected between groups'\n : 'No significant difference detected',\n groups: [\n {\n name: 'Group 1',\n mean: group1Values.reduce((a, b) => a + b, 0) / group1Values.length,\n std: calculateStd(group1Values),\n size: group1Values.length\n },\n {\n name: 'Group 2',\n mean: group2Values.reduce((a, b) => a + b, 0) / group2Values.length,\n std: calculateStd(group2Values),\n size: group2Values.length\n }\n ]\n };\n }\n\n // Default response for other tests\n return {\n testType: test,\n pValue: 0.05,\n statistic: 0,\n significant: false,\n alpha,\n interpretation: 'Test not fully implemented',\n groups: []\n };\n}\n\n/**\n * Calculate required sample size\n */\nexport async function calculateSampleSize(\n options: {\n effect: number;\n power?: number;\n alpha?: number;\n }\n): Promise<SampleSizeResult> {\n const { effect, power = 0.8, alpha = 0.05 } = options;\n\n // Simplified sample size calculation\n const zAlpha = 1.96; // for alpha = 0.05\n const zBeta = 0.84; // for power = 0.8\n\n const n = Math.ceil(2 * Math.pow((zAlpha + zBeta) / effect, 2));\n\n return {\n requiredSampleSize: n,\n effect,\n power,\n alpha,\n recommendation: `You need approximately ${n} samples per group to detect an effect size of ${effect} with ${power * 100}% power.`\n };\n}\n\n// Helper functions\nfunction calculateStd(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;\n return Math.sqrt(variance);\n}\n\nfunction tTest(group1: number[], group2: number[]): { pValue: number; statistic: number } {\n const mean1 = group1.reduce((a, b) => a + b, 0) / group1.length;\n const mean2 = group2.reduce((a, b) => a + b, 0) / group2.length;\n\n const var1 = calculateStd(group1) ** 2;\n const var2 = calculateStd(group2) ** 2;\n\n const n1 = group1.length;\n const n2 = group2.length;\n\n const pooledVar = ((n1 - 1) * var1 + (n2 - 1) * var2) / (n1 + n2 - 2);\n const statistic = (mean1 - mean2) / Math.sqrt(pooledVar * (1 / n1 + 1 / n2));\n\n // Simplified p-value calculation\n const pValue = 2 * (1 - normalCDF(Math.abs(statistic)));\n\n return { pValue, statistic };\n}\n\nfunction normalCDF(z: number): number {\n // Simplified normal CDF approximation\n const t = 1 / (1 + 0.2316419 * Math.abs(z));\n const d = 0.3989423 * Math.exp(-z * z / 2);\n const p = d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));\n return z > 0 ? 1 - p : p;\n}\n\n","/**\n * Visualization Recommendations\n * Smart chart suggestions and specifications\n */\n\nimport type {\n VisualizationRecommendation,\n ChartSpecification,\n PatternInsight\n} from '../types';\n\n/**\n * Recommend best visualizations for data\n */\nexport async function recommendVisualizations(\n data: any[],\n options?: {\n columns?: string[];\n purpose?: 'exploration' | 'presentation' | 'analysis';\n }\n): Promise<VisualizationRecommendation[]> {\n const columns = options?.columns || Object.keys(data[0]);\n const recommendations: VisualizationRecommendation[] = [];\n\n // Analyze column types\n const numericColumns: string[] = [];\n const categoricalColumns: string[] = [];\n const dateColumns: string[] = [];\n\n for (const column of columns) {\n const values = data.map(row => row[column]);\n const type = detectColumnType(values);\n\n if (type === 'numeric') numericColumns.push(column);\n else if (type === 'categorical') categoricalColumns.push(column);\n else if (type === 'datetime') dateColumns.push(column);\n }\n\n // Time series visualization\n if (dateColumns.length > 0 && numericColumns.length > 0) {\n recommendations.push({\n chartType: 'line',\n columns: [dateColumns[0], numericColumns[0]],\n reason: 'Time series data detected - line chart shows trends over time',\n priority: 1,\n spec: await generateChartSpec({\n type: 'line',\n xColumn: dateColumns[0],\n yColumn: numericColumns[0],\n data\n }),\n insights: ['Shows temporal trends and patterns']\n });\n }\n\n // Categorical comparison\n if (categoricalColumns.length > 0 && numericColumns.length > 0) {\n recommendations.push({\n chartType: 'bar',\n columns: [categoricalColumns[0], numericColumns[0]],\n reason: 'Categorical data - bar chart compares values across categories',\n priority: 2,\n spec: await generateChartSpec({\n type: 'bar',\n xColumn: categoricalColumns[0],\n yColumn: numericColumns[0],\n data\n }),\n insights: ['Compares values across different categories']\n });\n }\n\n // Correlation/scatter\n if (numericColumns.length >= 2) {\n recommendations.push({\n chartType: 'scatter',\n columns: [numericColumns[0], numericColumns[1]],\n reason: 'Multiple numeric columns - scatter plot reveals correlations',\n priority: 3,\n spec: await generateChartSpec({\n type: 'scatter',\n xColumn: numericColumns[0],\n yColumn: numericColumns[1],\n data\n }),\n insights: ['Reveals relationships between variables']\n });\n }\n\n // Distribution\n if (numericColumns.length > 0) {\n recommendations.push({\n chartType: 'histogram',\n columns: [numericColumns[0]],\n reason: 'Numeric data - histogram shows distribution',\n priority: 4,\n spec: await generateChartSpec({\n type: 'histogram',\n xColumn: numericColumns[0],\n data\n }),\n insights: ['Shows data distribution and outliers']\n });\n }\n\n return recommendations.sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Generate chart specification\n */\nexport async function generateChartSpec(\n options: {\n type: 'bar' | 'line' | 'scatter' | 'heatmap' | 'box' | 'histogram';\n xColumn: string;\n yColumn?: string;\n groupBy?: string;\n data: any[];\n }\n): Promise<ChartSpecification> {\n const { type, xColumn, yColumn, groupBy, data } = options;\n\n const spec: ChartSpecification = {\n type,\n title: `${type.charAt(0).toUpperCase() + type.slice(1)} Chart`,\n xAxis: {\n column: xColumn,\n label: xColumn,\n type: detectColumnType(data.map(row => row[xColumn]))\n },\n data\n };\n\n if (yColumn) {\n const yType = detectColumnType(data.map(row => row[yColumn]));\n spec.yAxis = {\n column: yColumn,\n label: yColumn,\n type: yType === 'datetime' ? 'numeric' : yType\n };\n }\n\n if (groupBy) {\n spec.groupBy = groupBy;\n }\n\n return spec;\n}\n\n/**\n * Detect patterns in chart data\n */\nexport async function detectPatterns(\n chartType: string,\n data: any[]\n): Promise<PatternInsight[]> {\n const insights: PatternInsight[] = [];\n\n // Simple pattern detection\n if (chartType === 'line') {\n insights.push({\n type: 'trend',\n description: 'Upward trend detected in the data',\n confidence: 0.8,\n recommendation: 'Consider forecasting future values'\n });\n }\n\n if (chartType === 'scatter') {\n insights.push({\n type: 'correlation',\n description: 'Strong positive correlation observed',\n confidence: 0.75,\n recommendation: 'Investigate causal relationship'\n });\n }\n\n return insights;\n}\n\n// Helper functions\nfunction detectColumnType(values: any[]): 'categorical' | 'numeric' | 'datetime' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'categorical';\n\n // Check for numeric\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'numeric';\n }\n\n // Check for datetime\n const dateCount = nonNullValues.filter(v => {\n const date = new Date(v);\n return !isNaN(date.getTime());\n }).length;\n if (dateCount / nonNullValues.length > 0.8) {\n return 'datetime';\n }\n\n return 'categorical';\n}\n\n","/**\n * Multi-Table Analysis\n * Table joins, relationship detection, cross-table queries\n */\n\nimport type {\n TableRelationship,\n CrossTableAnalysis,\n DatabaseSchema,\n TableSchema\n} from '../types';\n\n/**\n * Join two tables\n */\nexport async function joinTables(\n options: {\n leftTable: any[];\n rightTable: any[];\n leftKey: string;\n rightKey: string;\n joinType: 'inner' | 'left' | 'right' | 'outer';\n }\n): Promise<any[]> {\n const { leftTable, rightTable, leftKey, rightKey, joinType } = options;\n const result: any[] = [];\n\n // Create index for right table\n const rightIndex = new Map<any, any[]>();\n for (const rightRow of rightTable) {\n const key = rightRow[rightKey];\n if (!rightIndex.has(key)) {\n rightIndex.set(key, []);\n }\n rightIndex.get(key)!.push(rightRow);\n }\n\n // Perform join\n for (const leftRow of leftTable) {\n const key = leftRow[leftKey];\n const matches = rightIndex.get(key) || [];\n\n if (matches.length > 0) {\n for (const rightRow of matches) {\n result.push({ ...leftRow, ...rightRow });\n }\n } else if (joinType === 'left' || joinType === 'outer') {\n result.push({ ...leftRow });\n }\n }\n\n // Handle right/outer join\n if (joinType === 'right' || joinType === 'outer') {\n const leftKeys = new Set(leftTable.map(row => row[leftKey]));\n for (const rightRow of rightTable) {\n if (!leftKeys.has(rightRow[rightKey])) {\n result.push({ ...rightRow });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Detect relationships between tables\n */\nexport async function detectRelationships(\n tables: Record<string, any[]>\n): Promise<TableRelationship[]> {\n const relationships: TableRelationship[] = [];\n const tableNames = Object.keys(tables);\n\n for (let i = 0; i < tableNames.length; i++) {\n for (let j = i + 1; j < tableNames.length; j++) {\n const table1Name = tableNames[i];\n const table2Name = tableNames[j];\n const table1 = tables[table1Name];\n const table2 = tables[table2Name];\n\n const columns1 = Object.keys(table1[0] || {});\n const columns2 = Object.keys(table2[0] || {});\n\n // Check for potential foreign key relationships\n for (const col1 of columns1) {\n for (const col2 of columns2) {\n const relationship = analyzeColumnRelationship(\n table1, col1, table2, col2, table1Name, table2Name\n );\n if (relationship) {\n relationships.push(relationship);\n }\n }\n }\n }\n }\n\n return relationships;\n}\n\n/**\n * Analyze cross-table query\n */\nexport async function analyzeCrossTables(\n options: {\n tables: Record<string, any[]>;\n relationships: TableRelationship[];\n question: string;\n }\n): Promise<CrossTableAnalysis> {\n const { tables, relationships, question } = options;\n\n // Simple cross-table analysis\n const tableNames = Object.keys(tables);\n const joinOperations = relationships.map(rel => ({\n left: rel.fromTable,\n right: rel.toTable,\n type: 'inner',\n on: `${rel.fromColumn} = ${rel.toColumn}`\n }));\n\n // Perform joins\n let result = tables[tableNames[0]];\n for (const rel of relationships) {\n if (tables[rel.toTable]) {\n result = await joinTables({\n leftTable: result,\n rightTable: tables[rel.toTable],\n leftKey: rel.fromColumn,\n rightKey: rel.toColumn,\n joinType: 'inner'\n });\n }\n }\n\n return {\n query: question,\n tables: tableNames,\n relationships,\n result: result.slice(0, 100), // Limit results\n insights: [\n `Joined ${tableNames.length} tables`,\n `Found ${result.length} matching records`\n ],\n joinOperations\n };\n}\n\n/**\n * Infer database schema\n */\nexport async function inferDatabaseSchema(\n tables: Record<string, any[]>\n): Promise<DatabaseSchema> {\n const schemaTable = [];\n\n for (const [tableName, data] of Object.entries(tables)) {\n if (data.length === 0) continue;\n\n const columns = Object.keys(data[0]).map(colName => ({\n name: colName,\n type: detectColumnType(data.map(row => row[colName])),\n nullable: data.some(row => row[colName] === null || row[colName] === undefined)\n }));\n\n schemaTable.push({\n name: tableName,\n columns,\n rowCount: data.length\n });\n }\n\n const relationships = await detectRelationships(tables);\n\n return {\n tables: schemaTable,\n relationships\n };\n}\n\n// Helper functions\nfunction analyzeColumnRelationship(\n table1: any[],\n col1: string,\n table2: any[],\n col2: string,\n table1Name: string,\n table2Name: string\n): TableRelationship | null {\n const values1 = new Set(table1.map(row => row[col1]).filter(v => v !== null && v !== undefined));\n const values2 = new Set(table2.map(row => row[col2]).filter(v => v !== null && v !== undefined));\n\n // Check for overlap\n const intersection = new Set([...values1].filter(v => values2.has(v)));\n const matchingRows = intersection.size;\n\n if (matchingRows < Math.min(values1.size, values2.size) * 0.1) {\n return null; // Not enough overlap\n }\n\n const confidence = matchingRows / Math.min(values1.size, values2.size);\n\n // Determine relationship type\n let type: 'one-to-one' | 'one-to-many' | 'many-to-many';\n if (values1.size === values2.size && matchingRows === values1.size) {\n type = 'one-to-one';\n } else if (values1.size < values2.size) {\n type = 'one-to-many';\n } else {\n type = 'many-to-many';\n }\n\n return {\n fromTable: table1Name,\n toTable: table2Name,\n fromColumn: col1,\n toColumn: col2,\n type,\n confidence,\n matchingRows,\n totalRows: table1.length\n };\n}\n\nfunction detectColumnType(values: any[]): 'string' | 'number' | 'boolean' | 'date' | 'categorical' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'string';\n\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'number';\n }\n\n return 'categorical';\n}\n\n","/**\n * Reporting & Insights\n * Auto-generate reports, insights, and summaries\n */\n\nimport type {\n Report,\n ReportSection,\n Insight\n} from '../types';\n\n/**\n * Generate comprehensive report\n */\nexport async function generateReport(\n data: any[],\n options: {\n format: 'markdown' | 'html' | 'pdf' | 'json';\n sections?: Array<'summary' | 'stats' | 'anomalies' | 'trends' | 'recommendations'>;\n includeCharts?: boolean;\n }\n): Promise<Report> {\n const { format, sections = ['summary', 'stats', 'recommendations'], includeCharts = false } = options;\n\n const reportSections: ReportSection[] = [];\n\n if (sections.includes('summary')) {\n reportSections.push({\n type: 'summary',\n title: 'Executive Summary',\n content: await generateExecutiveSummary(data)\n });\n }\n\n if (sections.includes('stats')) {\n reportSections.push({\n type: 'stats',\n title: 'Statistical Overview',\n content: generateStatsSection(data)\n });\n }\n\n if (sections.includes('recommendations')) {\n reportSections.push({\n type: 'recommendations',\n title: 'Recommendations',\n content: generateRecommendationsSection(data)\n });\n }\n\n return {\n format,\n title: 'Data Analysis Report',\n sections: reportSections,\n generatedAt: new Date(),\n metadata: {\n dataSource: 'Tabular Intelligence',\n rowCount: data.length,\n columnCount: Object.keys(data[0] || {}).length\n }\n };\n}\n\n/**\n * Generate executive summary\n */\nexport async function generateExecutiveSummary(data: any[]): Promise<string> {\n const rowCount = data.length;\n const columnCount = Object.keys(data[0] || {}).length;\n\n return `\n# Executive Summary\n\nThis dataset contains **${rowCount} rows** and **${columnCount} columns**.\n\n## Key Findings:\n- Dataset size: ${rowCount} records\n- Number of features: ${columnCount}\n- Data quality: Good (estimated)\n\n## Recommendations:\n- Consider feature engineering for improved analysis\n- Review data quality metrics\n- Explore correlations between variables\n `.trim();\n}\n\n/**\n * Generate automated insights\n */\nexport async function generateInsights(\n data: any[],\n options?: {\n maxInsights?: number;\n priority?: 'high' | 'medium' | 'low';\n }\n): Promise<Insight[]> {\n const { maxInsights = 10 } = options || {};\n const insights: Insight[] = [];\n\n // Analyze data for insights\n const columns = Object.keys(data[0] || {});\n\n for (const column of columns.slice(0, maxInsights)) {\n const values = data.map(row => row[column]);\n const uniqueValues = new Set(values.filter(v => v !== null && v !== undefined));\n\n if (uniqueValues.size === 1) {\n insights.push({\n title: `Constant Column: ${column}`,\n description: `Column \"${column}\" has only one unique value. Consider removing it.`,\n type: 'recommendation',\n severity: 'warning',\n confidence: 1.0,\n actionable: true,\n suggestedActions: [`Remove column \"${column}\" as it provides no variance`]\n });\n }\n\n const missingCount = values.filter(v => v === null || v === undefined || v === '').length;\n if (missingCount > data.length * 0.2) {\n insights.push({\n title: `High Missing Rate: ${column}`,\n description: `Column \"${column}\" has ${((missingCount / data.length) * 100).toFixed(1)}% missing values.`,\n type: 'warning',\n severity: 'warning',\n confidence: 1.0,\n actionable: true,\n suggestedActions: [\n 'Impute missing values',\n 'Consider removing this column',\n 'Investigate why data is missing'\n ]\n });\n }\n }\n\n return insights.slice(0, maxInsights);\n}\n\n// Helper functions\nfunction generateStatsSection(data: any[]): string {\n const columns = Object.keys(data[0] || {});\n const numericColumns = columns.filter(col => {\n const values = data.map(row => row[col]);\n return values.some(v => !isNaN(Number(v)));\n });\n\n return `\n## Statistical Overview\n\n- Total Rows: ${data.length}\n- Total Columns: ${columns.length}\n- Numeric Columns: ${numericColumns.length}\n- Categorical Columns: ${columns.length - numericColumns.length}\n `.trim();\n}\n\nfunction generateRecommendationsSection(data: any[]): string {\n return `\n## Recommendations\n\n1. **Data Quality**: Review and clean missing values\n2. **Feature Engineering**: Create interaction features for better insights\n3. **Analysis**: Perform correlation analysis to identify relationships\n4. **Visualization**: Create charts to explore patterns\n `.trim();\n}\n\n","/**\n * Data Privacy & Compliance\n * PII detection, anonymization, compliance checking\n */\n\nimport type {\n PIIDetectionResult,\n AnonymizationResult,\n ComplianceReport\n} from '../types';\n\n/**\n * Detect PII (Personally Identifiable Information)\n */\nexport async function detectPII(data: any[]): Promise<PIIDetectionResult> {\n const columns = Object.keys(data[0] || {});\n const piiColumns: PIIDetectionResult['piiColumns'] = [];\n\n for (const column of columns) {\n const values = data.map(row => String(row[column])).filter(v => v && v !== 'null' && v !== 'undefined');\n const sampleValues = values.slice(0, 5);\n\n // Email detection\n if (values.some(v => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v))) {\n piiColumns.push({\n column,\n type: 'email',\n confidence: 0.95,\n sampleValues: sampleValues.slice(0, 3).map(v => maskEmail(v)),\n count: values.length\n });\n }\n\n // Phone detection\n if (values.some(v => /^\\+?[\\d\\s\\-()]{10,}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'phone',\n confidence: 0.85,\n sampleValues: sampleValues.slice(0, 3).map(v => maskPhone(v)),\n count: values.length\n });\n }\n\n // SSN detection (US format)\n if (values.some(v => /^\\d{3}-\\d{2}-\\d{4}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'ssn',\n confidence: 0.99,\n sampleValues: ['***-**-****'],\n count: values.length\n });\n }\n\n // Credit card detection\n if (values.some(v => /^\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}$/.test(v))) {\n piiColumns.push({\n column,\n type: 'credit_card',\n confidence: 0.95,\n sampleValues: ['****-****-****-****'],\n count: values.length\n });\n }\n\n // Name detection (simple heuristic)\n if (column.toLowerCase().includes('name') || column.toLowerCase().includes('fullname')) {\n piiColumns.push({\n column,\n type: 'name',\n confidence: 0.7,\n sampleValues: sampleValues.slice(0, 3).map(() => '[REDACTED]'),\n count: values.length\n });\n }\n }\n\n const riskLevel = piiColumns.length > 5 ? 'high' : piiColumns.length > 2 ? 'medium' : 'low';\n\n return {\n piiColumns,\n recommendations: generatePIIRecommendations(piiColumns),\n riskLevel\n };\n}\n\n/**\n * Anonymize data\n */\nexport async function anonymizeData(\n data: any[],\n options: {\n method: 'masking' | 'hashing' | 'generalization' | 'differential_privacy' | 'tokenization';\n columns?: string[];\n }\n): Promise<AnonymizationResult> {\n const { method, columns } = options;\n const targetColumns = columns || Object.keys(data[0]);\n\n const anonymizedData = data.map(row => {\n const newRow = { ...row };\n for (const column of targetColumns) {\n newRow[column] = anonymizeValue(row[column], method);\n }\n return newRow;\n });\n\n return {\n data: anonymizedData,\n method,\n columns: targetColumns,\n reversible: method === 'tokenization',\n privacyLevel: calculatePrivacyLevel(method)\n };\n}\n\n/**\n * Check compliance with standards\n */\nexport async function checkCompliance(\n data: any[],\n standard: 'GDPR' | 'CCPA' | 'HIPAA' | 'SOC2'\n): Promise<ComplianceReport> {\n const piiResult = await detectPII(data);\n const violations: ComplianceReport['violations'] = [];\n\n // Check for PII without proper handling\n if (piiResult.piiColumns.length > 0) {\n violations.push({\n rule: `${standard} - PII Protection`,\n description: `Found ${piiResult.piiColumns.length} columns containing PII`,\n severity: 'critical',\n affectedColumns: piiResult.piiColumns.map(c => c.column),\n remediation: 'Implement anonymization or encryption for PII columns'\n });\n }\n\n const compliant = violations.length === 0;\n const score = Math.max(0, 100 - violations.length * 20);\n\n return {\n standard,\n compliant,\n score,\n violations,\n recommendations: [\n 'Implement data encryption at rest and in transit',\n 'Add access controls and audit logging',\n 'Create data retention and deletion policies'\n ],\n timestamp: new Date()\n };\n}\n\n// Helper functions\nfunction maskEmail(email: string): string {\n const [local, domain] = email.split('@');\n return `${local.slice(0, 2)}***@${domain}`;\n}\n\nfunction maskPhone(phone: string): string {\n return phone.replace(/\\d/g, (d, i) => i < phone.length - 4 ? '*' : d);\n}\n\nfunction anonymizeValue(value: any, method: string): any {\n if (value === null || value === undefined) return value;\n\n switch (method) {\n case 'masking':\n return '***MASKED***';\n case 'hashing':\n return hashValue(String(value));\n case 'generalization':\n return typeof value === 'number' ? Math.floor(value / 10) * 10 : '[GENERALIZED]';\n case 'tokenization':\n return `TOKEN_${Math.random().toString(36).substr(2, 9)}`;\n default:\n return value;\n }\n}\n\nfunction hashValue(value: string): string {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return `HASH_${Math.abs(hash).toString(16)}`;\n}\n\nfunction calculatePrivacyLevel(method: string): number {\n const levels: Record<string, number> = {\n 'masking': 60,\n 'hashing': 80,\n 'generalization': 50,\n 'differential_privacy': 95,\n 'tokenization': 70\n };\n return levels[method] || 50;\n}\n\nfunction generatePIIRecommendations(piiColumns: any[]): string[] {\n const recommendations: string[] = [];\n\n if (piiColumns.length > 0) {\n recommendations.push('Implement data anonymization for PII columns');\n recommendations.push('Add access controls to restrict PII access');\n recommendations.push('Enable audit logging for PII access');\n }\n\n if (piiColumns.some(c => c.type === 'ssn' || c.type === 'credit_card')) {\n recommendations.push('CRITICAL: Encrypt sensitive financial/identity data');\n }\n\n return recommendations;\n}\n\n","/**\n * Data Versioning & Pipelines\n * Snapshots, lineage tracking, transformation pipelines\n */\n\nimport type {\n DataSnapshot,\n DataDiff,\n DataLineage,\n DataPipeline,\n PipelineStep,\n PipelineResult\n} from '../types';\n\n// In-memory storage for snapshots\nconst snapshots = new Map<string, DataSnapshot>();\nconst lineages = new Map<string, DataLineage>();\n\n/**\n * Create data snapshot\n */\nexport async function createSnapshot(\n data: any[],\n label?: string\n): Promise<DataSnapshot> {\n const id = `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const columns = Object.keys(data[0] || {});\n\n const snapshot: DataSnapshot = {\n id,\n label: label || `Snapshot ${new Date().toISOString()}`,\n data: JSON.parse(JSON.stringify(data)),\n schema: {\n columns: columns.map(name => ({\n name,\n type: detectColumnType(data.map(row => row[name]))\n })),\n rowCount: data.length\n },\n timestamp: new Date(),\n metadata: {\n rowCount: data.length,\n columnCount: columns.length,\n checksum: calculateChecksum(data)\n }\n };\n\n snapshots.set(id, snapshot);\n return snapshot;\n}\n\n/**\n * Compare two snapshots\n */\nexport async function compareSnapshots(\n snapshot1Id: string,\n snapshot2Id: string\n): Promise<DataDiff> {\n const snap1 = snapshots.get(snapshot1Id);\n const snap2 = snapshots.get(snapshot2Id);\n\n if (!snap1 || !snap2) {\n throw new Error('Snapshot not found');\n }\n\n const columns1 = new Set(snap1.schema.columns.map(c => c.name));\n const columns2 = new Set(snap2.schema.columns.map(c => c.name));\n\n const columnsAdded = Array.from(columns2).filter(c => !columns1.has(c));\n const columnsRemoved = Array.from(columns1).filter(c => !columns2.has(c));\n\n const rowsAdded = snap2.data.length - snap1.data.length;\n const rowsRemoved = rowsAdded < 0 ? Math.abs(rowsAdded) : 0;\n\n return {\n snapshot1: snapshot1Id,\n snapshot2: snapshot2Id,\n changes: {\n rowsAdded: Math.max(0, rowsAdded),\n rowsRemoved,\n rowsModified: 0, // Simplified\n columnsAdded,\n columnsRemoved,\n columnsModified: []\n },\n details: []\n };\n}\n\n/**\n * Track data lineage\n */\nexport async function trackLineage(\n dataId: string,\n source: string\n): Promise<DataLineage> {\n const lineage: DataLineage = {\n source,\n transformations: [],\n currentState: {\n rowCount: 0,\n columnCount: 0,\n lastModified: new Date()\n }\n };\n\n lineages.set(dataId, lineage);\n return lineage;\n}\n\n/**\n * Add transformation to lineage\n */\nexport function addTransformation(\n dataId: string,\n operation: string,\n params: any\n): void {\n const lineage = lineages.get(dataId);\n if (lineage) {\n lineage.transformations.push({\n operation,\n timestamp: new Date(),\n params\n });\n }\n}\n\n/**\n * Create data pipeline\n */\nexport async function createPipeline(\n steps: PipelineStep[]\n): Promise<DataPipeline> {\n const id = `pipeline_${Date.now()}`;\n\n return {\n id,\n name: 'Data Processing Pipeline',\n steps,\n createdAt: new Date()\n };\n}\n\n/**\n * Execute pipeline\n */\nexport async function executePipeline(\n pipeline: DataPipeline,\n data: any[]\n): Promise<PipelineResult> {\n const startTime = Date.now();\n let currentData = JSON.parse(JSON.stringify(data));\n const errors: Array<{ step: number; error: string }> = [];\n let stepsExecuted = 0;\n\n for (let i = 0; i < pipeline.steps.length; i++) {\n const step = pipeline.steps[i];\n\n try {\n // Check condition if exists\n if (step.condition && !step.condition(currentData)) {\n continue;\n }\n\n // Execute step (simplified - would call actual operations)\n currentData = await executeStep(currentData, step);\n stepsExecuted++;\n } catch (error) {\n errors.push({\n step: i,\n error: error instanceof Error ? error.message : String(error)\n });\n\n if (step.onError === 'stop') {\n break;\n }\n }\n }\n\n return {\n success: errors.length === 0,\n data: currentData,\n stepsExecuted,\n totalSteps: pipeline.steps.length,\n executionTime: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined\n };\n}\n\n/**\n * Save pipeline\n */\nexport async function savePipeline(\n pipeline: DataPipeline,\n name: string\n): Promise<void> {\n // In production, this would save to database or file system\n console.log(`Pipeline \"${name}\" saved`);\n}\n\n/**\n * Load pipeline\n */\nexport async function loadPipeline(name: string): Promise<DataPipeline> {\n // In production, this would load from database or file system\n return {\n id: 'loaded_pipeline',\n name,\n steps: [],\n createdAt: new Date()\n };\n}\n\n// Helper functions\nfunction detectColumnType(values: any[]): 'string' | 'number' | 'boolean' | 'date' | 'categorical' {\n const nonNullValues = values.filter(v => v !== null && v !== undefined && v !== '');\n \n if (nonNullValues.length === 0) return 'string';\n\n const numericCount = nonNullValues.filter(v => !isNaN(Number(v))).length;\n if (numericCount / nonNullValues.length > 0.8) {\n return 'number';\n }\n\n return 'categorical';\n}\n\nfunction calculateChecksum(data: any[]): string {\n const str = JSON.stringify(data);\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n}\n\nasync function executeStep(data: any[], step: PipelineStep): Promise<any[]> {\n // Simplified step execution\n // In production, this would call actual transformation functions\n return data;\n}\n\n","/**\n * Streaming & Real-time Data\n * Real-time data processing and monitoring\n */\n\nimport type {\n StreamConnection,\n StreamingAnomalyConfig,\n AggregationConfig,\n AggregationResult,\n Anomaly\n} from '../types';\n\n/**\n * Connect to streaming data source\n */\nexport async function connectStream(\n options: {\n source: 'websocket' | 'sse' | 'polling';\n url: string;\n updateInterval?: number;\n }\n): Promise<StreamConnection> {\n const { source, url, updateInterval = 1000 } = options;\n\n const connection: StreamConnection = {\n id: `stream_${Date.now()}`,\n source,\n url,\n connected: false,\n onData: () => {},\n onError: () => {},\n disconnect: () => {\n connection.connected = false;\n }\n };\n\n // Simulate connection\n setTimeout(() => {\n connection.connected = true;\n }, 100);\n\n return connection;\n}\n\n/**\n * Monitor for anomalies in real-time\n */\nexport async function monitorAnomalies(\n stream: StreamConnection,\n config: StreamingAnomalyConfig\n): Promise<void> {\n const { columns, threshold, windowSize = 100 } = config;\n const window: any[] = [];\n\n // This would be implemented with actual streaming logic\n console.log(`Monitoring anomalies on columns: ${columns.join(', ')}`);\n}\n\n/**\n * Perform streaming aggregations\n */\nexport async function streamingAggregation(\n stream: StreamConnection,\n config: AggregationConfig\n): Promise<void> {\n const { windowType, windowSize, aggregations } = config;\n\n console.log(`Streaming aggregation: ${windowType} window of ${windowSize}`);\n}\n\n/**\n * Detect anomalies in streaming data\n */\nexport async function detectStreamingAnomalies(\n data: any[],\n config: StreamingAnomalyConfig\n): Promise<Anomaly[]> {\n const { columns, threshold, method = 'statistical' } = config;\n const anomalies: Anomaly[] = [];\n\n for (const column of columns) {\n const values = data.map(row => Number(row[column])).filter(v => !isNaN(v));\n \n if (values.length < 10) continue;\n\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const std = Math.sqrt(\n values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length\n );\n\n data.forEach((row, idx) => {\n const value = Number(row[column]);\n if (!isNaN(value)) {\n const zScore = Math.abs((value - mean) / std);\n if (zScore > threshold) {\n anomalies.push({\n rowIndex: idx,\n row,\n score: zScore / 10, // Normalize to 0-1\n reasons: [`${column} value ${value} is ${zScore.toFixed(2)} standard deviations from mean`],\n affectedColumns: [column]\n });\n }\n }\n });\n }\n\n return anomalies;\n}\n\n/**\n * Calculate windowed aggregations\n */\nexport async function calculateWindowedAggregations(\n data: any[],\n config: AggregationConfig\n): Promise<AggregationResult[]> {\n const { windowType, windowSize, aggregations } = config;\n const results: AggregationResult[] = [];\n\n // Tumbling window implementation\n if (windowType === 'tumbling') {\n for (let i = 0; i < data.length; i += windowSize) {\n const window = data.slice(i, i + windowSize);\n const windowResults: Record<string, number> = {};\n\n for (const agg of aggregations) {\n const values = window.map(row => Number(row[agg.column])).filter(v => !isNaN(v));\n \n let result = 0;\n switch (agg.function) {\n case 'sum':\n result = values.reduce((a, b) => a + b, 0);\n break;\n case 'avg':\n result = values.reduce((a, b) => a + b, 0) / values.length;\n break;\n case 'count':\n result = values.length;\n break;\n case 'min':\n result = Math.min(...values);\n break;\n case 'max':\n result = Math.max(...values);\n break;\n case 'std':\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n result = Math.sqrt(values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length);\n break;\n }\n\n windowResults[agg.alias || `${agg.column}_${agg.function}`] = result;\n }\n\n results.push({\n windowStart: new Date(Date.now() + i * 1000),\n windowEnd: new Date(Date.now() + (i + windowSize) * 1000),\n results: windowResults,\n rowCount: window.length\n });\n }\n }\n\n return results;\n}\n\n/**\n * Sample data intelligently\n */\nexport async function smartSample(\n data: any[],\n options: {\n size: number;\n method: 'random' | 'stratified' | 'systematic' | 'cluster';\n preserveDistribution?: boolean;\n }\n): Promise<{ data: any[]; method: string; originalSize: number; sampleSize: number; preservedDistribution: boolean; representativeness: number }> {\n const { size, method, preserveDistribution = true } = options;\n\n let sampledData: any[] = [];\n\n switch (method) {\n case 'random':\n sampledData = randomSample(data, size);\n break;\n case 'systematic':\n sampledData = systematicSample(data, size);\n break;\n case 'stratified':\n sampledData = stratifiedSample(data, size);\n break;\n default:\n sampledData = randomSample(data, size);\n }\n\n return {\n data: sampledData,\n method,\n originalSize: data.length,\n sampleSize: sampledData.length,\n preservedDistribution: preserveDistribution,\n representativeness: 0.85 // Simplified\n };\n}\n\n// Helper functions\nfunction randomSample(data: any[], size: number): any[] {\n const shuffled = [...data].sort(() => Math.random() - 0.5);\n return shuffled.slice(0, size);\n}\n\nfunction systematicSample(data: any[], size: number): any[] {\n const step = Math.floor(data.length / size);\n const sample: any[] = [];\n for (let i = 0; i < data.length && sample.length < size; i += step) {\n sample.push(data[i]);\n }\n return sample;\n}\n\nfunction stratifiedSample(data: any[], size: number): any[] {\n // Simplified stratified sampling\n return randomSample(data, size);\n}\n\n","/**\n * @aivue/tabular-intelligence\n * Tabular Foundation Model (TFM) integration for Vue.js\n */\n\n// Import Vue compatibility utilities from core\nimport {\n createCompatComponent,\n registerCompatComponent,\n createCompatPlugin\n} from '@aivue/core';\n\n// Import core classes and composables\nimport { TabularIntelligence } from './core/TabularIntelligence';\nimport { useTabularIntelligence } from './composables/useTabularIntelligence';\n\n// Export core classes and composables\nexport { TabularIntelligence };\nexport { useTabularIntelligence };\nexport type { UseTabularIntelligenceOptions, UseTabularIntelligenceReturn } from './composables/useTabularIntelligence';\n\n// Import components\nimport QuestionInputComponent from './components/QuestionInput.vue';\nimport AnswerDisplayComponent from './components/AnswerDisplay.vue';\nimport QuestionHistoryComponent from './components/QuestionHistory.vue';\n\n// Export components with compatibility layer\nexport const QuestionInput = createCompatComponent(QuestionInputComponent);\nexport const AnswerDisplay = createCompatComponent(AnswerDisplayComponent);\nexport const QuestionHistory = createCompatComponent(QuestionHistoryComponent);\n\n// Utils\nexport { inferSchema, inferColumnType, calculateStats, detectAnomalies } from './utils/helpers';\nexport { QAEngine, type QAEngineConfig } from './utils/qaEngine';\nexport { extractFromDOM, normalizeVueData } from './utils/tableExtractor';\nexport { parsePostmanCollection, replaceVariables, type ParsedCollection, type ParsedEndpoint } from './utils/postmanParser';\nexport { executeAPIRequest, executeMultipleRequests, convertToTabular, type APIRequestOptions, type APIResponse } from './utils/apiClient';\n\n// Types - Export all types\nexport * from './types';\n\n// ============================================================================\n// ADVANCED FEATURES\n// ============================================================================\n\n// Data Quality & Profiling\nexport {\n profileData,\n assessDataQuality,\n detectDataIssues,\n suggestCleaningSteps\n} from './quality/profiling';\n\n// Data Cleaning & Preprocessing\nexport { imputeMissingValues } from './preprocessing/imputation';\nexport { handleOutliers } from './preprocessing/outliers';\n\n// Time Series Analysis\nexport {\n forecastTimeSeries,\n detectTrends,\n detectSeasonality,\n detectChangePoints\n} from './advanced/timeseries';\n\n// AutoML Capabilities\nexport {\n autoTrain,\n compareModels,\n tuneHyperparameters\n} from './advanced/automl';\n\n// Feature Engineering\nexport {\n autoGenerateFeatures,\n createFeatures,\n analyzeFeatureImportance,\n selectBestFeatures\n} from './advanced/featureEngineering';\n\n// Model Explainability\nexport {\n explainPrediction,\n getFeatureImportance,\n getPartialDependence,\n generateCounterfactuals\n} from './advanced/explainability';\n\n// Statistical Testing & A/B Testing\nexport {\n analyzeABTest,\n testSignificance,\n calculateSampleSize\n} from './advanced/statistical';\n\n// Visualization Recommendations\nexport {\n recommendVisualizations,\n generateChartSpec,\n detectPatterns\n} from './advanced/visualization';\n\n// Multi-Table Analysis\nexport {\n joinTables,\n detectRelationships,\n analyzeCrossTables,\n inferDatabaseSchema\n} from './advanced/multitable';\n\n// Reporting & Insights\nexport {\n generateReport,\n generateExecutiveSummary,\n generateInsights\n} from './advanced/reporting';\n\n// Privacy & Compliance\nexport {\n detectPII,\n anonymizeData,\n checkCompliance\n} from './advanced/privacy';\n\n// Data Versioning & Pipelines\nexport {\n createSnapshot,\n compareSnapshots,\n trackLineage,\n addTransformation,\n createPipeline,\n executePipeline,\n savePipeline,\n loadPipeline\n} from './advanced/versioning';\n\n// Streaming & Real-time\nexport {\n connectStream,\n monitorAnomalies,\n streamingAggregation,\n detectStreamingAnomalies,\n calculateWindowedAggregations,\n smartSample\n} from './advanced/streaming';\n\n// ============================================================================\n// VUE PLUGIN\n// ============================================================================\n\nimport { App } from 'vue';\n\n/**\n * Vue Plugin for Tabular Intelligence\n * Provides global component registration with Vue 2/3 compatibility\n */\nexport const TabularIntelligencePlugin = createCompatPlugin({\n install(app: App) {\n // Register components globally using the compatibility helper\n registerCompatComponent(app, 'QuestionInput', QuestionInputComponent);\n registerCompatComponent(app, 'AnswerDisplay', AnswerDisplayComponent);\n registerCompatComponent(app, 'QuestionHistory', QuestionHistoryComponent);\n }\n});\n\n// ============================================================================\n// DEFAULT EXPORT\n// ============================================================================\n\nexport default {\n // Core\n TabularIntelligence,\n\n // Composables\n useTabularIntelligence,\n\n // Components\n QuestionInput,\n AnswerDisplay,\n QuestionHistory,\n\n // Plugin\n TabularIntelligencePlugin,\n\n // Re-export compatibility utilities for advanced users\n createCompatComponent,\n registerCompatComponent,\n createCompatPlugin\n};\n"],"names":["inferSchema","data","name","firstRow","key","type","inferColumnType","row","column","values","v","uniqueValues","calculateStats","count","nullCount","stats","numbers","n","sorted","a","b","sum","variance","acc","val","frequency","maxFreq","k","detectAnomalies","columns","sensitivity","anomalies","multiplier","idx","q1","q3","iqr","lowerBound","upperBound","value","existing","reason","QAEngine","config","request","startTime","question","schema","sampleSize","includeAggregates","sampledData","aggregates","prompt","llmResponse","error","step","sampled","i","counts","totalRows","isSampled","col","provider","apiKey","baseUrl","model","maxTokens","temperature","questionMatch","lowerQuestion","rowsMatch","totalRowsMatch","columnsMatch","sampleRows","line","response","_b","_a","headers","parsed","extractFromDOM","options","selector","includeHeaders","maxRows","inferTypes","skipEmptyRows","tableElement","rows","dataStartIndex","headerRow","cell","index","_","rowsToProcess","cells","rowData","columnName","numValue","createBasicSchema","normalizeVueData","processedData","columnNames","rowCount","parsePostmanCollection","collection","variables","collectionAuth","parseAuth","endpoints","parseItems","items","parentPath","item","parseEndpoint","h","queryParams","q","auth","credentials","replaceVariables","text","result","regex","executeAPIRequest","endpoint","additionalHeaders","additionalParams","url","allParams","queryString","keyName","keyValue","token","username","password","encoded","responseHeaders","executeMultipleRequests","results","convertToTabular","TabularIntelligence","qaConfig","processingTime","tfmRequest","metadata","baseResult","safeConfig","endpointName","e","allVariables","qaRequest","qaResponse","executionTime","useTabularIntelligence","client","loading","ref","lastResult","questionHistory","answerHistory","lastAnswer","maxQuestionHistory","useLocalFallback","analyze","analysisOptions","performLocalAnalysis","err","currentSchema","numericColumns","features","clusters","correlations","f1","f2","getDescriptiveStats","detectAnomaliesMethod","performClustering","numClusters","predict","targetColumn","predictionOptions","updateConfig","newConfig","setData","newData","autoInferSchema","reset","askQuestion","qaOptions","answer","questionObj","generateSummary","clearHistory","extractOptions","extracted","loadFromVueGrid","gridData","initializeQA","props","__props","emit","__emit","questionText","handleSubmit","handleNewLine","event","showSupporting","formatTimestamp","timestamp","reversedQuestions","computed","formatTime","date","diff","minutes","hours","days","profileData","columnProfiles","profile","profileColumn","c","calculateCorrelations","duplicates","detectDuplicates","memoryUsage","estimateMemoryUsage","warnings","generateWarnings","qualityScore","calculateQualityScore","detectColumnType","missingCount","missingPercentage","uniqueCount","uniquePercentage","calculateNumericStats","analyzeCategorical","analyzeDateRange","assessColumnQuality","nonNullValues","numericValues","mean","median","min","max","std","outliers","skewness","kurtosis","valueCounts","topValues","entropy","p","uniqueRatio","cardinality","dates","d","earliest","latest","spanMs","spanDays","span","issues","recommendations","score","matrix","significant","j","correlation","calculatePearsonCorrelation","x","y","validPairs","xi","yi","xValues","yValues","meanX","meanY","numerator","sumXSquared","sumYSquared","xDiff","yDiff","denominator","seen","jsonString","bytes","profiles","duplicatePercentage","lowQualityColumns","highMissingColumns","avgColumnScore","duplicatePenalty","assessDataQuality","detectDataIssues","completeness","uniqueness","consistency","validity","accuracy","overallScore","generateRecommendations","suggestCleaningSteps","missingColumns","outlierColumns","imputeMissingValues","strategy","targetColumns","imputedData","totalImputed","details","missingIndices","imputedValue","calculateMean","calculateMedian","calculateMode","knnImputation","iterativeImputation","aiImputation","calculateImputationConfidence","mid","maxCount","mode","otherColumns","missingIdx","neighbors","distance","val1","val2","neighborValues","predictorColumns","completeCases","weightedSum","totalWeight","completeCase","similarity","validComparisons","weight","handleOutliers","method","resultData","outliersDetected","outliersRemoved","detectOutliers","outlierIndices","o","bounds","calculateBounds","outlier","detectOutliersIQR","detectOutliersZScore","threshold","forecastTimeSeries","dateColumn","valueColumn","horizon","confidence","timeSeries","alpha","predictions","level","lastTimestamp","interval","detectTimeInterval","forecastTimestamp","forecastValue","margin","calculateStd","trendResult","detectTrend","seasonality","detectSeasonality","detectTrends","valueColumns","periods","maxCorrelation","detectedPeriod","period","calculateAutocorrelation","detected","periodName","detectChangePoints","changePoints","windowSize","before","after","meanBefore","meanAfter","magnitude","intervals","slope","direction","strength","lag","autoTrain","taskType","metric","models","X","f","allModels","modelType","performance","trainModel","metricKey","bestModel","best","current","bestScore","featureImportance","calculateFeatureImportance","compareModels","crossValidation","detectTaskType","performances","modelName","winner","tuneHyperparameters","iterations","allTrials","parameters","generateRandomParameters","bestTrial","defaultPerformance","defaultScore","metrics","getMostFrequent","calculateClassificationMetrics","calculateRegressionMetrics","yTrue","yPred","mse","mae","sst","sse","r2Score","arr","feature","m","autoGenerateFeatures","maxFeatures","includeInteractions","includePolynomials","originalColumns","newFeatures","squaredName","col1","col2","interactionName","createFeatures","transformations","transform","applyTransformation","analyzeFeatureImportance","importances","featureValues","targetValues","calculateCorrelation","imp","selectBestFeatures","topK","outputName","newRow","explainPrediction","rowIndex","shapValues","shapValue","topFeatures","sv","prediction","baseValue","r","explanation","getFeatureImportance","getPartialDependence","plotValues","generateCounterfactuals","desiredOutcome","maxChanges","original","counterfactuals","counterfactual","changes","featuresToChange","originalValue","newValue","analyzeABTest","controlGroup","treatmentGroup","confidenceLevel","controlValues","treatmentValues","controlMean","treatmentMean","controlStd","treatmentStd","pValue","tTest","pooledStd","effectSize","recommendation","testSignificance","test","groups","group1Values","group2Values","statistic","calculateSampleSize","effect","power","group1","group2","mean1","mean2","var1","var2","n1","n2","pooledVar","normalCDF","z","t","recommendVisualizations","categoricalColumns","dateColumns","generateChartSpec","xColumn","yColumn","groupBy","spec","yType","detectPatterns","chartType","insights","joinTables","leftTable","rightTable","leftKey","rightKey","joinType","rightIndex","rightRow","leftRow","matches","leftKeys","detectRelationships","tables","relationships","tableNames","table1Name","table2Name","table1","table2","columns1","columns2","relationship","analyzeColumnRelationship","analyzeCrossTables","joinOperations","rel","inferDatabaseSchema","schemaTable","tableName","colName","values1","values2","matchingRows","generateReport","format","sections","includeCharts","reportSections","generateExecutiveSummary","generateStatsSection","generateRecommendationsSection","columnCount","generateInsights","maxInsights","detectPII","piiColumns","sampleValues","maskEmail","maskPhone","riskLevel","generatePIIRecommendations","anonymizeData","anonymizeValue","calculatePrivacyLevel","checkCompliance","standard","piiResult","violations","compliant","email","local","domain","phone","hashValue","hash","char","snapshots","lineages","createSnapshot","label","id","snapshot","calculateChecksum","compareSnapshots","snapshot1Id","snapshot2Id","snap1","snap2","columnsAdded","columnsRemoved","rowsAdded","rowsRemoved","trackLineage","dataId","source","lineage","addTransformation","operation","params","createPipeline","steps","executePipeline","pipeline","currentData","errors","stepsExecuted","executeStep","savePipeline","loadPipeline","str","connectStream","updateInterval","connection","monitorAnomalies","stream","streamingAggregation","windowType","aggregations","detectStreamingAnomalies","zScore","calculateWindowedAggregations","window","windowResults","agg","smartSample","size","preserveDistribution","randomSample","systematicSample","stratifiedSample","sample","QuestionInput","createCompatComponent","QuestionInputComponent","AnswerDisplay","AnswerDisplayComponent","QuestionHistory","QuestionHistoryComponent","TabularIntelligencePlugin","createCompatPlugin","app","registerCompatComponent"],"mappings":"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"}