@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/composables/useTabularIntelligence.d.ts.map +1 -1
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +426 -388
- package/dist/index.mjs.map +1 -1
- package/dist/tabular-intelligence.css +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { ref as
|
|
2
|
-
function
|
|
3
|
-
if (
|
|
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 =
|
|
5
|
+
const t = i[0];
|
|
6
6
|
return {
|
|
7
7
|
columns: Object.keys(t).map((s) => {
|
|
8
|
-
const a =
|
|
8
|
+
const a = O(i, s);
|
|
9
9
|
return {
|
|
10
10
|
name: s,
|
|
11
11
|
type: a,
|
|
12
|
-
nullable:
|
|
12
|
+
nullable: i.some((o) => o[s] == null)
|
|
13
13
|
};
|
|
14
14
|
}),
|
|
15
|
-
rowCount:
|
|
15
|
+
rowCount: i.length,
|
|
16
16
|
name: e
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
-
function
|
|
20
|
-
const t =
|
|
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
|
|
32
|
-
const n =
|
|
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
|
|
39
|
-
if (
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
25:
|
|
45
|
-
50:
|
|
46
|
-
75:
|
|
47
|
-
90:
|
|
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
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
n.forEach((
|
|
55
|
-
const
|
|
56
|
-
|
|
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(
|
|
59
|
-
|
|
58
|
+
const l = Math.max(...Object.values(c));
|
|
59
|
+
o.mode = Object.keys(c).find((w) => c[w] === l);
|
|
60
60
|
}
|
|
61
|
-
return
|
|
61
|
+
return o;
|
|
62
62
|
}
|
|
63
|
-
function
|
|
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
|
|
67
|
-
if (
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
if (
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
rowIndex:
|
|
74
|
-
row:
|
|
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: [
|
|
76
|
+
reasons: [x],
|
|
77
77
|
affectedColumns: [a]
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
|
-
}), n.sort((a,
|
|
81
|
+
}), n.sort((a, o) => o.score - a.score);
|
|
82
82
|
}
|
|
83
|
-
class
|
|
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:
|
|
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(
|
|
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 =
|
|
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((
|
|
146
|
+
const a = e.map((r) => r[s.name]).filter((r) => r != null), o = new Set(a);
|
|
147
147
|
n[s.name] = {
|
|
148
|
-
uniqueCount:
|
|
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
|
|
169
|
-
let
|
|
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
|
-
|
|
173
|
-
`,
|
|
174
|
-
`,
|
|
172
|
+
r += `**Table Schema:**
|
|
173
|
+
`, r += `Table: ${t.name}
|
|
174
|
+
`, r += `Columns:
|
|
175
175
|
`;
|
|
176
|
-
for (const
|
|
177
|
-
|
|
176
|
+
for (const c of t.columns)
|
|
177
|
+
r += `- ${c.name} (${c.type})
|
|
178
178
|
`;
|
|
179
|
-
return
|
|
180
|
-
`, s && Object.keys(s).length > 0 && (
|
|
181
|
-
`,
|
|
179
|
+
return r += `
|
|
180
|
+
`, s && Object.keys(s).length > 0 && (r += `**Summary Statistics:**
|
|
181
|
+
`, r += JSON.stringify(s, null, 2), r += `
|
|
182
182
|
|
|
183
|
-
`),
|
|
184
|
-
`,
|
|
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
|
-
`,
|
|
186
|
+
`, r += `**Question:** ${e}
|
|
187
187
|
|
|
188
|
-
`,
|
|
189
|
-
`,
|
|
190
|
-
`,
|
|
191
|
-
`,
|
|
192
|
-
`,
|
|
193
|
-
`,
|
|
194
|
-
`,
|
|
195
|
-
`,
|
|
196
|
-
`,
|
|
197
|
-
`,
|
|
198
|
-
`,
|
|
199
|
-
`,
|
|
200
|
-
`,
|
|
201
|
-
`,
|
|
202
|
-
`,
|
|
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:
|
|
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",
|
|
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",
|
|
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
|
|
222
|
-
const
|
|
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 (!
|
|
237
|
-
throw new Error(`OpenAI API error: ${
|
|
238
|
-
return ((l = (
|
|
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
|
|
245
|
-
const
|
|
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 (!
|
|
260
|
-
throw new Error(`Anthropic API error: ${
|
|
261
|
-
return ((
|
|
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
|
|
279
|
-
return
|
|
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(
|
|
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
|
-
} =
|
|
322
|
-
if (!
|
|
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
|
|
325
|
-
if (
|
|
324
|
+
const c = Array.from(o.rows);
|
|
325
|
+
if (c.length === 0)
|
|
326
326
|
return null;
|
|
327
|
-
let l = [],
|
|
328
|
-
if (t &&
|
|
329
|
-
const
|
|
330
|
-
l = Array.from(
|
|
331
|
-
var
|
|
332
|
-
return ((
|
|
333
|
-
}),
|
|
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
|
|
336
|
-
l = Array.from(
|
|
335
|
+
const A = c[0];
|
|
336
|
+
l = Array.from(A.cells).map((_, x) => `Column${x + 1}`);
|
|
337
337
|
}
|
|
338
|
-
const
|
|
339
|
-
for (const
|
|
340
|
-
const
|
|
341
|
-
if (a &&
|
|
342
|
-
var
|
|
343
|
-
return !((
|
|
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
|
|
347
|
-
|
|
348
|
-
var
|
|
349
|
-
const
|
|
350
|
-
let
|
|
351
|
-
if (s &&
|
|
352
|
-
const N = parseFloat(
|
|
353
|
-
!isNaN(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
|
-
|
|
356
|
-
}),
|
|
355
|
+
x[F] = I;
|
|
356
|
+
}), f.push(x);
|
|
357
357
|
}
|
|
358
358
|
return {
|
|
359
|
-
schema: s &&
|
|
360
|
-
data:
|
|
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:
|
|
364
|
+
rowCount: f.length,
|
|
365
365
|
columnCount: l.length,
|
|
366
366
|
extractedAt: /* @__PURE__ */ new Date()
|
|
367
367
|
}
|
|
368
368
|
};
|
|
369
369
|
}
|
|
370
|
-
function
|
|
371
|
-
const { maxRows: n, inferTypes: s = !0 } = t, a = n ?
|
|
372
|
-
let
|
|
373
|
-
return e && e.length > 0 ?
|
|
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((
|
|
376
|
-
name:
|
|
377
|
-
type: s && a.length > 0 ?
|
|
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 ?
|
|
382
|
-
schema:
|
|
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:
|
|
387
|
+
columnCount: o.columns.length,
|
|
388
388
|
extractedAt: /* @__PURE__ */ new Date()
|
|
389
389
|
}
|
|
390
390
|
};
|
|
391
391
|
}
|
|
392
|
-
function
|
|
392
|
+
function ce(i, e = 0) {
|
|
393
393
|
return {
|
|
394
394
|
name: "Extracted Table",
|
|
395
|
-
columns:
|
|
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
|
|
403
|
+
function le(i) {
|
|
404
404
|
const e = {};
|
|
405
|
-
|
|
405
|
+
i.variable && i.variable.forEach((a) => {
|
|
406
406
|
e[a.key] = a.value;
|
|
407
407
|
});
|
|
408
|
-
const t =
|
|
409
|
-
function s(a,
|
|
410
|
-
a.forEach((
|
|
411
|
-
|
|
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(
|
|
415
|
-
name:
|
|
416
|
-
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
|
|
423
|
-
const t =
|
|
424
|
-
t.header && t.header.forEach((
|
|
425
|
-
n[
|
|
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((
|
|
429
|
-
s[
|
|
428
|
+
t.url.query && t.url.query.forEach((o) => {
|
|
429
|
+
s[o.key] = o.value;
|
|
430
430
|
});
|
|
431
|
-
const a = t.auth ?
|
|
431
|
+
const a = t.auth ? K(t.auth) : e;
|
|
432
432
|
return {
|
|
433
|
-
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
|
|
442
|
+
function K(i) {
|
|
443
443
|
const e = {};
|
|
444
|
-
return
|
|
444
|
+
return i.apikey ? i.apikey.forEach((t) => {
|
|
445
445
|
e[t.key] = t.value;
|
|
446
|
-
}) :
|
|
446
|
+
}) : i.bearer ? i.bearer.forEach((t) => {
|
|
447
447
|
e[t.key] = t.value;
|
|
448
|
-
}) :
|
|
448
|
+
}) : i.basic && i.basic.forEach((t) => {
|
|
449
449
|
e[t.key] = t.value;
|
|
450
450
|
}), {
|
|
451
|
-
type:
|
|
451
|
+
type: i.type,
|
|
452
452
|
credentials: e
|
|
453
453
|
};
|
|
454
454
|
}
|
|
455
|
-
function
|
|
456
|
-
let t =
|
|
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
|
|
463
|
-
const { endpoint: e, variables: t = {}, additionalHeaders: n = {}, additionalParams: s = {} } =
|
|
462
|
+
async function G(i) {
|
|
463
|
+
const { endpoint: e, variables: t = {}, additionalHeaders: n = {}, additionalParams: s = {} } = i;
|
|
464
464
|
try {
|
|
465
|
-
let a =
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
const
|
|
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(
|
|
474
|
-
|
|
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
|
|
478
|
-
e.auth.credentials.in === "header" && (
|
|
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
|
|
481
|
-
|
|
480
|
+
const d = P(e.auth.credentials.token || "", t);
|
|
481
|
+
c.Authorization = `Bearer ${d}`;
|
|
482
482
|
} else if (e.auth.type === "basic") {
|
|
483
|
-
const
|
|
484
|
-
|
|
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:
|
|
490
|
-
}),
|
|
491
|
-
return l.headers.forEach((
|
|
492
|
-
|
|
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:
|
|
497
|
+
headers: w
|
|
498
498
|
} : {
|
|
499
499
|
success: !1,
|
|
500
500
|
error: `HTTP ${l.status}: ${l.statusText}`,
|
|
501
501
|
statusCode: l.status,
|
|
502
|
-
headers:
|
|
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
|
|
511
|
+
async function Ye(i, e = {}) {
|
|
512
512
|
const t = [];
|
|
513
|
-
for (const n of
|
|
514
|
-
const s = await
|
|
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
|
|
520
|
-
if (!
|
|
519
|
+
function de(i) {
|
|
520
|
+
if (!i.success || !i.data)
|
|
521
521
|
return [];
|
|
522
|
-
const e =
|
|
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
|
|
525
|
+
class me {
|
|
526
526
|
constructor(e, t) {
|
|
527
527
|
this.config = {
|
|
528
528
|
timeout: 3e4,
|
|
529
529
|
...e
|
|
530
|
-
}, t && (this.qaEngine = new
|
|
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
|
|
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
|
|
561
|
-
throw new Error(`TFM API error: ${s.status} - ${
|
|
560
|
+
const r = await s.text();
|
|
561
|
+
throw new Error(`TFM API error: ${s.status} - ${r}`);
|
|
562
562
|
}
|
|
563
|
-
const a = await s.json(),
|
|
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:
|
|
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
|
|
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 =
|
|
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((
|
|
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
|
|
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
|
|
736
|
-
return { data:
|
|
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
|
-
},
|
|
751
|
+
}, o = await this.qaEngine.answerQuestion(a), r = Date.now() - t;
|
|
752
752
|
return {
|
|
753
|
-
answer:
|
|
753
|
+
answer: o.answer,
|
|
754
754
|
apiResponse: n,
|
|
755
755
|
endpoint: e.dataSource.endpoint,
|
|
756
|
-
executionTime:
|
|
756
|
+
executionTime: r
|
|
757
757
|
};
|
|
758
758
|
}
|
|
759
759
|
/**
|
|
@@ -767,35 +767,40 @@ class de {
|
|
|
767
767
|
})) : [];
|
|
768
768
|
}
|
|
769
769
|
}
|
|
770
|
-
function
|
|
771
|
-
const e = new
|
|
772
|
-
async function u
|
|
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
|
-
|
|
776
|
-
|
|
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:
|
|
779
|
-
options:
|
|
780
|
-
}, C = await e.analyze(
|
|
783
|
+
schema: o.value || void 0,
|
|
784
|
+
options: m
|
|
785
|
+
}, C = await e.analyze($);
|
|
781
786
|
return s.value = C, C;
|
|
782
|
-
} catch (
|
|
783
|
-
if (n.value =
|
|
784
|
-
return
|
|
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
|
|
791
|
-
const
|
|
792
|
-
switch (
|
|
795
|
+
function y(u, m) {
|
|
796
|
+
const $ = o.value || M(a.value);
|
|
797
|
+
switch (u) {
|
|
793
798
|
case "descriptive_stats": {
|
|
794
|
-
const C =
|
|
795
|
-
(
|
|
799
|
+
const C = $.columns.map(
|
|
800
|
+
(b) => J(a.value, b.name, b.type)
|
|
796
801
|
);
|
|
797
802
|
return {
|
|
798
|
-
type:
|
|
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 =
|
|
812
|
+
const C = $.columns.filter((v) => v.type === "number").map((v) => v.name), b = re(
|
|
808
813
|
a.value,
|
|
809
814
|
C,
|
|
810
|
-
|
|
815
|
+
m == null ? void 0 : m.sensitivity
|
|
811
816
|
);
|
|
812
817
|
return {
|
|
813
|
-
type:
|
|
818
|
+
type: u,
|
|
814
819
|
timestamp: /* @__PURE__ */ new Date(),
|
|
815
|
-
anomalies:
|
|
816
|
-
summary: `Found ${
|
|
817
|
-
insights:
|
|
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: ${
|
|
860
|
+
throw new Error(`Local analysis not supported for type: ${u}`);
|
|
823
861
|
}
|
|
824
862
|
}
|
|
825
|
-
async function
|
|
826
|
-
return (await
|
|
863
|
+
async function A() {
|
|
864
|
+
return (await d("descriptive_stats")).descriptiveStats || [];
|
|
827
865
|
}
|
|
828
|
-
async function
|
|
829
|
-
return (await
|
|
866
|
+
async function _(u, m) {
|
|
867
|
+
return (await d("anomaly_detection", { sensitivity: m, features: u })).anomalies || [];
|
|
830
868
|
}
|
|
831
|
-
async function
|
|
832
|
-
return
|
|
869
|
+
async function x(u, m = 3) {
|
|
870
|
+
return d("clustering", { features: u, numClusters: m });
|
|
833
871
|
}
|
|
834
|
-
async function
|
|
835
|
-
return
|
|
872
|
+
async function T(u, m) {
|
|
873
|
+
return d("prediction", { targetColumn: u, ...m });
|
|
836
874
|
}
|
|
837
|
-
function
|
|
838
|
-
e.updateConfig(
|
|
875
|
+
function D(u) {
|
|
876
|
+
e.updateConfig(u);
|
|
839
877
|
}
|
|
840
|
-
function
|
|
841
|
-
a.value =
|
|
878
|
+
function F(u, m = !0) {
|
|
879
|
+
a.value = u, m && (o.value = M(u));
|
|
842
880
|
}
|
|
843
|
-
function
|
|
844
|
-
t.value = !1, n.value = null, s.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
|
|
884
|
+
async function z(u, m) {
|
|
847
885
|
t.value = !0, n.value = null;
|
|
848
886
|
try {
|
|
849
|
-
const
|
|
850
|
-
question:
|
|
851
|
-
schema:
|
|
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
|
-
...
|
|
856
|
-
},
|
|
857
|
-
id:
|
|
858
|
-
text:
|
|
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:
|
|
899
|
+
tableSchema: $,
|
|
862
900
|
rowCount: a.value.length
|
|
863
901
|
}
|
|
864
902
|
};
|
|
865
|
-
return
|
|
866
|
-
} catch (
|
|
867
|
-
throw 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
|
|
876
|
-
return await e.generateSummary(a.value,
|
|
877
|
-
} catch (
|
|
878
|
-
throw 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
|
|
884
|
-
|
|
921
|
+
function Y() {
|
|
922
|
+
r.value = [], c.value = [], l.value = null;
|
|
885
923
|
}
|
|
886
|
-
function
|
|
887
|
-
const
|
|
888
|
-
return
|
|
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
|
|
891
|
-
const C = e.normalizeVueData(
|
|
892
|
-
a.value = C.data,
|
|
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
|
|
895
|
-
e.initializeQA(
|
|
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:
|
|
904
|
-
questionHistory:
|
|
905
|
-
answerHistory:
|
|
941
|
+
schema: o,
|
|
942
|
+
questionHistory: r,
|
|
943
|
+
answerHistory: c,
|
|
906
944
|
lastAnswer: l,
|
|
907
|
-
analyze:
|
|
908
|
-
getDescriptiveStats:
|
|
909
|
-
detectAnomalies:
|
|
910
|
-
performClustering:
|
|
911
|
-
predict:
|
|
912
|
-
askQuestion:
|
|
945
|
+
analyze: d,
|
|
946
|
+
getDescriptiveStats: A,
|
|
947
|
+
detectAnomalies: _,
|
|
948
|
+
performClustering: x,
|
|
949
|
+
predict: T,
|
|
950
|
+
askQuestion: z,
|
|
913
951
|
generateSummary: N,
|
|
914
|
-
clearHistory:
|
|
915
|
-
extractFromDOM:
|
|
916
|
-
loadFromVueGrid:
|
|
917
|
-
updateConfig:
|
|
918
|
-
initializeQA:
|
|
919
|
-
setData:
|
|
920
|
-
reset:
|
|
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
|
|
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
|
-
},
|
|
964
|
+
}, ve = {
|
|
927
965
|
key: 0,
|
|
928
966
|
class: "ti-hint"
|
|
929
|
-
},
|
|
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(
|
|
942
|
-
const t =
|
|
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
|
|
984
|
+
function o(r) {
|
|
947
985
|
}
|
|
948
|
-
return (
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
"onUpdate:modelValue":
|
|
952
|
-
placeholder:
|
|
953
|
-
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: "
|
|
993
|
+
rows: "1",
|
|
956
994
|
onKeydown: [
|
|
957
|
-
|
|
958
|
-
|
|
995
|
+
L(H(a, ["exact", "prevent"]), ["enter"]),
|
|
996
|
+
L(H(o, ["shift"]), ["enter"])
|
|
959
997
|
]
|
|
960
998
|
}, null, 40, pe), [
|
|
961
|
-
[
|
|
999
|
+
[te, s.value]
|
|
962
1000
|
]),
|
|
963
|
-
|
|
964
|
-
disabled:
|
|
1001
|
+
h("button", {
|
|
1002
|
+
disabled: r.disabled || !s.value.trim(),
|
|
965
1003
|
class: "ti-submit-btn",
|
|
966
1004
|
onClick: a
|
|
967
1005
|
}, [
|
|
968
|
-
|
|
969
|
-
], 8,
|
|
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
|
-
|
|
1009
|
+
r.showHint ? (g(), p("div", ve, k(r.hint), 1)) : q("", !0)
|
|
972
1010
|
]));
|
|
973
1011
|
}
|
|
974
|
-
}),
|
|
975
|
-
const t =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
1020
|
+
}, qe = {
|
|
983
1021
|
key: 1,
|
|
984
1022
|
class: "ti-reason"
|
|
985
|
-
},
|
|
1023
|
+
}, Te = {
|
|
986
1024
|
key: 2,
|
|
987
1025
|
class: "ti-supporting-data"
|
|
988
|
-
},
|
|
1026
|
+
}, Ie = {
|
|
989
1027
|
key: 0,
|
|
990
1028
|
class: "ti-supporting-content"
|
|
991
|
-
},
|
|
1029
|
+
}, Pe = {
|
|
992
1030
|
key: 0,
|
|
993
1031
|
class: "ti-aggregates"
|
|
994
|
-
},
|
|
1032
|
+
}, Me = {
|
|
995
1033
|
key: 1,
|
|
996
1034
|
class: "ti-rows"
|
|
997
|
-
}, Ne = { class: "ti-table-wrapper" },
|
|
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(
|
|
1003
|
-
const e =
|
|
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) => (
|
|
1008
|
-
class:
|
|
1045
|
+
return (n, s) => (g(), p("div", {
|
|
1046
|
+
class: ne(["ti-answer-display", { "ti-cannot-answer": n.answer.cannotAnswer }])
|
|
1009
1047
|
}, [
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
n.answer.cannotAnswer ? (
|
|
1048
|
+
h("div", Ae, [
|
|
1049
|
+
h("div", $e, [
|
|
1050
|
+
n.answer.cannotAnswer ? (g(), p("span", ke, "⚠️")) : (g(), p("span", Ce, "💡"))
|
|
1013
1051
|
]),
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
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
|
-
|
|
1020
|
-
n.answer.isApproximate ? (
|
|
1021
|
-
n.answer.reason && n.answer.cannotAnswer ? (
|
|
1022
|
-
s[1] || (s[1] =
|
|
1023
|
-
|
|
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 ? (
|
|
1026
|
-
|
|
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
|
-
},
|
|
1030
|
-
e.value ? (
|
|
1031
|
-
n.answer.supportingData.aggregates ? (
|
|
1032
|
-
s[2] || (s[2] =
|
|
1033
|
-
|
|
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 ? (
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
(
|
|
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
|
-
|
|
1045
|
-
(
|
|
1046
|
-
(
|
|
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
|
-
}),
|
|
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
|
-
},
|
|
1097
|
+
}, Ue = {
|
|
1060
1098
|
key: 1,
|
|
1061
1099
|
class: "ti-history-list"
|
|
1062
|
-
},
|
|
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
|
-
},
|
|
1103
|
+
}, Ke = /* @__PURE__ */ U({
|
|
1066
1104
|
__name: "QuestionHistory",
|
|
1067
1105
|
props: {
|
|
1068
1106
|
questions: {}
|
|
1069
1107
|
},
|
|
1070
1108
|
emits: ["clear", "select"],
|
|
1071
|
-
setup(
|
|
1072
|
-
const t =
|
|
1109
|
+
setup(i, { emit: e }) {
|
|
1110
|
+
const t = i, n = ae(() => [...t.questions].reverse());
|
|
1073
1111
|
function s(a) {
|
|
1074
|
-
const
|
|
1075
|
-
return l < 1 ? "Just now" : l < 60 ? `${l}m 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,
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
a.questions.length > 0 ? (
|
|
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:
|
|
1121
|
+
onClick: o[0] || (o[0] = (r) => a.$emit("clear"))
|
|
1084
1122
|
}, " Clear History ")) : q("", !0)
|
|
1085
1123
|
]),
|
|
1086
|
-
a.questions.length === 0 ? (
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
]))) : (
|
|
1091
|
-
(
|
|
1092
|
-
key:
|
|
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",
|
|
1132
|
+
onClick: (l) => a.$emit("select", r)
|
|
1095
1133
|
}, [
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
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
|
-
|
|
1101
|
-
|
|
1102
|
-
], 8,
|
|
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
|
-
}),
|
|
1144
|
+
}), et = /* @__PURE__ */ V(Ke, [["__scopeId", "data-v-c66393d9"]]);
|
|
1107
1145
|
export {
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
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
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
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
|