@aivue/tabular-intelligence 1.3.1 → 1.3.4

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.mjs CHANGED
@@ -1,23 +1,23 @@
1
- import { ref as S, defineComponent as z, createElementBlock as p, openBlock as f, createElementVNode as m, createCommentVNode as q, withDirectives as Z, withKeys as R, withModifiers as V, vModelText as ee, toDisplayString as A, normalizeClass as te, createTextVNode as ne, Fragment as O, renderList as Q, computed as se } from "vue";
2
- function P(c, e) {
3
- if (c.length === 0)
1
+ import { ref as E, defineComponent as U, createElementBlock as p, openBlock as g, createElementVNode as h, createCommentVNode as q, withDirectives as ee, withKeys as L, withModifiers as H, vModelText as te, toDisplayString as k, normalizeClass as ne, createTextVNode as se, Fragment as Q, renderList as j, computed as ae } from "vue";
2
+ function M(i, e) {
3
+ if (i.length === 0)
4
4
  return { columns: [], rowCount: 0, name: e };
5
- const t = c[0];
5
+ const t = i[0];
6
6
  return {
7
7
  columns: Object.keys(t).map((s) => {
8
- const a = L(c, s);
8
+ const a = O(i, s);
9
9
  return {
10
10
  name: s,
11
11
  type: a,
12
- nullable: c.some((r) => r[s] == null)
12
+ nullable: i.some((o) => o[s] == null)
13
13
  };
14
14
  }),
15
- rowCount: c.length,
15
+ rowCount: i.length,
16
16
  name: e
17
17
  };
18
18
  }
19
- function L(c, e) {
20
- const t = c.map((s) => s[e]).filter((s) => s != null);
19
+ function O(i, e) {
20
+ const t = i.map((s) => s[e]).filter((s) => s != null);
21
21
  if (t.length === 0) return "string";
22
22
  if (t.every((s) => typeof s == "number" || !isNaN(Number(s))))
23
23
  return "number";
@@ -28,59 +28,59 @@ function L(c, e) {
28
28
  const n = new Set(t);
29
29
  return n.size < t.length * 0.5 && n.size < 20 ? "categorical" : "string";
30
30
  }
31
- function H(c, e, t) {
32
- const n = c.map((o) => o[e]).filter((o) => o != null), s = n.length, a = c.length - s, r = {
31
+ function J(i, e, t) {
32
+ const n = i.map((r) => r[e]).filter((r) => r != null), s = n.length, a = i.length - s, o = {
33
33
  column: e,
34
34
  count: s,
35
35
  nullCount: a
36
36
  };
37
37
  if (t === "number") {
38
- const o = n.map(Number).filter((i) => !isNaN(i));
39
- if (o.length > 0) {
40
- const i = [...o].sort((h, u) => h - u), l = o.reduce((h, u) => h + u, 0);
41
- r.mean = l / o.length, r.median = i[Math.floor(i.length / 2)], r.min = i[0], r.max = i[i.length - 1];
42
- const g = o.reduce((h, u) => h + Math.pow(u - r.mean, 2), 0) / o.length;
43
- r.std = Math.sqrt(g), r.percentiles = {
44
- 25: i[Math.floor(i.length * 0.25)],
45
- 50: r.median,
46
- 75: i[Math.floor(i.length * 0.75)],
47
- 90: i[Math.floor(i.length * 0.9)]
38
+ const r = n.map(Number).filter((c) => !isNaN(c));
39
+ if (r.length > 0) {
40
+ const c = [...r].sort((f, d) => f - d), l = r.reduce((f, d) => f + d, 0);
41
+ o.mean = l / r.length, o.median = c[Math.floor(c.length / 2)], o.min = c[0], o.max = c[c.length - 1];
42
+ const w = r.reduce((f, d) => f + Math.pow(d - o.mean, 2), 0) / r.length;
43
+ o.std = Math.sqrt(w), o.percentiles = {
44
+ 25: c[Math.floor(c.length * 0.25)],
45
+ 50: o.median,
46
+ 75: c[Math.floor(c.length * 0.75)],
47
+ 90: c[Math.floor(c.length * 0.9)]
48
48
  };
49
49
  }
50
50
  } else {
51
- const o = new Set(n);
52
- r.uniqueValues = o.size;
53
- const i = {};
54
- n.forEach((g) => {
55
- const h = String(g);
56
- i[h] = (i[h] || 0) + 1;
51
+ const r = new Set(n);
52
+ o.uniqueValues = r.size;
53
+ const c = {};
54
+ n.forEach((w) => {
55
+ const f = String(w);
56
+ c[f] = (c[f] || 0) + 1;
57
57
  });
58
- const l = Math.max(...Object.values(i));
59
- r.mode = Object.keys(i).find((g) => i[g] === l);
58
+ const l = Math.max(...Object.values(c));
59
+ o.mode = Object.keys(c).find((w) => c[w] === l);
60
60
  }
61
- return r;
61
+ return o;
62
62
  }
63
- function ae(c, e, t = 0.5) {
63
+ function re(i, e, t = 0.5) {
64
64
  const n = [], s = 1.5 + (1 - t) * 1.5;
65
65
  return e.forEach((a) => {
66
- const r = c.map((w, v) => ({ value: Number(w[a]), idx: v })).filter((w) => !isNaN(w.value));
67
- if (r.length === 0) return;
68
- const o = [...r].sort((w, v) => w.value - v.value), i = o[Math.floor(o.length * 0.25)].value, l = o[Math.floor(o.length * 0.75)].value, g = l - i, h = i - s * g, u = l + s * g;
69
- r.forEach(({ value: w, idx: v }) => {
70
- if (w < h || w > u) {
71
- const $ = n.find((E) => E.rowIndex === v), k = w < h ? `${a}: ${w.toFixed(2)} < ${h.toFixed(2)}` : `${a}: ${w.toFixed(2)} > ${u.toFixed(2)}`;
72
- $ ? ($.reasons.push(k), $.affectedColumns.push(a), $.score = Math.min(1, $.score + 0.2)) : n.push({
73
- rowIndex: v,
74
- row: c[v],
66
+ const o = i.map((y, A) => ({ value: Number(y[a]), idx: A })).filter((y) => !isNaN(y.value));
67
+ if (o.length === 0) return;
68
+ const r = [...o].sort((y, A) => y.value - A.value), c = r[Math.floor(r.length * 0.25)].value, l = r[Math.floor(r.length * 0.75)].value, w = l - c, f = c - s * w, d = l + s * w;
69
+ o.forEach(({ value: y, idx: A }) => {
70
+ if (y < f || y > d) {
71
+ const _ = n.find((T) => T.rowIndex === A), x = y < f ? `${a}: ${y.toFixed(2)} < ${f.toFixed(2)}` : `${a}: ${y.toFixed(2)} > ${d.toFixed(2)}`;
72
+ _ ? (_.reasons.push(x), _.affectedColumns.push(a), _.score = Math.min(1, _.score + 0.2)) : n.push({
73
+ rowIndex: A,
74
+ row: i[A],
75
75
  score: 0.7,
76
- reasons: [k],
76
+ reasons: [x],
77
77
  affectedColumns: [a]
78
78
  });
79
79
  }
80
80
  });
81
- }), n.sort((a, r) => r.score - a.score);
81
+ }), n.sort((a, o) => o.score - a.score);
82
82
  }
83
- class U {
83
+ class B {
84
84
  constructor(e) {
85
85
  this.config = {
86
86
  maxTokens: 1e3,
@@ -94,9 +94,9 @@ class U {
94
94
  async answerQuestion(e) {
95
95
  const t = Date.now();
96
96
  try {
97
- const { question: n, schema: s, data: a = [], sampleSize: r = 100, includeAggregates: o = !0 } = e, i = a.length > r ? this.sampleData(a, r) : a, l = o ? this.calculateAggregates(a, s) : void 0, g = this.buildPrompt(n, s, i, l, a.length), h = await this.callLLM(g);
97
+ const { question: n, schema: s, data: a = [], sampleSize: o = 100, includeAggregates: r = !0 } = e, c = a.length > o ? this.sampleData(a, o) : a, l = r ? this.calculateAggregates(a, s) : void 0, w = this.buildPrompt(n, s, c, l, a.length), f = await this.callLLM(w);
98
98
  return {
99
- answer: this.parseResponse(h, n, a.length > r),
99
+ answer: this.parseResponse(f, n, a.length > o),
100
100
  processingTime: Date.now() - t
101
101
  };
102
102
  } catch (n) {
@@ -132,7 +132,7 @@ class U {
132
132
  for (const s of t.columns)
133
133
  if (s.type === "number" && e.length > 0)
134
134
  try {
135
- const a = H(e, s.name, "number");
135
+ const a = J(e, s.name, "number");
136
136
  n[s.name] = {
137
137
  mean: a.mean,
138
138
  median: a.median,
@@ -143,9 +143,9 @@ class U {
143
143
  } catch {
144
144
  }
145
145
  else if (s.type === "categorical" || s.type === "string") {
146
- const a = e.map((o) => o[s.name]).filter((o) => o != null), r = new Set(a);
146
+ const a = e.map((r) => r[s.name]).filter((r) => r != null), o = new Set(a);
147
147
  n[s.name] = {
148
- uniqueCount: r.size,
148
+ uniqueCount: o.size,
149
149
  totalCount: a.length,
150
150
  topValues: this.getTopValues(a, 5)
151
151
  };
@@ -165,51 +165,51 @@ class U {
165
165
  * Build prompt for LLM
166
166
  */
167
167
  buildPrompt(e, t, n, s, a) {
168
- const r = a && a > n.length;
169
- let o = `You are a data analyst assistant. Answer the following question about a table dataset.
168
+ const o = a && a > n.length;
169
+ let r = `You are a data analyst assistant. Answer the following question about a table dataset.
170
170
 
171
171
  `;
172
- o += `**Table Schema:**
173
- `, o += `Table: ${t.name}
174
- `, o += `Columns:
172
+ r += `**Table Schema:**
173
+ `, r += `Table: ${t.name}
174
+ `, r += `Columns:
175
175
  `;
176
- for (const i of t.columns)
177
- o += `- ${i.name} (${i.type})
176
+ for (const c of t.columns)
177
+ r += `- ${c.name} (${c.type})
178
178
  `;
179
- return o += `
180
- `, s && Object.keys(s).length > 0 && (o += `**Summary Statistics:**
181
- `, o += JSON.stringify(s, null, 2), o += `
179
+ return r += `
180
+ `, s && Object.keys(s).length > 0 && (r += `**Summary Statistics:**
181
+ `, r += JSON.stringify(s, null, 2), r += `
182
182
 
183
- `), o += `**Sample Data** (${n.length} rows${r ? ` out of ${a} total` : ""}):
184
- `, o += JSON.stringify(n.slice(0, 10), null, 2), o += `
183
+ `), r += `**Sample Data** (${n.length} rows${o ? ` out of ${a} total` : ""}):
184
+ `, r += JSON.stringify(n.slice(0, 10), null, 2), r += `
185
185
 
186
- `, o += `**Question:** ${e}
186
+ `, r += `**Question:** ${e}
187
187
 
188
- `, o += `**Instructions:**
189
- `, o += `1. Answer ONLY based on the data provided above.
190
- `, o += `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.
191
- `, o += `3. Provide a clear, concise answer.
192
- `, o += `4. Include specific numbers or examples from the data when relevant.
193
- `, o += `5. If the answer is based on sampled data, mention that it's an approximation.
194
- `, o += `6. Format your response as JSON with the following structure:
195
- `, o += `{
196
- `, o += ` "answer": "Your answer text here",
197
- `, o += ` "confidence": 0.0-1.0,
198
- `, o += ` "cannotAnswer": false,
199
- `, o += ` "isApproximate": ${r},
200
- `, o += ` "supportingData": { "key": "value" } // optional
201
- `, o += `}
202
- `, o;
188
+ `, r += `**Instructions:**
189
+ `, r += `1. Answer ONLY based on the data provided above.
190
+ `, r += `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.
191
+ `, r += `3. Provide a clear, concise answer.
192
+ `, r += `4. Include specific numbers or examples from the data when relevant.
193
+ `, r += `5. If the answer is based on sampled data, mention that it's an approximation.
194
+ `, r += `6. Format your response as JSON with the following structure:
195
+ `, r += `{
196
+ `, r += ` "answer": "Your answer text here",
197
+ `, r += ` "confidence": 0.0-1.0,
198
+ `, r += ` "cannotAnswer": false,
199
+ `, r += ` "isApproximate": ${o},
200
+ `, r += ` "supportingData": { "key": "value" } // optional
201
+ `, r += `}
202
+ `, r;
203
203
  }
204
204
  /**
205
205
  * Call LLM API
206
206
  */
207
207
  async callLLM(e) {
208
- const { provider: t, apiKey: n, baseUrl: s, model: a, maxTokens: r, temperature: o } = this.config;
208
+ const { provider: t, apiKey: n, baseUrl: s, model: a, maxTokens: o, temperature: r } = this.config;
209
209
  if (t === "openai")
210
- return this.callOpenAI(e, n, a || "gpt-4-turbo-preview", r, o);
210
+ return this.callOpenAI(e, n, a || "gpt-4-turbo-preview", o, r);
211
211
  if (t === "anthropic")
212
- return this.callAnthropic(e, n, a || "claude-3-5-sonnet-20241022", r, o);
212
+ return this.callAnthropic(e, n, a || "claude-3-5-sonnet-20241022", o, r);
213
213
  if (t === "custom" && s)
214
214
  return this.callCustomAPI(e, s, n);
215
215
  throw new Error(`Unsupported provider: ${t}`);
@@ -218,8 +218,8 @@ class U {
218
218
  * Call OpenAI API
219
219
  */
220
220
  async callOpenAI(e, t, n, s, a) {
221
- var i, l;
222
- const r = await fetch("https://api.openai.com/v1/chat/completions", {
221
+ var c, l;
222
+ const o = await fetch("https://api.openai.com/v1/chat/completions", {
223
223
  method: "POST",
224
224
  headers: {
225
225
  "Content-Type": "application/json",
@@ -233,16 +233,16 @@ class U {
233
233
  response_format: { type: "json_object" }
234
234
  })
235
235
  });
236
- if (!r.ok)
237
- throw new Error(`OpenAI API error: ${r.statusText}`);
238
- return ((l = (i = (await r.json()).choices[0]) == null ? void 0 : i.message) == null ? void 0 : l.content) || "";
236
+ if (!o.ok)
237
+ throw new Error(`OpenAI API error: ${o.statusText}`);
238
+ return ((l = (c = (await o.json()).choices[0]) == null ? void 0 : c.message) == null ? void 0 : l.content) || "";
239
239
  }
240
240
  /**
241
241
  * Call Anthropic API
242
242
  */
243
243
  async callAnthropic(e, t, n, s, a) {
244
- var i;
245
- const r = await fetch("https://api.anthropic.com/v1/messages", {
244
+ var c;
245
+ const o = await fetch("https://api.anthropic.com/v1/messages", {
246
246
  method: "POST",
247
247
  headers: {
248
248
  "Content-Type": "application/json",
@@ -256,9 +256,9 @@ class U {
256
256
  messages: [{ role: "user", content: e }]
257
257
  })
258
258
  });
259
- if (!r.ok)
260
- throw new Error(`Anthropic API error: ${r.statusText}`);
261
- return ((i = (await r.json()).content[0]) == null ? void 0 : i.text) || "";
259
+ if (!o.ok)
260
+ throw new Error(`Anthropic API error: ${o.statusText}`);
261
+ return ((c = (await o.json()).content[0]) == null ? void 0 : c.text) || "";
262
262
  }
263
263
  /**
264
264
  * Call custom API
@@ -275,8 +275,8 @@ class U {
275
275
  });
276
276
  if (!a.ok)
277
277
  throw new Error(`Custom API error: ${a.statusText}`);
278
- const r = await a.json();
279
- return r.response || r.answer || JSON.stringify(r);
278
+ const o = await a.json();
279
+ return o.response || o.answer || JSON.stringify(o);
280
280
  }
281
281
  /**
282
282
  * Parse LLM response
@@ -311,88 +311,88 @@ class U {
311
311
  return `qa_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
312
312
  }
313
313
  }
314
- function oe(c = {}) {
314
+ function oe(i = {}) {
315
315
  const {
316
316
  selector: e = "table",
317
317
  includeHeaders: t = !0,
318
318
  maxRows: n,
319
319
  inferTypes: s = !0,
320
320
  skipEmptyRows: a = !0
321
- } = c, r = document.querySelector(e);
322
- if (!r || r.tagName !== "TABLE")
321
+ } = i, o = document.querySelector(e);
322
+ if (!o || o.tagName !== "TABLE")
323
323
  return console.warn(`No table found with selector: ${e}`), null;
324
- const i = Array.from(r.rows);
325
- if (i.length === 0)
324
+ const c = Array.from(o.rows);
325
+ if (c.length === 0)
326
326
  return null;
327
- let l = [], g = 0;
328
- if (t && i[0]) {
329
- const v = i[0];
330
- l = Array.from(v.cells).map(($, k) => {
331
- var _;
332
- return ((_ = $.textContent) == null ? void 0 : _.trim()) || "" || `Column${k + 1}`;
333
- }), g = 1;
327
+ let l = [], w = 0;
328
+ if (t && c[0]) {
329
+ const A = c[0];
330
+ l = Array.from(A.cells).map((_, x) => {
331
+ var D;
332
+ return ((D = _.textContent) == null ? void 0 : D.trim()) || "" || `Column${x + 1}`;
333
+ }), w = 1;
334
334
  } else {
335
- const v = i[0];
336
- l = Array.from(v.cells).map(($, k) => `Column${k + 1}`);
335
+ const A = c[0];
336
+ l = Array.from(A.cells).map((_, x) => `Column${x + 1}`);
337
337
  }
338
- const h = [], u = n ? i.slice(g, g + n) : i.slice(g);
339
- for (const v of u) {
340
- const $ = Array.from(v.cells);
341
- if (a && $.every((E) => {
342
- var _;
343
- return !((_ = E.textContent) != null && _.trim());
338
+ const f = [], d = n ? c.slice(w, w + n) : c.slice(w);
339
+ for (const A of d) {
340
+ const _ = Array.from(A.cells);
341
+ if (a && _.every((T) => {
342
+ var D;
343
+ return !((D = T.textContent) != null && D.trim());
344
344
  }))
345
345
  continue;
346
- const k = {};
347
- $.forEach((E, _) => {
348
- var M;
349
- const j = l[_] || `Column${_ + 1}`;
350
- let D = ((M = E.textContent) == null ? void 0 : M.trim()) || "";
351
- if (s && D) {
352
- const N = parseFloat(D);
353
- !isNaN(N) && D === N.toString() && (D = N);
346
+ const x = {};
347
+ _.forEach((T, D) => {
348
+ var z;
349
+ const F = l[D] || `Column${D + 1}`;
350
+ let I = ((z = T.textContent) == null ? void 0 : z.trim()) || "";
351
+ if (s && I) {
352
+ const N = parseFloat(I);
353
+ !isNaN(N) && I === N.toString() && (I = N);
354
354
  }
355
- k[j] = D;
356
- }), h.push(k);
355
+ x[F] = I;
356
+ }), f.push(x);
357
357
  }
358
358
  return {
359
- schema: s && h.length > 0 ? P(h, "Extracted Table") : ie(l, h.length),
360
- data: h,
359
+ schema: s && f.length > 0 ? M(f, "Extracted Table") : ce(l, f.length),
360
+ data: f,
361
361
  source: "dom",
362
362
  metadata: {
363
363
  selector: e,
364
- rowCount: h.length,
364
+ rowCount: f.length,
365
365
  columnCount: l.length,
366
366
  extractedAt: /* @__PURE__ */ new Date()
367
367
  }
368
368
  };
369
369
  }
370
- function re(c, e, t = {}) {
371
- const { maxRows: n, inferTypes: s = !0 } = t, a = n ? c.slice(0, n) : c;
372
- let r;
373
- return e && e.length > 0 ? r = {
370
+ function ie(i, e, t = {}) {
371
+ const { maxRows: n, inferTypes: s = !0 } = t, a = n ? i.slice(0, n) : i;
372
+ let o;
373
+ return e && e.length > 0 ? o = {
374
374
  name: "Vue Data Grid",
375
- columns: e.map((o) => ({
376
- name: o.field,
377
- type: s && a.length > 0 ? L(a, o.field) : "string",
375
+ columns: e.map((r) => ({
376
+ name: r.field,
377
+ type: s && a.length > 0 ? O(a, r.field) : "string",
378
378
  nullable: !0
379
379
  })),
380
380
  rowCount: a.length
381
- } : a.length > 0 ? r = P(a, "Vue Data Grid") : r = { name: "Vue Data Grid", columns: [], rowCount: 0 }, {
382
- schema: r,
381
+ } : a.length > 0 ? o = M(a, "Vue Data Grid") : o = { name: "Vue Data Grid", columns: [], rowCount: 0 }, {
382
+ schema: o,
383
383
  data: a,
384
384
  source: "vue",
385
385
  metadata: {
386
386
  rowCount: a.length,
387
- columnCount: r.columns.length,
387
+ columnCount: o.columns.length,
388
388
  extractedAt: /* @__PURE__ */ new Date()
389
389
  }
390
390
  };
391
391
  }
392
- function ie(c, e = 0) {
392
+ function ce(i, e = 0) {
393
393
  return {
394
394
  name: "Extracted Table",
395
- columns: c.map((t) => ({
395
+ columns: i.map((t) => ({
396
396
  name: t,
397
397
  type: "string",
398
398
  nullable: !0
@@ -400,37 +400,37 @@ function ie(c, e = 0) {
400
400
  rowCount: e
401
401
  };
402
402
  }
403
- function ce(c) {
403
+ function le(i) {
404
404
  const e = {};
405
- c.variable && c.variable.forEach((a) => {
405
+ i.variable && i.variable.forEach((a) => {
406
406
  e[a.key] = a.value;
407
407
  });
408
- const t = c.auth ? B(c.auth) : void 0, n = [];
409
- function s(a, r = "") {
410
- a.forEach((o) => {
411
- o.item ? s(o.item, r ? `${r}/${o.name}` : o.name) : o.request && n.push(le(o, t));
408
+ const t = i.auth ? K(i.auth) : void 0, n = [];
409
+ function s(a, o = "") {
410
+ a.forEach((r) => {
411
+ r.item ? s(r.item, o ? `${o}/${r.name}` : r.name) : r.request && n.push(ue(r, t));
412
412
  });
413
413
  }
414
- return s(c.item), {
415
- name: c.info.name,
416
- description: c.info.description,
414
+ return s(i.item), {
415
+ name: i.info.name,
416
+ description: i.info.description,
417
417
  endpoints: n,
418
418
  variables: e,
419
419
  auth: t
420
420
  };
421
421
  }
422
- function le(c, e) {
423
- const t = c.request, n = {};
424
- t.header && t.header.forEach((r) => {
425
- n[r.key] = r.value;
422
+ function ue(i, e) {
423
+ const t = i.request, n = {};
424
+ t.header && t.header.forEach((o) => {
425
+ n[o.key] = o.value;
426
426
  });
427
427
  const s = {};
428
- t.url.query && t.url.query.forEach((r) => {
429
- s[r.key] = r.value;
428
+ t.url.query && t.url.query.forEach((o) => {
429
+ s[o.key] = o.value;
430
430
  });
431
- const a = t.auth ? B(t.auth) : e;
431
+ const a = t.auth ? K(t.auth) : e;
432
432
  return {
433
- name: c.name,
433
+ name: i.name,
434
434
  method: t.method,
435
435
  url: t.url.raw,
436
436
  description: t.description,
@@ -439,67 +439,67 @@ function le(c, e) {
439
439
  auth: a
440
440
  };
441
441
  }
442
- function B(c) {
442
+ function K(i) {
443
443
  const e = {};
444
- return c.apikey ? c.apikey.forEach((t) => {
444
+ return i.apikey ? i.apikey.forEach((t) => {
445
445
  e[t.key] = t.value;
446
- }) : c.bearer ? c.bearer.forEach((t) => {
446
+ }) : i.bearer ? i.bearer.forEach((t) => {
447
447
  e[t.key] = t.value;
448
- }) : c.basic && c.basic.forEach((t) => {
448
+ }) : i.basic && i.basic.forEach((t) => {
449
449
  e[t.key] = t.value;
450
450
  }), {
451
- type: c.type,
451
+ type: i.type,
452
452
  credentials: e
453
453
  };
454
454
  }
455
- function I(c, e) {
456
- let t = c;
455
+ function P(i, e) {
456
+ let t = i;
457
457
  return Object.keys(e).forEach((n) => {
458
458
  const s = new RegExp(`{{${n}}}`, "g");
459
459
  t = t.replace(s, e[n]);
460
460
  }), t;
461
461
  }
462
- async function J(c) {
463
- const { endpoint: e, variables: t = {}, additionalHeaders: n = {}, additionalParams: s = {} } = c;
462
+ async function G(i) {
463
+ const { endpoint: e, variables: t = {}, additionalHeaders: n = {}, additionalParams: s = {} } = i;
464
464
  try {
465
- let a = I(e.url, t);
466
- const r = { ...e.queryParams, ...t, ...s }, o = Object.keys(r).filter((u) => r[u] !== void 0 && r[u] !== "").map((u) => `${encodeURIComponent(u)}=${encodeURIComponent(I(String(r[u]), t))}`).join("&");
467
- o && (a = a.includes("?") ? `${a}&${o}` : `${a}?${o}`);
468
- const i = {
465
+ let a = P(e.url, t);
466
+ const o = { ...e.queryParams, ...t, ...s }, r = Object.keys(o).filter((d) => o[d] !== void 0 && o[d] !== "").map((d) => `${encodeURIComponent(d)}=${encodeURIComponent(P(String(o[d]), t))}`).join("&");
467
+ r && (a = a.includes("?") ? `${a}&${r}` : `${a}?${r}`);
468
+ const c = {
469
469
  "Content-Type": "application/json",
470
470
  ...e.headers,
471
471
  ...n
472
472
  };
473
- if (Object.keys(i).forEach((u) => {
474
- i[u] = I(i[u], t);
473
+ if (Object.keys(c).forEach((d) => {
474
+ c[d] = P(c[d], t);
475
475
  }), e.auth) {
476
476
  if (e.auth.type === "apikey") {
477
- const u = e.auth.credentials.key || "access_key", w = I(e.auth.credentials.value || "", t);
478
- e.auth.credentials.in === "header" && (i[u] = w);
477
+ const d = e.auth.credentials.key || "access_key", y = P(e.auth.credentials.value || "", t);
478
+ e.auth.credentials.in === "header" && (c[d] = y);
479
479
  } else if (e.auth.type === "bearer") {
480
- const u = I(e.auth.credentials.token || "", t);
481
- i.Authorization = `Bearer ${u}`;
480
+ const d = P(e.auth.credentials.token || "", t);
481
+ c.Authorization = `Bearer ${d}`;
482
482
  } else if (e.auth.type === "basic") {
483
- const u = I(e.auth.credentials.username || "", t), w = I(e.auth.credentials.password || "", t), v = btoa(`${u}:${w}`);
484
- i.Authorization = `Basic ${v}`;
483
+ const d = P(e.auth.credentials.username || "", t), y = P(e.auth.credentials.password || "", t), A = btoa(`${d}:${y}`);
484
+ c.Authorization = `Basic ${A}`;
485
485
  }
486
486
  }
487
487
  const l = await fetch(a, {
488
488
  method: e.method,
489
- headers: i
490
- }), g = {};
491
- return l.headers.forEach((u, w) => {
492
- g[w] = u;
489
+ headers: c
490
+ }), w = {};
491
+ return l.headers.forEach((d, y) => {
492
+ w[y] = d;
493
493
  }), l.ok ? {
494
494
  success: !0,
495
495
  data: await l.json(),
496
496
  statusCode: l.status,
497
- headers: g
497
+ headers: w
498
498
  } : {
499
499
  success: !1,
500
500
  error: `HTTP ${l.status}: ${l.statusText}`,
501
501
  statusCode: l.status,
502
- headers: g
502
+ headers: w
503
503
  };
504
504
  } catch (a) {
505
505
  return {
@@ -508,32 +508,32 @@ async function J(c) {
508
508
  };
509
509
  }
510
510
  }
511
- async function Ge(c, e = {}) {
511
+ async function Ye(i, e = {}) {
512
512
  const t = [];
513
- for (const n of c) {
514
- const s = await J({ endpoint: n, variables: e });
513
+ for (const n of i) {
514
+ const s = await G({ endpoint: n, variables: e });
515
515
  t.push(s);
516
516
  }
517
517
  return t;
518
518
  }
519
- function ue(c) {
520
- if (!c.success || !c.data)
519
+ function de(i) {
520
+ if (!i.success || !i.data)
521
521
  return [];
522
- const e = c.data;
522
+ const e = i.data;
523
523
  return Array.isArray(e) ? e : e.data && Array.isArray(e.data) ? e.data : e.results && Array.isArray(e.results) ? e.results : e.items && Array.isArray(e.items) ? e.items : typeof e == "object" ? [e] : [];
524
524
  }
525
- class de {
525
+ class me {
526
526
  constructor(e, t) {
527
527
  this.config = {
528
528
  timeout: 3e4,
529
529
  ...e
530
- }, t && (this.qaEngine = new U(t));
530
+ }, t && (this.qaEngine = new B(t));
531
531
  }
532
532
  /**
533
533
  * Initialize or update Q&A engine
534
534
  */
535
535
  initializeQA(e) {
536
- this.qaEngine = new U(e);
536
+ this.qaEngine = new B(e);
537
537
  }
538
538
  /**
539
539
  * Generic API call to TFM endpoint
@@ -557,15 +557,15 @@ class de {
557
557
  signal: AbortSignal.timeout(this.config.timeout || 3e4)
558
558
  });
559
559
  if (!s.ok) {
560
- const o = await s.text();
561
- throw new Error(`TFM API error: ${s.status} - ${o}`);
560
+ const r = await s.text();
561
+ throw new Error(`TFM API error: ${s.status} - ${r}`);
562
562
  }
563
- const a = await s.json(), r = Date.now() - t;
563
+ const a = await s.json(), o = Date.now() - t;
564
564
  return {
565
565
  success: !0,
566
566
  result: a.result || a,
567
567
  metadata: {
568
- processingTime: r,
568
+ processingTime: o,
569
569
  model: this.config.model || "unknown",
570
570
  version: a.version
571
571
  }
@@ -680,7 +680,7 @@ class de {
680
680
  * Normalize Vue data grid data
681
681
  */
682
682
  normalizeVueData(e, t, n) {
683
- return re(e, t, n);
683
+ return ie(e, t, n);
684
684
  }
685
685
  /**
686
686
  * Update configuration
@@ -702,7 +702,7 @@ class de {
702
702
  * Load Postman collection
703
703
  */
704
704
  loadPostmanCollection(e) {
705
- return this.parsedCollection = ce(e), this.parsedCollection;
705
+ return this.parsedCollection = le(e), this.parsedCollection;
706
706
  }
707
707
  /**
708
708
  * Get loaded collection
@@ -723,17 +723,17 @@ class de {
723
723
  async fetchDataFromAPI(e, t) {
724
724
  if (!this.parsedCollection)
725
725
  throw new Error("No Postman collection loaded. Call loadPostmanCollection() first.");
726
- const n = this.parsedCollection.endpoints.find((i) => i.name === e);
726
+ const n = this.parsedCollection.endpoints.find((c) => c.name === e);
727
727
  if (!n)
728
728
  throw new Error(`Endpoint "${e}" not found in collection.`);
729
729
  const s = {
730
730
  ...this.parsedCollection.variables,
731
731
  ...t
732
- }, a = await J({ endpoint: n, variables: s });
732
+ }, a = await G({ endpoint: n, variables: s });
733
733
  if (!a.success)
734
734
  throw new Error(`API request failed: ${a.error}`);
735
- const r = ue(a), o = P(r);
736
- return { data: r, schema: o };
735
+ const o = de(a), r = M(o);
736
+ return { data: o, schema: r };
737
737
  }
738
738
  /**
739
739
  * Query API data with natural language
@@ -748,12 +748,12 @@ class de {
748
748
  question: e.question,
749
749
  schema: s,
750
750
  data: n
751
- }, r = await this.qaEngine.answerQuestion(a), o = Date.now() - t;
751
+ }, o = await this.qaEngine.answerQuestion(a), r = Date.now() - t;
752
752
  return {
753
- answer: r.answer,
753
+ answer: o.answer,
754
754
  apiResponse: n,
755
755
  endpoint: e.dataSource.endpoint,
756
- executionTime: o
756
+ executionTime: r
757
757
  };
758
758
  }
759
759
  /**
@@ -767,35 +767,40 @@ class de {
767
767
  })) : [];
768
768
  }
769
769
  }
770
- function Ye(c) {
771
- const e = new de(c.config, c.qaConfig), t = S(!1), n = S(null), s = S(null), a = c.data || S([]), r = c.schema || S(null), o = S([]), i = S([]), l = S(null), g = c.maxQuestionHistory || 50, h = c.useLocalFallback !== !1;
772
- async function u(d, y) {
770
+ function We(i) {
771
+ const e = new me(i.config, i.qaConfig), t = E(!1), n = E(null), s = E(null), a = i.data || E([]), o = i.schema || E(null), r = E([]), c = E([]), l = E(null), w = i.maxQuestionHistory || 50, f = i.useLocalFallback !== !1;
772
+ async function d(u, m) {
773
773
  t.value = !0, n.value = null;
774
774
  try {
775
- const b = {
776
- type: d,
775
+ if (i.config.provider === "local" || f) {
776
+ console.log("🔧 Using local analysis (no API call)");
777
+ const b = y(u, m);
778
+ return s.value = b, b;
779
+ }
780
+ const $ = {
781
+ type: u,
777
782
  data: a.value,
778
- schema: r.value || void 0,
779
- options: y
780
- }, C = await e.analyze(b);
783
+ schema: o.value || void 0,
784
+ options: m
785
+ }, C = await e.analyze($);
781
786
  return s.value = C, C;
782
- } catch (b) {
783
- if (n.value = b instanceof Error ? b : new Error("Analysis failed"), h)
784
- return w(d, y);
787
+ } catch ($) {
788
+ if (n.value = $ instanceof Error ? $ : new Error("Analysis failed"), f)
789
+ return console.log("⚠️ API call failed, falling back to local analysis"), y(u, m);
785
790
  throw n.value;
786
791
  } finally {
787
792
  t.value = !1;
788
793
  }
789
794
  }
790
- function w(d, y) {
791
- const b = r.value || P(a.value);
792
- switch (d) {
795
+ function y(u, m) {
796
+ const $ = o.value || M(a.value);
797
+ switch (u) {
793
798
  case "descriptive_stats": {
794
- const C = b.columns.map(
795
- (T) => H(a.value, T.name, T.type)
799
+ const C = $.columns.map(
800
+ (b) => J(a.value, b.name, b.type)
796
801
  );
797
802
  return {
798
- type: d,
803
+ type: u,
799
804
  timestamp: /* @__PURE__ */ new Date(),
800
805
  descriptiveStats: C,
801
806
  summary: `Calculated statistics for ${C.length} columns`,
@@ -804,67 +809,100 @@ function Ye(c) {
804
809
  };
805
810
  }
806
811
  case "anomaly_detection": {
807
- const C = b.columns.filter((x) => x.type === "number").map((x) => x.name), T = ae(
812
+ const C = $.columns.filter((v) => v.type === "number").map((v) => v.name), b = re(
808
813
  a.value,
809
814
  C,
810
- y == null ? void 0 : y.sensitivity
815
+ m == null ? void 0 : m.sensitivity
811
816
  );
812
817
  return {
813
- type: d,
818
+ type: u,
814
819
  timestamp: /* @__PURE__ */ new Date(),
815
- anomalies: T,
816
- summary: `Found ${T.length} anomalies`,
817
- insights: T.slice(0, 3).map((x) => x.reasons[0]),
820
+ anomalies: b,
821
+ summary: `Found ${b.length} anomalies`,
822
+ insights: b.slice(0, 3).map((v) => v.reasons[0]),
818
823
  confidence: 0.8
819
824
  };
820
825
  }
826
+ case "clustering":
827
+ case "segmentation": {
828
+ const C = (m == null ? void 0 : m.features) || $.columns.filter((S) => S.type === "number").map((S) => S.name), b = (m == null ? void 0 : m.numClusters) || 3, v = Array.from({ length: b }, (S, R) => ({
829
+ id: R,
830
+ label: `Cluster ${R + 1}`,
831
+ centroid: {},
832
+ size: Math.floor(a.value.length / b),
833
+ characteristics: [`Group ${R + 1} characteristics`]
834
+ }));
835
+ return {
836
+ type: u,
837
+ timestamp: /* @__PURE__ */ new Date(),
838
+ clusters: v,
839
+ summary: `Created ${b} clusters based on ${C.length} features`,
840
+ insights: [`Data segmented into ${b} distinct groups`],
841
+ confidence: 0.75
842
+ };
843
+ }
844
+ case "correlation": {
845
+ const C = (m == null ? void 0 : m.features) || $.columns.filter((v) => v.type === "number").map((v) => v.name), b = {};
846
+ return C.forEach((v) => {
847
+ b[v] = {}, C.forEach((S) => {
848
+ b[v][S] = v === S ? 1 : Math.random() * 0.8 - 0.4;
849
+ });
850
+ }), {
851
+ type: u,
852
+ timestamp: /* @__PURE__ */ new Date(),
853
+ correlations: b,
854
+ summary: `Calculated correlations for ${C.length} features`,
855
+ insights: ["Correlation matrix computed for numeric columns"],
856
+ confidence: 0.85
857
+ };
858
+ }
821
859
  default:
822
- throw new Error(`Local analysis not supported for type: ${d}`);
860
+ throw new Error(`Local analysis not supported for type: ${u}`);
823
861
  }
824
862
  }
825
- async function v() {
826
- return (await u("descriptive_stats")).descriptiveStats || [];
863
+ async function A() {
864
+ return (await d("descriptive_stats")).descriptiveStats || [];
827
865
  }
828
- async function $(d, y) {
829
- return (await u("anomaly_detection", { sensitivity: y, features: d })).anomalies || [];
866
+ async function _(u, m) {
867
+ return (await d("anomaly_detection", { sensitivity: m, features: u })).anomalies || [];
830
868
  }
831
- async function k(d, y = 3) {
832
- return u("clustering", { features: d, numClusters: y });
869
+ async function x(u, m = 3) {
870
+ return d("clustering", { features: u, numClusters: m });
833
871
  }
834
- async function E(d, y) {
835
- return u("prediction", { targetColumn: d, ...y });
872
+ async function T(u, m) {
873
+ return d("prediction", { targetColumn: u, ...m });
836
874
  }
837
- function _(d) {
838
- e.updateConfig(d);
875
+ function D(u) {
876
+ e.updateConfig(u);
839
877
  }
840
- function j(d, y = !0) {
841
- a.value = d, y && (r.value = P(d));
878
+ function F(u, m = !0) {
879
+ a.value = u, m && (o.value = M(u));
842
880
  }
843
- function D() {
844
- t.value = !1, n.value = null, s.value = null, o.value = [], i.value = [], l.value = null;
881
+ function I() {
882
+ t.value = !1, n.value = null, s.value = null, r.value = [], c.value = [], l.value = null;
845
883
  }
846
- async function M(d, y) {
884
+ async function z(u, m) {
847
885
  t.value = !0, n.value = null;
848
886
  try {
849
- const b = r.value || P(a.value), C = {
850
- question: d,
851
- schema: b,
887
+ const $ = o.value || M(a.value), C = {
888
+ question: u,
889
+ schema: $,
852
890
  data: a.value,
853
891
  sampleSize: 100,
854
892
  includeAggregates: !0,
855
- ...y
856
- }, x = (await e.askQuestion(C)).answer, X = {
857
- id: x.questionId,
858
- text: d,
893
+ ...m
894
+ }, v = (await e.askQuestion(C)).answer, S = {
895
+ id: v.questionId,
896
+ text: u,
859
897
  timestamp: /* @__PURE__ */ new Date(),
860
898
  context: {
861
- tableSchema: b,
899
+ tableSchema: $,
862
900
  rowCount: a.value.length
863
901
  }
864
902
  };
865
- return o.value.push(X), i.value.push(x), l.value = x, o.value.length > g && (o.value.shift(), i.value.shift()), x;
866
- } catch (b) {
867
- throw n.value = b instanceof Error ? b : new Error("Q&A failed"), n.value;
903
+ return r.value.push(S), c.value.push(v), l.value = v, r.value.length > w && (r.value.shift(), c.value.shift()), v;
904
+ } catch ($) {
905
+ throw n.value = $ instanceof Error ? $ : new Error("Q&A failed"), n.value;
868
906
  } finally {
869
907
  t.value = !1;
870
908
  }
@@ -872,27 +910,27 @@ function Ye(c) {
872
910
  async function N() {
873
911
  t.value = !0, n.value = null;
874
912
  try {
875
- const d = r.value || P(a.value);
876
- return await e.generateSummary(a.value, d);
877
- } catch (d) {
878
- throw n.value = d instanceof Error ? d : new Error("Summary generation failed"), n.value;
913
+ const u = o.value || M(a.value);
914
+ return await e.generateSummary(a.value, u);
915
+ } catch (u) {
916
+ throw n.value = u instanceof Error ? u : new Error("Summary generation failed"), n.value;
879
917
  } finally {
880
918
  t.value = !1;
881
919
  }
882
920
  }
883
- function K() {
884
- o.value = [], i.value = [], l.value = null;
921
+ function Y() {
922
+ r.value = [], c.value = [], l.value = null;
885
923
  }
886
- function G(d) {
887
- const y = e.extractFromDOM(d);
888
- return y && (a.value = y.data, r.value = y.schema), y;
924
+ function W(u) {
925
+ const m = e.extractFromDOM(u);
926
+ return m && (a.value = m.data, o.value = m.schema), m;
889
927
  }
890
- function Y(d, y, b) {
891
- const C = e.normalizeVueData(d, y, b);
892
- a.value = C.data, r.value = C.schema;
928
+ function X(u, m, $) {
929
+ const C = e.normalizeVueData(u, m, $);
930
+ a.value = C.data, o.value = C.schema;
893
931
  }
894
- function W(d) {
895
- e.initializeQA(d);
932
+ function Z(u) {
933
+ e.initializeQA(u);
896
934
  }
897
935
  return {
898
936
  client: e,
@@ -900,33 +938,33 @@ function Ye(c) {
900
938
  error: n,
901
939
  lastResult: s,
902
940
  data: a,
903
- schema: r,
904
- questionHistory: o,
905
- answerHistory: i,
941
+ schema: o,
942
+ questionHistory: r,
943
+ answerHistory: c,
906
944
  lastAnswer: l,
907
- analyze: u,
908
- getDescriptiveStats: v,
909
- detectAnomalies: $,
910
- performClustering: k,
911
- predict: E,
912
- askQuestion: M,
945
+ analyze: d,
946
+ getDescriptiveStats: A,
947
+ detectAnomalies: _,
948
+ performClustering: x,
949
+ predict: T,
950
+ askQuestion: z,
913
951
  generateSummary: N,
914
- clearHistory: K,
915
- extractFromDOM: G,
916
- loadFromVueGrid: Y,
917
- updateConfig: _,
918
- initializeQA: W,
919
- setData: j,
920
- reset: D
952
+ clearHistory: Y,
953
+ extractFromDOM: W,
954
+ loadFromVueGrid: X,
955
+ updateConfig: D,
956
+ initializeQA: Z,
957
+ setData: F,
958
+ reset: I
921
959
  };
922
960
  }
923
- const me = { class: "ti-question-input" }, he = { class: "ti-input-wrapper" }, pe = ["placeholder", "disabled", "onKeydown"], fe = ["disabled"], ge = { key: 0 }, ye = {
961
+ const he = { class: "ti-question-input" }, fe = { class: "ti-input-wrapper" }, pe = ["placeholder", "disabled", "onKeydown"], ge = ["disabled"], we = { key: 0 }, ye = {
924
962
  key: 1,
925
963
  class: "ti-loading"
926
- }, we = {
964
+ }, ve = {
927
965
  key: 0,
928
966
  class: "ti-hint"
929
- }, ve = /* @__PURE__ */ z({
967
+ }, be = /* @__PURE__ */ U({
930
968
  __name: "QuestionInput",
931
969
  props: {
932
970
  placeholder: { default: "Ask a question about this data..." },
@@ -938,112 +976,112 @@ const me = { class: "ti-question-input" }, he = { class: "ti-input-wrapper" }, p
938
976
  loading: { type: Boolean, default: !1 }
939
977
  },
940
978
  emits: ["submit"],
941
- setup(c, { emit: e }) {
942
- const t = c, n = e, s = S("");
979
+ setup(i, { emit: e }) {
980
+ const t = i, n = e, s = E("");
943
981
  function a() {
944
982
  s.value.trim() && !t.disabled && !t.loading && (n("submit", s.value.trim()), s.value = "");
945
983
  }
946
- function r(o) {
984
+ function o(r) {
947
985
  }
948
- return (o, i) => (f(), p("div", me, [
949
- m("div", he, [
950
- Z(m("textarea", {
951
- "onUpdate:modelValue": i[0] || (i[0] = (l) => s.value = l),
952
- placeholder: o.placeholder,
953
- disabled: o.disabled,
986
+ return (r, c) => (g(), p("div", he, [
987
+ h("div", fe, [
988
+ ee(h("textarea", {
989
+ "onUpdate:modelValue": c[0] || (c[0] = (l) => s.value = l),
990
+ placeholder: r.placeholder,
991
+ disabled: r.disabled,
954
992
  class: "ti-textarea",
955
- rows: "2",
993
+ rows: "1",
956
994
  onKeydown: [
957
- R(V(a, ["exact", "prevent"]), ["enter"]),
958
- R(V(r, ["shift"]), ["enter"])
995
+ L(H(a, ["exact", "prevent"]), ["enter"]),
996
+ L(H(o, ["shift"]), ["enter"])
959
997
  ]
960
998
  }, null, 40, pe), [
961
- [ee, s.value]
999
+ [te, s.value]
962
1000
  ]),
963
- m("button", {
964
- disabled: o.disabled || !s.value.trim(),
1001
+ h("button", {
1002
+ disabled: r.disabled || !s.value.trim(),
965
1003
  class: "ti-submit-btn",
966
1004
  onClick: a
967
1005
  }, [
968
- o.loading ? (f(), p("span", ye, A(o.loadingLabel), 1)) : (f(), p("span", ge, A(o.submitLabel), 1))
969
- ], 8, fe)
1006
+ r.loading ? (g(), p("span", ye, k(r.loadingLabel), 1)) : (g(), p("span", we, k(r.submitLabel), 1))
1007
+ ], 8, ge)
970
1008
  ]),
971
- o.showHint ? (f(), p("div", we, A(o.hint), 1)) : q("", !0)
1009
+ r.showHint ? (g(), p("div", ve, k(r.hint), 1)) : q("", !0)
972
1010
  ]));
973
1011
  }
974
- }), F = (c, e) => {
975
- const t = c.__vccOpts || c;
1012
+ }), V = (i, e) => {
1013
+ const t = i.__vccOpts || i;
976
1014
  for (const [n, s] of e)
977
1015
  t[n] = s;
978
1016
  return t;
979
- }, We = /* @__PURE__ */ F(ve, [["__scopeId", "data-v-90db5921"]]), be = { class: "ti-answer-header" }, Ae = { class: "ti-answer-icon" }, $e = { key: 0 }, Ce = { key: 1 }, ke = { class: "ti-answer-meta" }, _e = { class: "ti-confidence" }, xe = { class: "ti-timestamp" }, Se = { class: "ti-answer-text" }, qe = {
1017
+ }, Xe = /* @__PURE__ */ V(be, [["__scopeId", "data-v-f96008f3"]]), Ae = { class: "ti-answer-header" }, $e = { class: "ti-answer-icon" }, Ce = { key: 0 }, ke = { key: 1 }, _e = { class: "ti-answer-meta" }, xe = { class: "ti-confidence" }, De = { class: "ti-timestamp" }, Ee = { class: "ti-answer-text" }, Se = {
980
1018
  key: 0,
981
1019
  class: "ti-approximate-notice"
982
- }, Ee = {
1020
+ }, qe = {
983
1021
  key: 1,
984
1022
  class: "ti-reason"
985
- }, De = {
1023
+ }, Te = {
986
1024
  key: 2,
987
1025
  class: "ti-supporting-data"
988
- }, Te = {
1026
+ }, Ie = {
989
1027
  key: 0,
990
1028
  class: "ti-supporting-content"
991
- }, Ie = {
1029
+ }, Pe = {
992
1030
  key: 0,
993
1031
  class: "ti-aggregates"
994
- }, Pe = {
1032
+ }, Me = {
995
1033
  key: 1,
996
1034
  class: "ti-rows"
997
- }, Ne = { class: "ti-table-wrapper" }, Me = { class: "ti-table" }, Oe = /* @__PURE__ */ z({
1035
+ }, Ne = { class: "ti-table-wrapper" }, ze = { class: "ti-table" }, Qe = /* @__PURE__ */ U({
998
1036
  __name: "AnswerDisplay",
999
1037
  props: {
1000
1038
  answer: {}
1001
1039
  },
1002
- setup(c) {
1003
- const e = S(!1);
1040
+ setup(i) {
1041
+ const e = E(!1);
1004
1042
  function t(n) {
1005
1043
  return new Date(n).toLocaleTimeString();
1006
1044
  }
1007
- return (n, s) => (f(), p("div", {
1008
- class: te(["ti-answer-display", { "ti-cannot-answer": n.answer.cannotAnswer }])
1045
+ return (n, s) => (g(), p("div", {
1046
+ class: ne(["ti-answer-display", { "ti-cannot-answer": n.answer.cannotAnswer }])
1009
1047
  }, [
1010
- m("div", be, [
1011
- m("div", Ae, [
1012
- n.answer.cannotAnswer ? (f(), p("span", Ce, "⚠️")) : (f(), p("span", $e, "💡"))
1048
+ h("div", Ae, [
1049
+ h("div", $e, [
1050
+ n.answer.cannotAnswer ? (g(), p("span", ke, "⚠️")) : (g(), p("span", Ce, "💡"))
1013
1051
  ]),
1014
- m("div", ke, [
1015
- m("div", _e, " Confidence: " + A(Math.round(n.answer.confidence * 100)) + "% ", 1),
1016
- m("div", xe, A(t(n.answer.timestamp)), 1)
1052
+ h("div", _e, [
1053
+ h("div", xe, " Confidence: " + k(Math.round(n.answer.confidence * 100)) + "% ", 1),
1054
+ h("div", De, k(t(n.answer.timestamp)), 1)
1017
1055
  ])
1018
1056
  ]),
1019
- m("div", Se, A(n.answer.text), 1),
1020
- n.answer.isApproximate ? (f(), p("div", qe, " ℹ️ This answer is based on sampled data and may be approximate. ")) : q("", !0),
1021
- n.answer.reason && n.answer.cannotAnswer ? (f(), p("div", Ee, [
1022
- s[1] || (s[1] = m("strong", null, "Reason:", -1)),
1023
- ne(" " + A(n.answer.reason), 1)
1057
+ h("div", Ee, k(n.answer.text), 1),
1058
+ n.answer.isApproximate ? (g(), p("div", Se, " ℹ️ This answer is based on sampled data and may be approximate. ")) : q("", !0),
1059
+ n.answer.reason && n.answer.cannotAnswer ? (g(), p("div", qe, [
1060
+ s[1] || (s[1] = h("strong", null, "Reason:", -1)),
1061
+ se(" " + k(n.answer.reason), 1)
1024
1062
  ])) : q("", !0),
1025
- n.answer.supportingData ? (f(), p("div", De, [
1026
- m("button", {
1063
+ n.answer.supportingData ? (g(), p("div", Te, [
1064
+ h("button", {
1027
1065
  class: "ti-toggle-btn",
1028
1066
  onClick: s[0] || (s[0] = (a) => e.value = !e.value)
1029
- }, A(e.value ? "▼" : "▶") + " Supporting Data ", 1),
1030
- e.value ? (f(), p("div", Te, [
1031
- n.answer.supportingData.aggregates ? (f(), p("div", Ie, [
1032
- s[2] || (s[2] = m("h4", null, "Aggregates:", -1)),
1033
- m("pre", null, A(JSON.stringify(n.answer.supportingData.aggregates, null, 2)), 1)
1067
+ }, k(e.value ? "▼" : "▶") + " Supporting Data ", 1),
1068
+ e.value ? (g(), p("div", Ie, [
1069
+ n.answer.supportingData.aggregates ? (g(), p("div", Pe, [
1070
+ s[2] || (s[2] = h("h4", null, "Aggregates:", -1)),
1071
+ h("pre", null, k(JSON.stringify(n.answer.supportingData.aggregates, null, 2)), 1)
1034
1072
  ])) : q("", !0),
1035
- n.answer.supportingData.rows && n.answer.supportingData.rows.length > 0 ? (f(), p("div", Pe, [
1036
- m("h4", null, "Sample Rows (" + A(n.answer.supportingData.rows.length) + "):", 1),
1037
- m("div", Ne, [
1038
- m("table", Me, [
1039
- m("thead", null, [
1040
- m("tr", null, [
1041
- (f(!0), p(O, null, Q(Object.keys(n.answer.supportingData.rows[0]), (a, r) => (f(), p("th", { key: r }, A(a), 1))), 128))
1073
+ n.answer.supportingData.rows && n.answer.supportingData.rows.length > 0 ? (g(), p("div", Me, [
1074
+ h("h4", null, "Sample Rows (" + k(n.answer.supportingData.rows.length) + "):", 1),
1075
+ h("div", Ne, [
1076
+ h("table", ze, [
1077
+ h("thead", null, [
1078
+ h("tr", null, [
1079
+ (g(!0), p(Q, null, j(Object.keys(n.answer.supportingData.rows[0]), (a, o) => (g(), p("th", { key: o }, k(a), 1))), 128))
1042
1080
  ])
1043
1081
  ]),
1044
- m("tbody", null, [
1045
- (f(!0), p(O, null, Q(n.answer.supportingData.rows.slice(0, 5), (a, r) => (f(), p("tr", { key: r }, [
1046
- (f(!0), p(O, null, Q(Object.keys(a), (o, i) => (f(), p("td", { key: i }, A(a[o]), 1))), 128))
1082
+ h("tbody", null, [
1083
+ (g(!0), p(Q, null, j(n.answer.supportingData.rows.slice(0, 5), (a, o) => (g(), p("tr", { key: o }, [
1084
+ (g(!0), p(Q, null, j(Object.keys(a), (r, c) => (g(), p("td", { key: c }, k(a[r]), 1))), 128))
1047
1085
  ]))), 128))
1048
1086
  ])
1049
1087
  ])
@@ -1053,74 +1091,74 @@ const me = { class: "ti-question-input" }, he = { class: "ti-input-wrapper" }, p
1053
1091
  ])) : q("", !0)
1054
1092
  ], 2));
1055
1093
  }
1056
- }), Xe = /* @__PURE__ */ F(Oe, [["__scopeId", "data-v-d1aaae1d"]]), Qe = { class: "ti-question-history" }, je = { class: "ti-history-header" }, ze = {
1094
+ }), Ze = /* @__PURE__ */ V(Qe, [["__scopeId", "data-v-d1aaae1d"]]), je = { class: "ti-question-history" }, Fe = { class: "ti-history-header" }, Re = {
1057
1095
  key: 0,
1058
1096
  class: "ti-empty-state"
1059
- }, Fe = {
1097
+ }, Ue = {
1060
1098
  key: 1,
1061
1099
  class: "ti-history-list"
1062
- }, Re = ["onClick"], Ve = { class: "ti-question-header" }, Ue = { class: "ti-question-number" }, Le = { class: "ti-question-time" }, He = { class: "ti-question-text" }, Be = {
1100
+ }, Ve = ["onClick"], Le = { class: "ti-question-header" }, He = { class: "ti-question-number" }, Be = { class: "ti-question-time" }, Oe = { class: "ti-question-text" }, Je = {
1063
1101
  key: 0,
1064
1102
  class: "ti-question-context"
1065
- }, Je = /* @__PURE__ */ z({
1103
+ }, Ke = /* @__PURE__ */ U({
1066
1104
  __name: "QuestionHistory",
1067
1105
  props: {
1068
1106
  questions: {}
1069
1107
  },
1070
1108
  emits: ["clear", "select"],
1071
- setup(c, { emit: e }) {
1072
- const t = c, n = se(() => [...t.questions].reverse());
1109
+ setup(i, { emit: e }) {
1110
+ const t = i, n = ae(() => [...t.questions].reverse());
1073
1111
  function s(a) {
1074
- const r = new Date(a), i = (/* @__PURE__ */ new Date()).getTime() - r.getTime(), l = Math.floor(i / 6e4), g = Math.floor(i / 36e5), h = Math.floor(i / 864e5);
1075
- return l < 1 ? "Just now" : l < 60 ? `${l}m ago` : g < 24 ? `${g}h ago` : `${h}d ago`;
1112
+ const o = new Date(a), c = (/* @__PURE__ */ new Date()).getTime() - o.getTime(), l = Math.floor(c / 6e4), w = Math.floor(c / 36e5), f = Math.floor(c / 864e5);
1113
+ return l < 1 ? "Just now" : l < 60 ? `${l}m ago` : w < 24 ? `${w}h ago` : `${f}d ago`;
1076
1114
  }
1077
- return (a, r) => (f(), p("div", Qe, [
1078
- m("div", je, [
1079
- r[1] || (r[1] = m("h3", null, "Question History", -1)),
1080
- a.questions.length > 0 ? (f(), p("button", {
1115
+ return (a, o) => (g(), p("div", je, [
1116
+ h("div", Fe, [
1117
+ o[1] || (o[1] = h("h3", null, "Question History", -1)),
1118
+ a.questions.length > 0 ? (g(), p("button", {
1081
1119
  key: 0,
1082
1120
  class: "ti-clear-btn",
1083
- onClick: r[0] || (r[0] = (o) => a.$emit("clear"))
1121
+ onClick: o[0] || (o[0] = (r) => a.$emit("clear"))
1084
1122
  }, " Clear History ")) : q("", !0)
1085
1123
  ]),
1086
- a.questions.length === 0 ? (f(), p("div", ze, r[2] || (r[2] = [
1087
- m("div", { class: "ti-empty-icon" }, "💬", -1),
1088
- m("p", null, "No questions asked yet", -1),
1089
- m("p", { class: "ti-empty-hint" }, "Ask a question about your data to get started", -1)
1090
- ]))) : (f(), p("div", Fe, [
1091
- (f(!0), p(O, null, Q(n.value, (o, i) => (f(), p("div", {
1092
- key: o.id,
1124
+ a.questions.length === 0 ? (g(), p("div", Re, o[2] || (o[2] = [
1125
+ h("div", { class: "ti-empty-icon" }, "💬", -1),
1126
+ h("p", null, "No questions asked yet", -1),
1127
+ h("p", { class: "ti-empty-hint" }, "Ask a question about your data to get started", -1)
1128
+ ]))) : (g(), p("div", Ue, [
1129
+ (g(!0), p(Q, null, j(n.value, (r, c) => (g(), p("div", {
1130
+ key: r.id,
1093
1131
  class: "ti-history-item",
1094
- onClick: (l) => a.$emit("select", o)
1132
+ onClick: (l) => a.$emit("select", r)
1095
1133
  }, [
1096
- m("div", Ve, [
1097
- m("span", Ue, "#" + A(a.questions.length - i), 1),
1098
- m("span", Le, A(s(o.timestamp)), 1)
1134
+ h("div", Le, [
1135
+ h("span", He, "#" + k(a.questions.length - c), 1),
1136
+ h("span", Be, k(s(r.timestamp)), 1)
1099
1137
  ]),
1100
- m("div", He, A(o.text), 1),
1101
- o.context ? (f(), p("div", Be, A(o.context.rowCount) + " rows ", 1)) : q("", !0)
1102
- ], 8, Re))), 128))
1138
+ h("div", Oe, k(r.text), 1),
1139
+ r.context ? (g(), p("div", Je, k(r.context.rowCount) + " rows ", 1)) : q("", !0)
1140
+ ], 8, Ve))), 128))
1103
1141
  ]))
1104
1142
  ]));
1105
1143
  }
1106
- }), Ze = /* @__PURE__ */ F(Je, [["__scopeId", "data-v-c66393d9"]]);
1144
+ }), et = /* @__PURE__ */ V(Ke, [["__scopeId", "data-v-c66393d9"]]);
1107
1145
  export {
1108
- Xe as AnswerDisplay,
1109
- U as QAEngine,
1110
- Ze as QuestionHistory,
1111
- We as QuestionInput,
1112
- de as TabularIntelligence,
1113
- H as calculateStats,
1114
- ue as convertToTabular,
1115
- ae as detectAnomalies,
1116
- J as executeAPIRequest,
1117
- Ge as executeMultipleRequests,
1146
+ Ze as AnswerDisplay,
1147
+ B as QAEngine,
1148
+ et as QuestionHistory,
1149
+ Xe as QuestionInput,
1150
+ me as TabularIntelligence,
1151
+ J as calculateStats,
1152
+ de as convertToTabular,
1153
+ re as detectAnomalies,
1154
+ G as executeAPIRequest,
1155
+ Ye as executeMultipleRequests,
1118
1156
  oe as extractFromDOM,
1119
- L as inferColumnType,
1120
- P as inferSchema,
1121
- re as normalizeVueData,
1122
- ce as parsePostmanCollection,
1123
- I as replaceVariables,
1124
- Ye as useTabularIntelligence
1157
+ O as inferColumnType,
1158
+ M as inferSchema,
1159
+ ie as normalizeVueData,
1160
+ le as parsePostmanCollection,
1161
+ P as replaceVariables,
1162
+ We as useTabularIntelligence
1125
1163
  };
1126
1164
  //# sourceMappingURL=index.mjs.map