@aivue/tabular-intelligence 1.3.7 → 1.3.9
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 +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +232 -225
- package/dist/index.mjs.map +1 -1
- package/dist/utils/qaEngine.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","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"],"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 // 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 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 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. Answer ONLY based on the data provided above.\\n`;\n prompt += `2. If the question cannot be answered from the available data, clearly state \"I cannot answer this question from the available data\" and explain why.\\n`;\n prompt += `3. Provide a clear, concise answer.\\n`;\n prompt += `4. Include specific numbers or examples from the data when relevant.\\n`;\n prompt += `5. If the answer is based on sampled data, mention that it's an approximation.\\n`;\n prompt += `6. 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 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 (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 * 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"],"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","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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","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"],"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. Answer ONLY based on the data provided above.\\n`;\n prompt += `2. If the question cannot be answered from the available data, clearly state \"I cannot answer this question from the available data\" and explain why.\\n`;\n prompt += `3. Provide a clear, concise answer.\\n`;\n prompt += `4. Include specific numbers or examples from the data when relevant.\\n`;\n prompt += `5. If the answer is based on sampled data, mention that it's an approximation.\\n`;\n prompt += `6. 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 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 (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 * 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"],"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","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"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qaEngine.d.ts","sourceRoot":"","sources":["../../src/utils/qaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAuB,MAAM,UAAU,CAAC;AAG3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAQlC;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"qaEngine.d.ts","sourceRoot":"","sources":["../../src/utils/qaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAuB,MAAM,UAAU,CAAC;AAG3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAQlC;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAsD7D;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiDnB;;OAEG;YACW,OAAO;IAcrB;;OAEG;YACW,UAAU;IAwBxB;;OAEG;YACW,aAAa;IAwB3B;;OAEG;YACW,aAAa;IAuB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IA2BrB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
|
package/package.json
CHANGED