untrap-mcp 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +0 -0
- package/dist/tools/ai/explain-experience.d.ts.map +1 -1
- package/dist/tools/ai/explain-experience.js +8 -5
- package/dist/tools/ai/explain-experience.js.map +1 -1
- package/dist/tools/ai/root-causes.d.ts.map +1 -1
- package/dist/tools/ai/root-causes.js +4 -1
- package/dist/tools/ai/root-causes.js.map +1 -1
- package/dist/tools/ai/similar-tickets.d.ts.map +1 -1
- package/dist/tools/ai/similar-tickets.js +4 -0
- package/dist/tools/ai/similar-tickets.js.map +1 -1
- package/dist/tools/ai/suggest-improvement.d.ts.map +1 -1
- package/dist/tools/ai/suggest-improvement.js +4 -1
- package/dist/tools/ai/suggest-improvement.js.map +1 -1
- package/dist/tools/cfo/agreement-analysis.d.ts.map +1 -1
- package/dist/tools/cfo/agreement-analysis.js +4 -1
- package/dist/tools/cfo/agreement-analysis.js.map +1 -1
- package/dist/tools/composite/ticket-deep-dive.d.ts.map +1 -1
- package/dist/tools/composite/ticket-deep-dive.js +5 -4
- package/dist/tools/composite/ticket-deep-dive.js.map +1 -1
- package/dist/tools/qbr/top-issues.d.ts.map +1 -1
- package/dist/tools/qbr/top-issues.js +8 -5
- package/dist/tools/qbr/top-issues.js.map +1 -1
- package/dist/tools/query/data-query.d.ts.map +1 -1
- package/dist/tools/query/data-query.js +48 -1
- package/dist/tools/query/data-query.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-experience.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-experience.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explain-experience.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-experience.ts"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,gBA6EzB"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
2
|
import { chatCompletion } from "../../db/azure-openai.js";
|
|
3
|
+
import { getFilters, buildTicketFilter } from "../../db/filters.js";
|
|
3
4
|
export async function explainExperienceScore(mspId, params) {
|
|
5
|
+
const filters = await getFilters(mspId);
|
|
6
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
4
7
|
const [metrics, sentiment, slaBreaches] = await Promise.all([
|
|
5
8
|
queryRLS(`SELECT company_name, ticket_count, avg_response_minutes, avg_resolution_minutes,
|
|
6
9
|
avg_sentiment_score, health_score, total_cost, sla_breach_count
|
|
@@ -15,13 +18,13 @@ export async function explainExperienceScore(mspId, params) {
|
|
|
15
18
|
FROM ticket_notes_sentiment tns
|
|
16
19
|
JOIN ticket_lifecycle tl ON tl.msp_id = tns.msp_id AND tl.ticket_id = tns.ticket_id
|
|
17
20
|
WHERE tns.msp_id = $1 AND LOWER(tl.company_name) = LOWER($2)
|
|
18
|
-
AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days'`, [mspId, params.clientName], mspId),
|
|
21
|
+
AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days' ${tf}`, [mspId, params.clientName], mspId),
|
|
19
22
|
queryRLS(`SELECT COUNT(*)::int as breach_count,
|
|
20
23
|
AVG(resolution_minutes)::numeric as avg_breach_resolution_min
|
|
21
|
-
FROM ticket_lifecycle
|
|
22
|
-
WHERE msp_id = $1 AND LOWER(company_name) = LOWER($2)
|
|
23
|
-
AND sla_status = 'breached'
|
|
24
|
-
AND responded_date >= CURRENT_DATE - INTERVAL '90 days'`, [mspId, params.clientName], mspId),
|
|
24
|
+
FROM ticket_lifecycle tl
|
|
25
|
+
WHERE tl.msp_id = $1 AND LOWER(tl.company_name) = LOWER($2)
|
|
26
|
+
AND tl.sla_status = 'breached'
|
|
27
|
+
AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days' ${tf}`, [mspId, params.clientName], mspId),
|
|
25
28
|
]);
|
|
26
29
|
if (metrics.length === 0) {
|
|
27
30
|
return { found: false, message: `No data found for client "${params.clientName}"` };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-experience.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-experience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"explain-experience.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-experience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAa,EACb,MAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5F,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1D,QAAQ,CACN;;;;;;eAMS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAC1B,KAAK,CACN;QACD,QAAQ,CACN;;;;;;sEAMgE,EAAE,EAAE,EACpE,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAC1B,KAAK,CACN;QACD,QAAQ,CACN;;;;;sEAKgE,EAAE,EAAE,EACpE,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAC1B,KAAK,CACN;KACF,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,6BAA6B,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACtF,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,sTAAsT;aAChU;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,WAAW,MAAM,CAAC,UAAU;gBAC7B,CAAC,CAAC,YAAY;iBACb,CAAC,CAAC,YAAY;gBACf,CAAC,CAAC,oBAAoB;kBACpB,CAAC,CAAC,sBAAsB;iBACzB,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,cAAc,oBAAoB,CAAC,CAAC,WAAW;gBACtE,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC,yBAAyB;eACnD,CAAC,CAAC,UAAU;;8DAEmC;aACvD;SACF;QACD,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-causes.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/root-causes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"root-causes.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/root-causes.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe;;;;;;;;;;;;;GAiExB"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
2
|
import { chatCompletion } from "../../db/azure-openai.js";
|
|
3
|
+
import { getFilters, buildCompanyExclusionFilter } from "../../db/filters.js";
|
|
3
4
|
export async function analyzeRootCauses(mspId, params) {
|
|
4
5
|
const fromDate = params.fromDate ?? new Date(Date.now() - 90 * 86400000).toISOString().split("T")[0];
|
|
5
6
|
const toDate = params.toDate ?? new Date().toISOString().split("T")[0];
|
|
7
|
+
const filters = await getFilters(mspId);
|
|
8
|
+
const cf = buildCompanyExclusionFilter(filters, { tableAlias: "rc" });
|
|
6
9
|
let categoryFilter = "";
|
|
7
10
|
const queryParams = [mspId];
|
|
8
11
|
if (params.category) {
|
|
@@ -14,7 +17,7 @@ export async function analyzeRootCauses(mspId, params) {
|
|
|
14
17
|
FROM root_cause_ticket_classifier rc
|
|
15
18
|
WHERE rc.msp_id = $1
|
|
16
19
|
AND rc.root_cause_category IS NOT NULL
|
|
17
|
-
${categoryFilter}
|
|
20
|
+
${categoryFilter} ${cf}
|
|
18
21
|
GROUP BY rc.root_cause_category
|
|
19
22
|
ORDER BY count DESC
|
|
20
23
|
LIMIT 15`, queryParams, mspId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-causes.js","sourceRoot":"","sources":["../../../src/tools/ai/root-causes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"root-causes.js","sourceRoot":"","sources":["../../../src/tools/ai/root-causes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"similar-tickets.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/similar-tickets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"similar-tickets.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/similar-tickets.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa;;;;;;;;;;;;;;GA6DtB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
|
+
import { getFilters, buildTicketFilter } from "../../db/filters.js";
|
|
2
3
|
export async function findSimilarTickets(mspId, params) {
|
|
3
4
|
const limit = params.limit ?? 5;
|
|
4
5
|
// Get the source ticket's embedding
|
|
@@ -12,6 +13,8 @@ export async function findSimilarTickets(mspId, params) {
|
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
15
|
// Find similar tickets using cosine similarity on problem_embedding
|
|
16
|
+
const filters = await getFilters(mspId);
|
|
17
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl" });
|
|
15
18
|
const similar = await queryRLS(`SELECT te.ticket_id,
|
|
16
19
|
1 - (te.problem_embedding <=> (
|
|
17
20
|
SELECT problem_embedding FROM ticket_embeddings
|
|
@@ -29,6 +32,7 @@ export async function findSimilarTickets(mspId, params) {
|
|
|
29
32
|
WHERE te.msp_id = $1
|
|
30
33
|
AND te.ticket_id != $2
|
|
31
34
|
AND te.problem_embedding IS NOT NULL
|
|
35
|
+
${tf}
|
|
32
36
|
ORDER BY te.problem_embedding <=> (
|
|
33
37
|
SELECT problem_embedding FROM ticket_embeddings
|
|
34
38
|
WHERE msp_id = $1 AND ticket_id = $2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"similar-tickets.js","sourceRoot":"","sources":["../../../src/tools/ai/similar-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"similar-tickets.js","sourceRoot":"","sources":["../../../src/tools/ai/similar-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,MAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEhC,oCAAoC;IACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;;0CAEsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACxD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,kCAAkC,MAAM,CAAC,QAAQ,kEAAkE;SAC7H,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B;;;;;;;;;;;;;;;;;SAiBK,EAAE;;;;;cAKG,EACV,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC/B,KAAK,CACN,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,IAAI;QACX,aAAa,EAAE,MAAM,CAAC,QAAQ;QAC9B,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;QACpC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,GAAG,CAAC;YACJ,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;SACvE,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-improvement.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/suggest-improvement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"suggest-improvement.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/suggest-improvement.ts"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,gBA0FtB"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
2
|
import { chatCompletion } from "../../db/azure-openai.js";
|
|
3
|
+
import { getFilters, buildTicketFilter } from "../../db/filters.js";
|
|
3
4
|
export async function suggestTechnicianImprovement(mspId, params) {
|
|
5
|
+
const filters = await getFilters(mspId);
|
|
6
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
4
7
|
const [dqScore, recentNotes, profile] = await Promise.all([
|
|
5
8
|
queryRLS(`SELECT technician_name, quality_points, completeness_points,
|
|
6
9
|
accuracy_points, timeliness_points, detail_quality_points,
|
|
@@ -13,7 +16,7 @@ export async function suggestTechnicianImprovement(mspId, params) {
|
|
|
13
16
|
FROM ticket_notes_sentiment tns
|
|
14
17
|
JOIN ticket_lifecycle tl ON tl.msp_id = tns.msp_id AND tl.ticket_id = tns.ticket_id
|
|
15
18
|
WHERE tns.msp_id = $1 AND LOWER(tl.owner_name) = LOWER($2)
|
|
16
|
-
AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days'
|
|
19
|
+
AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days' ${tf}
|
|
17
20
|
ORDER BY tns.created_at DESC
|
|
18
21
|
LIMIT 5`, [mspId, params.technicianName], mspId),
|
|
19
22
|
queryRLS(`SELECT technician_name, level, hourly_rate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-improvement.js","sourceRoot":"","sources":["../../../src/tools/ai/suggest-improvement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest-improvement.js","sourceRoot":"","sources":["../../../src/tools/ai/suggest-improvement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMpE,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAa,EACb,MAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5F,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,QAAQ,CACN;;;;;;eAMS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,EAC9B,KAAK,CACN;QACD,QAAQ,CACN;;;;sEAIgE,EAAE;;eAEzD,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,EAC9B,KAAK,CACN;QACD,QAAQ,CACN;;;eAGS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,EAC9B,KAAK,CACN;KACF,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,4BAA4B,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC;IACzF,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,WAAW,GAAG,WAAW;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAO,CAAC,CAAC,IAAe,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,eAAe,GAAG,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,kYAAkY;aAC5Y;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,eAAe,EAAE,CAAC,eAAe,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;YAChF,EAAE,CAAC,cAAc;kBACX,EAAE,CAAC,mBAAmB;cAC1B,EAAE,CAAC,eAAe;gBAChB,EAAE,CAAC,iBAAiB;oBAChB,EAAE,CAAC,qBAAqB;WACjC,EAAE,CAAC,cAAc,YAAY,EAAE,CAAC,WAAW,iBAAiB,EAAE,CAAC,eAAe;;;EAGvF,WAAW,IAAI,2BAA2B;;4CAEA;aACrC;SACF;QACD,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO;YACL,KAAK,EAAE,IAAI;YACX,aAAa,EAAE,EAAE,CAAC,cAAc;YAChC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;YAChC,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,IAAI;YACX,aAAa,EAAE,EAAE,CAAC,cAAc;YAChC,WAAW,EAAE,MAAM,CAAC,OAAO;YAC3B,SAAS,EAAE,EAAE;YACb,iBAAiB,EAAE,EAAE;SACtB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agreement-analysis.d.ts","sourceRoot":"","sources":["../../../src/tools/cfo/agreement-analysis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agreement-analysis.d.ts","sourceRoot":"","sources":["../../../src/tools/cfo/agreement-analysis.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;GAyEvD"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
|
+
import { getFilters, buildTimeEntriesFilter } from "../../db/filters.js";
|
|
2
3
|
export async function cfoAgreementAnalysis(mspId) {
|
|
4
|
+
const filters = await getFilters(mspId);
|
|
5
|
+
const tef = buildTimeEntriesFilter(filters);
|
|
3
6
|
// Agreement type breakdown
|
|
4
7
|
const byType = await queryRLS(`SELECT type_name,
|
|
5
8
|
COUNT(*)::int as total,
|
|
@@ -20,7 +23,7 @@ export async function cfoAgreementAnalysis(mspId) {
|
|
|
20
23
|
WHERE te.msp_id = $1
|
|
21
24
|
AND te.time_start >= CURRENT_DATE - INTERVAL '90 days'
|
|
22
25
|
AND ca.id IS NULL
|
|
23
|
-
AND te.company IS NOT NULL
|
|
26
|
+
AND te.company IS NOT NULL ${tef}
|
|
24
27
|
GROUP BY te.company
|
|
25
28
|
HAVING SUM(te.actual_hours) > 1
|
|
26
29
|
ORDER BY cost_last_90d DESC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agreement-analysis.js","sourceRoot":"","sources":["../../../src/tools/cfo/agreement-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"agreement-analysis.js","sourceRoot":"","sources":["../../../src/tools/cfo/agreement-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAa;IACtD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;;;;;;;0BAOsB,EACtB,CAAC,KAAK,CAAC,EACP,KAAK,CACN,CAAC;IAEF,6DAA6D;IAC7D,MAAM,kBAAkB,GAAG,MAAM,QAAQ,CACvC;;;;;;;;;;oCAUgC,GAAG;;;;cAIzB,EACV,CAAC,KAAK,CAAC,EACP,KAAK,CACN,CAAC;IAEF,6CAA6C;IAC7C,IAAI,aAAa,GAA8B,EAAE,CAAC;IAClD,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,QAAQ,CAC5B;;;;;;;;;wDASkD,EAClD,CAAC,KAAK,CAAC,EACP,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1F,OAAO;QACL,eAAe,EAAE,MAAM;QACvB,OAAO,EAAE;YACP,uBAAuB,EAAE,WAAW;YACpC,oBAAoB,EAAE,MAAM,CAAC,MAAM;YACnC,yBAAyB,EAAE,kBAAkB,CAAC,MAAM;YACpD,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG;SAC1D;QACD,yBAAyB,EAAE,kBAAkB;QAC7C,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-deep-dive.d.ts","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAGA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ticket-deep-dive.d.ts","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAGA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;GAiF7B"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
|
-
import { getFilters, buildTicketFilter } from "../../db/filters.js";
|
|
2
|
+
import { getFilters, buildTicketFilter, buildTimeEntriesFilter } from "../../db/filters.js";
|
|
3
3
|
export async function getTicketDeepDive(mspId, params) {
|
|
4
4
|
const filters = await getFilters(mspId);
|
|
5
5
|
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
6
|
+
const tef = buildTimeEntriesFilter(filters);
|
|
6
7
|
const [ticket, aiSummary, timeEntries, sentiment, budget] = await Promise.all([
|
|
7
8
|
// Core ticket data — validate ticket belongs to allowed board
|
|
8
9
|
queryRLS(`SELECT tl.ticket_id, tl.company_name, tl.summary, tl.status, tl.priority_name,
|
|
@@ -22,9 +23,9 @@ export async function getTicketDeepDive(mspId, params) {
|
|
|
22
23
|
queryRLS(`SELECT member_name as technician, actual_hours, billable_hours,
|
|
23
24
|
hourly_rate, (actual_hours * COALESCE(hourly_rate, 0))::numeric as cost,
|
|
24
25
|
notes_text as description
|
|
25
|
-
FROM time_entries
|
|
26
|
-
WHERE msp_id = $1 AND ticket_id = $2
|
|
27
|
-
ORDER BY date_worked DESC`, [mspId, params.ticketId], mspId),
|
|
26
|
+
FROM time_entries te
|
|
27
|
+
WHERE te.msp_id = $1 AND te.ticket_id = $2 ${tef}
|
|
28
|
+
ORDER BY te.date_worked DESC`, [mspId, params.ticketId], mspId),
|
|
28
29
|
// Sentiment
|
|
29
30
|
queryRLS(`SELECT AVG(sentiment_score)::numeric as avg_sentiment,
|
|
30
31
|
COUNT(*)::int as note_count
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-deep-dive.js","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ticket-deep-dive.js","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,MAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,GACvD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,8DAA8D;QAC9D,QAAQ,CACN;;;;;;sDAM8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,cAAc;QACd,QAAQ,CACN;;;;8CAIsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,eAAe;QACf,QAAQ,CACN;;;;sDAI8C,GAAG;sCACnB,EAC9B,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,YAAY;QACZ,QAAQ,CACN;;;8CAGsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,gBAAgB;QAChB,QAAQ,CACN;;;iBAGS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEL,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,QAAQ,YAAY,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QACjC,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,WAAW,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC,YAAuB,IAAI,CAAC,CAAC,EACnD,CAAC,CACF;QACD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QAC/B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"top-issues.d.ts","sourceRoot":"","sources":["../../../src/tools/qbr/top-issues.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"top-issues.d.ts","sourceRoot":"","sources":["../../../src/tools/qbr/top-issues.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;;;;;GA+CxE"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
|
+
import { getFilters, buildCompanyExclusionFilter } from "../../db/filters.js";
|
|
2
3
|
export async function qbrTopIssues(mspId, params) {
|
|
4
|
+
const filters = await getFilters(mspId);
|
|
5
|
+
const cf = buildCompanyExclusionFilter(filters, { tableAlias: "rc" });
|
|
3
6
|
let patterns = [];
|
|
4
7
|
try {
|
|
5
8
|
patterns = await queryRLS(`SELECT pattern_name, ticket_count, affected_clients, root_cause_category
|
|
@@ -14,12 +17,12 @@ export async function qbrTopIssues(mspId, params) {
|
|
|
14
17
|
}
|
|
15
18
|
let rootCauses = [];
|
|
16
19
|
try {
|
|
17
|
-
rootCauses = await queryRLS(`SELECT root_cause_category as category,
|
|
20
|
+
rootCauses = await queryRLS(`SELECT rc.root_cause_category as category,
|
|
18
21
|
COUNT(*)::int as count
|
|
19
|
-
FROM root_cause_ticket_classifier
|
|
20
|
-
WHERE msp_id = $1
|
|
21
|
-
AND root_cause_category IS NOT NULL
|
|
22
|
-
GROUP BY root_cause_category
|
|
22
|
+
FROM root_cause_ticket_classifier rc
|
|
23
|
+
WHERE rc.msp_id = $1
|
|
24
|
+
AND rc.root_cause_category IS NOT NULL ${cf}
|
|
25
|
+
GROUP BY rc.root_cause_category
|
|
23
26
|
ORDER BY count DESC
|
|
24
27
|
LIMIT 10`, [mspId], mspId);
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"top-issues.js","sourceRoot":"","sources":["../../../src/tools/qbr/top-issues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"top-issues.js","sourceRoot":"","sources":["../../../src/tools/qbr/top-issues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAO9E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,MAAuB;IACvE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,2BAA2B,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAI,QAAQ,GAA8B,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CACvB;;;;;gBAKU,EACV,CAAC,KAAK,CAAC,EACP,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;IAED,IAAI,UAAU,GAA8B,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CACzB;;;;kDAI4C,EAAE;;;gBAGpC,EACV,CAAC,KAAK,CAAC,EACP,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC;QACJ,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KAC9E,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,QAAQ;QACR,WAAW,EAAE,iBAAiB;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-query.d.ts","sourceRoot":"","sources":["../../../src/tools/query/data-query.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6HD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"data-query.d.ts","sourceRoot":"","sources":["../../../src/tools/query/data-query.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6HD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoIrE"}
|
|
@@ -154,10 +154,57 @@ export async function queryData(mspId, params) {
|
|
|
154
154
|
data: [],
|
|
155
155
|
};
|
|
156
156
|
}
|
|
157
|
+
// Hard-enforce user-configured filters by injecting them into the SQL.
|
|
158
|
+
// This is a post-processing guard — the LLM prompt asks for these filters,
|
|
159
|
+
// but we cannot trust prompt-only enforcement for security.
|
|
160
|
+
let finalSql = sql;
|
|
161
|
+
const sqlLower = sql.toLowerCase();
|
|
162
|
+
// Inject board filter if query references ticket_lifecycle and boards are configured
|
|
163
|
+
if (filters.boardNames.length > 0 && /\bticket_lifecycle\b/i.test(finalSql)) {
|
|
164
|
+
const boardList = filters.boardNames.map((b) => `'${b.replace(/'/g, "''")}'`).join(", ");
|
|
165
|
+
// Find the alias used for ticket_lifecycle
|
|
166
|
+
const aliasMatch = finalSql.match(/\bticket_lifecycle\s+(?:AS\s+)?(\w+)/i);
|
|
167
|
+
const alias = aliasMatch ? aliasMatch[1] : "ticket_lifecycle";
|
|
168
|
+
// Only inject if not already present
|
|
169
|
+
if (!sqlLower.includes("board_name in")) {
|
|
170
|
+
finalSql = finalSql.replace(/(\bWHERE\b)/i, `WHERE ${alias}.board_name IN (${boardList}) AND`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Inject technician filter if query references ticket_lifecycle or time_entries
|
|
174
|
+
if (filters.enabledTechnicians.length > 0) {
|
|
175
|
+
const techList = filters.enabledTechnicians.map((t) => `'${t.replace(/'/g, "''")}'`).join(", ");
|
|
176
|
+
if (/\bticket_lifecycle\b/i.test(finalSql) && !sqlLower.includes("owner_name in")) {
|
|
177
|
+
const aliasMatch = finalSql.match(/\bticket_lifecycle\s+(?:AS\s+)?(\w+)/i);
|
|
178
|
+
const alias = aliasMatch ? aliasMatch[1] : "ticket_lifecycle";
|
|
179
|
+
finalSql = finalSql.replace(/(\bWHERE\b)/i, `WHERE ${alias}.owner_name IN (${techList}) AND`);
|
|
180
|
+
}
|
|
181
|
+
if (/\btime_entries\b/i.test(finalSql) && !sqlLower.includes("member_name in")) {
|
|
182
|
+
const aliasMatch = finalSql.match(/\btime_entries\s+(?:AS\s+)?(\w+)/i);
|
|
183
|
+
const alias = aliasMatch ? aliasMatch[1] : "time_entries";
|
|
184
|
+
finalSql = finalSql.replace(/(\bWHERE\b)/i, `WHERE ${alias}.member_name IN (${techList}) AND`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Inject company exclusions
|
|
188
|
+
if (/\bticket_lifecycle\b/i.test(finalSql) && !sqlLower.includes("not like '%test%'")) {
|
|
189
|
+
const aliasMatch = finalSql.match(/\bticket_lifecycle\s+(?:AS\s+)?(\w+)/i);
|
|
190
|
+
const alias = aliasMatch ? aliasMatch[1] : "ticket_lifecycle";
|
|
191
|
+
let companyFilter = ` AND LOWER(${alias}.company_name) NOT LIKE '%test%' AND LOWER(${alias}.company_name) NOT LIKE '%catchall%'`;
|
|
192
|
+
if (filters.mspCompanyName) {
|
|
193
|
+
companyFilter += ` AND LOWER(${alias}.company_name) NOT LIKE LOWER('%${filters.mspCompanyName.replace(/'/g, "''")}%')`;
|
|
194
|
+
}
|
|
195
|
+
// Append before ORDER BY or LIMIT or end
|
|
196
|
+
const orderMatch = finalSql.match(/\b(ORDER\s+BY|LIMIT|GROUP\s+BY)\b/i);
|
|
197
|
+
if (orderMatch && orderMatch.index) {
|
|
198
|
+
finalSql = finalSql.substring(0, orderMatch.index) + companyFilter + " " + finalSql.substring(orderMatch.index);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
finalSql += companyFilter;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
157
204
|
// Execute the query — $1 is always the msp_id for tenant isolation
|
|
158
205
|
try {
|
|
159
206
|
const start = Date.now();
|
|
160
|
-
const rows = await queryRLS(
|
|
207
|
+
const rows = await queryRLS(finalSql, [mspId], mspId);
|
|
161
208
|
const executionTime = Date.now() - start;
|
|
162
209
|
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
163
210
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-query.js","sourceRoot":"","sources":["../../../src/tools/query/data-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDtB,CAAC;AAEF,uEAAuE;AACvE,MAAM,kBAAkB,GAAG;IACzB,kFAAkF;IAClF,oBAAoB,EAAE,8DAA8D;IACpF,QAAQ,EAAe,6CAA6C;IACpE,aAAa,EAAU,wBAAwB;IAC/C,qBAAqB,EAAE,uBAAuB;IAC9C,WAAW,EAAY,qBAAqB;IAC5C,eAAe,EAAQ,kBAAkB;IACzC,aAAa,EAAU,kBAAkB;IACzC,gBAAgB,EAAO,uBAAuB;IAC9C,uBAAuB,EAAE,gBAAgB;CAC1C,CAAC;AAEF,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,iCAAiC;IACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IACzE,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACxF,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,yBAAyB;IACnF,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC;IAC5E,CAAC;IAED,sEAAsE;IACtE,2DAA2D;IAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;IAChG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAErB,8BAA8B;IAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5F,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,6BAA6B;IAC7B,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEpC,2BAA2B;IAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,GAAG,IAAI,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,MAAuB;IACpE,6CAA6C;IAC7C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAExC,yCAAyC;IACzC,IAAI,aAAa,GAAG,0DAA0D,CAAC;IAC/E,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,aAAa,IAAI,6DAA6D,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrI,CAAC;IACD,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,aAAa,IAAI,iGAAiG,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjL,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,aAAa,IAAI,0CAA0C,OAAO,CAAC,cAAc,+CAA+C,CAAC;IACnI,CAAC;SAAM,CAAC;QACN,aAAa,IAAI,0DAA0D,CAAC;IAC9E,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mIAAmI,cAAc,KAAK,aAAa,EAAE;aAC/K;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,MAAM,CAAC,QAAQ;aACzB;SACF;QACD,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAErC,4BAA4B;IAC5B,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2CAA2C,UAAU,CAAC,KAAK,EAAE;YACpE,GAAG;YACH,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAA0B,
|
|
1
|
+
{"version":3,"file":"data-query.js","sourceRoot":"","sources":["../../../src/tools/query/data-query.ts"],"names":[],"mappings":"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"}
|