untrap-mcp 0.2.4 → 0.2.6
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/db/filters.d.ts.map +1 -1
- package/dist/db/filters.js +5 -4
- package/dist/db/filters.js.map +1 -1
- package/dist/middleware/logging.js +1 -1
- package/dist/tools/ai/explain-budget.d.ts.map +1 -1
- package/dist/tools/ai/explain-budget.js +7 -4
- package/dist/tools/ai/explain-budget.js.map +1 -1
- package/dist/tools/ai/explain-sla.d.ts.map +1 -1
- package/dist/tools/ai/explain-sla.js +8 -5
- package/dist/tools/ai/explain-sla.js.map +1 -1
- package/dist/tools/composite/ticket-deep-dive.d.ts.map +1 -1
- package/dist/tools/composite/ticket-deep-dive.js +11 -8
- package/dist/tools/composite/ticket-deep-dive.js.map +1 -1
- package/dist/tools/qbr/recommendations.d.ts.map +1 -1
- package/dist/tools/qbr/recommendations.js +7 -4
- package/dist/tools/qbr/recommendations.js.map +1 -1
- package/package.json +1 -1
package/dist/db/filters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/db/filters.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/db/filters.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+BnE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EACnB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC/B,GACL,MAAM,CAsCR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,UAAU,EACnB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC9B,GACL,MAAM,CAaR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,UAAU,EACnB,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,CAYR"}
|
package/dist/db/filters.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { queryRLS } from "./gateway-client.js";
|
|
2
|
-
//
|
|
2
|
+
// Cache with 30-minute TTL so filter changes take effect without restart
|
|
3
|
+
const CACHE_TTL_MS = 30 * 60 * 1000;
|
|
3
4
|
const filterCache = new Map();
|
|
4
5
|
/**
|
|
5
6
|
* Fetch and cache the user-configured filters for an MSP.
|
|
@@ -7,8 +8,8 @@ const filterCache = new Map();
|
|
|
7
8
|
*/
|
|
8
9
|
export async function getFilters(mspId) {
|
|
9
10
|
const cached = filterCache.get(mspId);
|
|
10
|
-
if (cached)
|
|
11
|
-
return cached;
|
|
11
|
+
if (cached && cached.expires > Date.now())
|
|
12
|
+
return cached.filters;
|
|
12
13
|
// Fetch all three configs in parallel
|
|
13
14
|
const [boardRows, techRows, mspRows] = await Promise.all([
|
|
14
15
|
queryRLS(`SELECT board_name FROM msp_board_names WHERE msp_id = $1`, [mspId], mspId),
|
|
@@ -20,7 +21,7 @@ export async function getFilters(mspId) {
|
|
|
20
21
|
enabledTechnicians: techRows.map((r) => r.technician_name),
|
|
21
22
|
mspCompanyName: mspRows[0]?.name || "",
|
|
22
23
|
};
|
|
23
|
-
filterCache.set(mspId, filters);
|
|
24
|
+
filterCache.set(mspId, { filters, expires: Date.now() + CACHE_TTL_MS });
|
|
24
25
|
return filters;
|
|
25
26
|
}
|
|
26
27
|
function escapeSQL(val) {
|
package/dist/db/filters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/db/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY/C,
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/db/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { queryWrite } from "../db/gateway-client.js";
|
|
2
2
|
export async function logToolCall(log) {
|
|
3
3
|
try {
|
|
4
|
-
await queryWrite(`INSERT INTO
|
|
4
|
+
await queryWrite(`INSERT INTO mcp_tool_call_log (msp_id, tool_name, parameters, response_summary, duration_ms, status, error_message)
|
|
5
5
|
VALUES ($1, $2, $3, $4, $5, $6, $7)`, [
|
|
6
6
|
log.mspId,
|
|
7
7
|
log.toolName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-budget.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-budget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explain-budget.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-budget.ts"],"names":[],"mappings":"AAIA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB;;;GAwF5B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
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 explainBudgetOverage(mspId, params) {
|
|
4
5
|
// Check cache first
|
|
5
6
|
const cached = await queryRLS(`SELECT explanation FROM ticket_budget_overage_explanation
|
|
@@ -8,11 +9,13 @@ export async function explainBudgetOverage(mspId, params) {
|
|
|
8
9
|
return { explanation: cached[0].explanation, cached: true };
|
|
9
10
|
}
|
|
10
11
|
// Gather context
|
|
12
|
+
const filters = await getFilters(mspId);
|
|
13
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
11
14
|
const [ticket, budget, notes] = await Promise.all([
|
|
12
|
-
queryRLS(`SELECT ticket_id, summary, priority_name, owner_name, company_name,
|
|
13
|
-
resolution_minutes
|
|
14
|
-
FROM ticket_lifecycle
|
|
15
|
-
WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
|
|
15
|
+
queryRLS(`SELECT tl.ticket_id, tl.summary, tl.priority_name, tl.owner_name, tl.company_name,
|
|
16
|
+
tl.resolution_minutes
|
|
17
|
+
FROM ticket_lifecycle tl
|
|
18
|
+
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
16
19
|
queryRLS(`SELECT budget_hours, actual_hours, hours_over_budget, pct_over_budget,
|
|
17
20
|
member_name
|
|
18
21
|
FROM analytics.technician_ticket_budget_mv
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-budget.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"explain-budget.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-sla.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explain-sla.d.ts","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.ts"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB;;;GAoEzB"}
|
|
@@ -1,12 +1,15 @@
|
|
|
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 explainSlaVariance(mspId, params) {
|
|
5
|
+
const filters = await getFilters(mspId);
|
|
6
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
4
7
|
const [ticket, timeEntries] = await Promise.all([
|
|
5
|
-
queryRLS(`SELECT ticket_id, summary, priority_name, owner_name, company_name,
|
|
6
|
-
board_name, status, response_minutes, resolution_minutes,
|
|
7
|
-
sla_status, entered_date::text, responded_date::text, closed_date::text
|
|
8
|
-
FROM ticket_lifecycle
|
|
9
|
-
WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
|
|
8
|
+
queryRLS(`SELECT tl.ticket_id, tl.summary, tl.priority_name, tl.owner_name, tl.company_name,
|
|
9
|
+
tl.board_name, tl.status, tl.response_minutes, tl.resolution_minutes,
|
|
10
|
+
tl.sla_status, tl.entered_date::text, tl.responded_date::text, tl.closed_date::text
|
|
11
|
+
FROM ticket_lifecycle tl
|
|
12
|
+
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
10
13
|
queryRLS(`SELECT member_name, actual_hours, date_worked::text, notes_text
|
|
11
14
|
FROM time_entries
|
|
12
15
|
WHERE msp_id = $1 AND ticket_id = $2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-sla.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"explain-sla.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.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,kBAAkB,CACtC,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,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,QAAQ,CACN;;;;oDAI8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QACD,QAAQ,CACN;;;gCAG0B,EAC1B,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,OAAO,GAAG,WAAW;SACxB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,YAAY,QAAS,EAAE,CAAC,UAAqB,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;SACzI,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,wNAAwN;aAClO;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,OAAO;YAC1C,CAAC,CAAC,aAAa,aAAa,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,UAAU;UAC5D,CAAC,CAAC,YAAY,YAAY,CAAC,CAAC,UAAU;WACrC,CAAC,CAAC,YAAY,gBAAgB,CAAC,CAAC,cAAc,aAAa,CAAC,CAAC,WAAW;iBAClE,CAAC,CAAC,gBAAgB,0BAA0B,CAAC,CAAC,kBAAkB;cACnE,CAAC,CAAC,UAAU;;;EAGxB,OAAO,IAAI,iBAAiB;;8BAEA;aACvB;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,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO;YACjD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-deep-dive.d.ts","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"
|
|
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;;;;;;;;;;;;;;;;;;GAgF7B"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { queryRLS } from "../../db/gateway-client.js";
|
|
2
|
+
import { getFilters, buildTicketFilter } from "../../db/filters.js";
|
|
2
3
|
export async function getTicketDeepDive(mspId, params) {
|
|
4
|
+
const filters = await getFilters(mspId);
|
|
5
|
+
const tf = buildTicketFilter(filters, { tableAlias: "tl", includeTechnicianFilter: false });
|
|
3
6
|
const [ticket, aiSummary, timeEntries, sentiment, budget] = await Promise.all([
|
|
4
|
-
// Core ticket data
|
|
5
|
-
queryRLS(`SELECT ticket_id, company_name, summary, status, priority_name,
|
|
6
|
-
owner_name, board_name, agreement_type,
|
|
7
|
-
entered_date::text, responded_date::text, closed_date::text,
|
|
8
|
-
resolution_minutes, response_minutes, is_closed, is_resolved,
|
|
9
|
-
sla_status
|
|
10
|
-
FROM ticket_lifecycle
|
|
11
|
-
WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
|
|
7
|
+
// Core ticket data — validate ticket belongs to allowed board
|
|
8
|
+
queryRLS(`SELECT tl.ticket_id, tl.company_name, tl.summary, tl.status, tl.priority_name,
|
|
9
|
+
tl.owner_name, tl.board_name, tl.agreement_type,
|
|
10
|
+
tl.entered_date::text, tl.responded_date::text, tl.closed_date::text,
|
|
11
|
+
tl.resolution_minutes, tl.response_minutes, tl.is_closed, tl.is_resolved,
|
|
12
|
+
tl.sla_status
|
|
13
|
+
FROM ticket_lifecycle tl
|
|
14
|
+
WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
|
|
12
15
|
// AI analysis
|
|
13
16
|
queryRLS(`SELECT problem_statement as problem_summary, ai_summary,
|
|
14
17
|
ticket_classification, root_cause as root_cause_analysis,
|
|
@@ -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;
|
|
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;AAMpE,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;IAE5F,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;;;;;mCAK2B,EAC3B,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":"recommendations.d.ts","sourceRoot":"","sources":["../../../src/tools/qbr/recommendations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../../src/tools/qbr/recommendations.ts"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,gBAqGpF"}
|
|
@@ -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, buildCompanyExclusionFilter } from "../../db/filters.js";
|
|
3
4
|
export async function qbrRecommendations(mspId, params) {
|
|
5
|
+
const filters = await getFilters(mspId);
|
|
6
|
+
const cf = buildCompanyExclusionFilter(filters, { tableAlias: "bc" });
|
|
4
7
|
// Gather key signals across all areas
|
|
5
8
|
const [health, sla, patterns, billing, techPerf] = await Promise.all([
|
|
6
9
|
queryRLS(`SELECT COUNT(*)::int as total,
|
|
@@ -23,10 +26,10 @@ export async function qbrRecommendations(mspId, params) {
|
|
|
23
26
|
LIMIT 3`, [mspId], mspId),
|
|
24
27
|
queryRLS(`SELECT COUNT(DISTINCT ticket_id)::int as tickets,
|
|
25
28
|
COALESCE(SUM(billable_amount), 0)::numeric as dollars
|
|
26
|
-
FROM agents.billing_classifications
|
|
27
|
-
WHERE msp_id::uuid = $1::uuid
|
|
28
|
-
AND classification = 'out_of_scope' AND billable_amount > 0
|
|
29
|
-
AND resolved_date >= $2::date AND resolved_date <= $3::date`, [mspId, params.fromDate, params.toDate], mspId),
|
|
29
|
+
FROM agents.billing_classifications bc
|
|
30
|
+
WHERE bc.msp_id::uuid = $1::uuid
|
|
31
|
+
AND bc.classification = 'out_of_scope' AND bc.billable_amount > 0
|
|
32
|
+
AND bc.resolved_date >= $2::date AND bc.resolved_date <= $3::date ${cf}`, [mspId, params.fromDate, params.toDate], mspId),
|
|
30
33
|
queryRLS(`SELECT technician_name, AVG(quality_points)::numeric as avg_dq
|
|
31
34
|
FROM analytics.technician_dq_leaderboard_daily
|
|
32
35
|
WHERE msp_id = $1 AND calculation_date >= $2::date AND calculation_date <= $3::date
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../src/tools/qbr/recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../src/tools/qbr/recommendations.ts"],"names":[],"mappings":"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"}
|